【问题标题】:Doubly Linked List: Deleting all occurrences of a given key双向链表:删除给定键的所有出现
【发布时间】:2018-07-30 13:54:48
【问题描述】:
#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) 空列表,2) 单项列表,3) 有/没有重复项的双项列表,等等。
  • key 为 20 时,试图删除列表中的第一个条目,可能未定义 pred 的值,这可以解释 seg 错误。也从未使用过 *succ。

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


【解决方案1】:

两个问题:

  • 当您进行此检查时:

    if(temp->rlink!=NULL)
    

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

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

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

  • 同样,当你到达:

    temp=pred->rlink;
    

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

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

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

【讨论】:

  • 我用标头初始化它,但我仍然遇到分段错误。
  • @Legendary:你读过我的全部答案了吗?我列出了需要修复的两件事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多