双链表:删除给定键的所有匹配项

时间:2018-07-30 13:54:48

标签: c linked-list doubly-linked-list

#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,则存在分段错误。

出什么问题了,我该如何解决?

1 个答案:

答案 0 :(得分:1)

两个问题:

  • 进行此检查时:

    if(temp->rlink!=NULL)
    

    temp可能是NULL(因为前面的while循环的停止条件为temp == NULL-当最后一个节点不匹配时)。

    取消引用NULL通常会导致分段错误。

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

  • 类似地,当您到达:

    temp=pred->rlink;
    

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

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

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