#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *rlink;
struct node *llink;
}NODE;
NODE* insert(NODE* header,int info)
{
NODE *new,*temp;
new=(NODE*)malloc(sizeof(NODE));
new->data=info;
new->rlink=NULL;
new->llink=NULL;
if(header->rlink==NULL)
{
header->rlink=new;
new->llink=header;
}
else
{
temp=header->rlink;
header->rlink=new;
new->llink=header;
new->rlink=temp;
temp->llink=new;
}
return header;
}
NODE* delete(NODE* header,int info)
{
NODE *temp,*pred,*succ;
temp=header->rlink;
while(temp!=NULL)
{
while(temp!=NULL&&(temp->data!=info))
{
pred=temp;
temp=temp->rlink;
}
if(temp->rlink!=NULL)
{
temp->rlink->llink=pred;
}
if(temp->llink!=NULL)
{
pred->rlink=temp->rlink;
}
free(temp);
temp=pred->rlink;
}
return header;
}
void main()
{
int ch,info;
NODE* header;
header=(NODE*)malloc(sizeof(NODE));
header->rlink=NULL;
header->llink=NULL;
........
只有当指定的键位于列表末尾时,删除功能才能正常工作。
假设输入列表是20 10 20 10,并且指定的关键字是10,则无缝地进行删除,但如果指定的关键字为20,则存在分段错误。
出了什么问题,我该如何解决?
两个问题:
-
当您进行此检查时:
if(temp->rlink!=NULL)
temp
可以是NULL
(因为前一个while
循环具有temp == NULL
-当最后一个节点不匹配时的停止条件(。取消引用
NULL
通常会导致分段故障。如果此时
temp
是NULL
,那么只需结束循环——您已经到达列表的末尾,但没有找到更多要删除的节点。 -
同样,当你到达:
temp=pred->rlink;
pred
可能未初始化(如果跳过了最里面的while
循环——当第一个节点匹配时(。取消引用未初始化的指针也可能导致分段错误。
为了避免这种情况,可以使用
header
初始化pred
。