求助,关于链表删除结点.
c语言吧
全部回复
仅看楼主
level 6
00XX吧 楼主
喂熊..
2011年05月27日 05点05分 1
level 6
00XX吧 楼主
/* 按键值查找结点函数,如果输入的键值不等于结点中的值,会弹错 */
#include "stdio.h"
#define node struct list
#define new (node *)malloc(sizeof(node))
node *newlist(int n);                                /* 建立链表函数 */
node *output(node *p);                               /* 输出链表   */
node *GET(node *head,int i);                         /* 查找序列 */
node *key(node *head,int i);                         /* 查找结点值 */
node *del(node *head,int i);                         /* 删除结点 */
node
{
     int data;
     node *next;
}
main()
{
     node *p,*head;
     int i,x,n;
     printf("要输入几组数据?");
     scanf("%d",&n);
     head=newlist(n);
     printf("数据如下:\n");
     p=head;
     output(p);
     printf("\n要查找第几个结点?");
     scanf("%d",&n);
     p=GET(head,n);
     if(p!=NULL) printf("结点数据%d\n",p->data);
     else printf("数据不存在!\n");
     printf("\n要查找哪个值?\n");
     scanf("%d",&n);
     p=key(head,n);
     if(p) printf("%d\n",p->data);
     else printf("数据不存在!\n");
     printf("输入要从结点中删除的数据:");
     scanf("%d",&n);
     head=del(head,n);
     output(head);
}
node *newlist(int n)                                 /* 建立链表函数定义   */
{
     int i;
     node *head,*p,*q;
     if(n<=0) head=NULL;
     else{
                 head=new;
                 p=head;

2011年05月27日 05点05分 2
level 6
00XX吧 楼主
                 scanf("%d",&head->data);
                 for(i=1;i<n;i++)
                 {
                     q=new;
                     p->next=q;
                     scanf("%d",&q->data);
                     p=q;
                 }
                 p->next=NULL;
                 p=head;
                 return p;
         }
}
node *output(node *p)                                /* 输出链表    */
{
     while(p)
     {
         printf("%d   ",p->data);
         p=p->next;
     }
}
node *GET(node *head,int i)                          /* 查找序列    */
{
     int j=1;
     node *p;
     p=head;
     while(p->next!=NULL&&j<i)
     {
         p=p->next;
         j++;
     }
     if(j==i) return p;
     else return NULL;
}
node *key(node *head,int i)                          /* 查找结点值   */
{
     node *p;
     if(head->data!=i)
     {
         for(p=head->next;p;)
         {
             if(p->data!=i) p=p->next;
             else break;
         }
         return p;
     }
     else return p;
}
/* 删除结点的问题,被删除的结点的上一个结点的next指向被删除结点的next还是被删除结点的next直接指向下一个结点?*/
node *del(node *head,int i)                         /* 删除结点 */
{
     node *p,*q;
     p=key(head,i);
     if((p!= NULL)&&(p->next!=NULL))
     {
         q=p->next;
         p->next=q->next;
         free(q);
         return head;
     }
     else printf("删除错误!\n");
}

2011年05月27日 05点05分 3
level 6
00XX吧 楼主
问题出在删除结点函数node *del()这儿,老是不理解删除结点的步骤,希望高手帮帮我..3Q
2011年05月27日 05点05分 4
1