#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,则存在分段错误。
出什么问题了,我该如何解决?
答案 0 :(得分:1)
两个问题:
进行此检查时:
if(temp->rlink!=NULL)
temp
可能是NULL
(因为前面的while
循环的停止条件为temp == NULL
-当最后一个节点不匹配时)。
取消引用NULL
通常会导致分段错误。
如果此时temp
是NULL
,只需结束循环-您已经到达列表的末尾而没有找到更多要删除的节点。
类似地,当您到达:
temp=pred->rlink;
pred
可能未初始化(如果最里面的while
循环被跳过-当第一个节点匹配时)。
取消引用未初始化的指针也会导致分段错误。
为避免这种情况,您可以使用pred
初始化header
。