#include<stdio.h>
typedef struct node
{
char name[20];
struct node*prior,*next;
}stud;
stud *create(int n)
{
stud *p,*h,*s;
int i;
h=(stud*)malloc(sizeof(stud));
h->name[0]='\0';
h->prior=NULL;
h->next=NULL;
p=h;
for(i=0;i<n;i++)
{
s=(stud*)malloc(sizeof(stud));
p->next=s;
printf("The number%d student:",i+1);
scanf("%s",s->name);
s->prior=p;
s->next=NULL;
p=s;
}
p->next=NULL;
return(h);
}
stud *search(stud*h,char*x)
{
stud *p;
char *y;
p=h->next;
while(p)
{
y=p->name;
if(strcmp(y,x)==0)
return(p);
else
p=p->next;
}
printf("Not Found!");
}
void del(stud *p)
{
p->next->prior=p->prior;
p->prior->next=p->next;
free(p);
}
main()
{
int num;
char sname[20];
stud *head,*sp;
printf("Please input the number of the list:\n");
scanf("%d",&num);
head = create(num);//创建双向链表
sp=head->next;
printf("This is my first list:\n");
while(sp)
{
printf("%s ",&*(sp->name));
sp=sp->next;
}
printf("\nTHE NAME YOU WANGT TO FIND:\n");
scanf("%s",sname);
sp = search(head,sname);
del(sp);//删除指定节点
printf("Now the list is:\n ");
sp=head->next;
while(sp)
{
printf("%s ",sp->name);
sp=sp->next;
}
getch();
}
程序是酱的,要求是创建一个双向链表,并插入数据,之后查找制定数据并删除。
这个程序编译起来是酱紫的:
程序是酱的,要求是创建一个双向链表,并插入数据,之后查找制定数据并删除。
这个程序编译起来是酱紫的:
运行起来是酱紫的:
当要查找的节点不是最后一个时,他是没有任何问题的,然而,不要被他善良的外表所欺骗,但你查找最后一个的时候……
问题坑定处在最后一个节点上,首先我就去找create的麻烦了,但是很明显他是无辜的(出身清白,课本栗子)。那就是del的错喽,来来,把del拖出来
</pre><pre name="code" class="cpp">void del(stud *p)
{
p->next->prior=p->prior;
p->prior->next=p->next;
free(p);
}
首先考虑第一个问题,空节点的问题。create很好的完成了任务,并没有创建空节点等偷工减料行为,也就是说p不是空节点。那问题在哪呢,看看下面这个图,你再看看del这段程序
如果p是最后一个节点,删除之后,那p的前驱结点的后继指针是不该有的,但是代码却是酱紫
p->prior->next=p->next;
所以会崩溃,其实只要将p置空就好了
void del(stud *p)
{
if(p->next!=NULL)
{
p->next->prior=p->prior;
p->prior->next=p->next;
free(p);
}
else
p->prior->next=NULL;
}
只要把del改成这样就不会有问题了
在本例中,链表是自己建的,不会有天多幺蛾子,但是如果是检查某个已有链表,那还得检查所要操作节点是不是NULL,这个下篇再写。