c-双链表:删除所有出现的给定键


#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通常会导致分段故障。

    如果此时tempNULL,那么只需结束循环——您已经到达列表的末尾,但没有找到更多要删除的节点。

  • 同样,当你到达:

    temp=pred->rlink;
    

    pred可能未初始化(如果跳过了最里面的while循环——当第一个节点匹配时(。

    取消引用未初始化的指针也可能导致分段错误。

    为了避免这种情况,可以使用header初始化pred

相关内容

  • 没有找到相关文章

最新更新