双重链表在中间插入

时间:2014-02-27 13:32:19

标签: c list

任何人都可以识别我的代码中发生的导致分段错误的内容吗?请修改/更正错误的部分。

void InsertAtMid (Node *head){

    int num,count=0,i;
    Node *ptr=head;
    Node *newnode=NULL;
    Node *newnode2=head;

    printf("Enter node to be inserted: ");
    scanf("%d", &num);

    if (head==NULL){
            newnode = head;
            newnode=(Node *)malloc(sizeof(Node));
            newnode->x=num;
            newnode->next=NULL;
            newnode->prev=NULL;
    } else {
            ptr=head->next;
            while(ptr->x!=(count/2)){
                ptr=ptr->next;
            }
            newnode->next=ptr->next;
            newnode->prev=ptr;
            ptr->next->prev=newnode;
            ptr->next=newnode;
    }
}

3 个答案:

答案 0 :(得分:1)

因此,基于我对您的代码的理解 - 以下应该[主要]工作:

void InsertAtMid (Node **head){
    int num = 0;
    int count = 0
    int advance = 0;
    Node *ptr = *head;
    Node *newnode = NULL;

    printf("Enter node to be inserted: ");
    scanf("%d", &num);

    if (*head == NULL) {
      *head = (Node *)malloc(sizeof(Node));
      ptr = *head;
      ptr->x = num;
      ptr->next = NULL;
      ptr->prev = NULL;
    } else {
      // *** Count the number of items
      ptr = *head;
      while (ptr != NULL) {
         ptr = ptr->next;
         count++;
      }

      // *** Move to the middle of the list
      ptr = *head;
      while (advance < (count/2)){
         ptr = ptr->next;
         advance++;
      }

      // *** Insert the new value
      newnode = (Node *)malloc(sizeof(Node));
      newnode->x = num;
      newnode->next = ptr->next;
      newnode->prev = ptr;
      ptr->next->prev = newnode;
      ptr->next = newnode;
   }
}

以下是我修复的问题:

  • 您在一个点上分配给head,但由于“head”未作为引用传入,因此该值不会在第一次调用该函数时保持。不用说,你需要一个指向node类型指针的指针。
  • 您从未计算过列表中的项目数。通常“head”指针会存储这些信息,并且在添加节点时会增加,但由于没有这个,唯一的方法就是遍历列表直到找到计数。
  • 除了初始化头指针外,您从未为要插入的新节点分配空间。这也是一个问题。

希望有所帮助。祝你好运!

答案 1 :(得分:0)

int num,count=0,i;
...
ptr=head->next;
while(ptr->x!=(count/2)){
    ptr=ptr->next;

count初始化为0且永不改变。

因此,除非你为x输入“0”,否则每次循环都只是走出列表的末尾。

答案 2 :(得分:0)

测试在什么情况下你的代码段错误。

你会发现它在head == NULL时可以正常工作,但如果head不为空则会失败。

所以你知道你的错误在else块中。

在调试器中逐步运行您正在运行的代码(如果您不知道怎么做,那么学习永远不会太早:每当您使用调试器解决问题时,您都会想到“为什么我不早点转向这个?” )。

计算出您期望发生的事情,观察调试器中的变量,以及当实际值偏离您的期望时,请说明原因。

我不清楚您在代码中发生了什么期望,但对于包含一个节点的列表实际发生的情况是:

  • 它会执行ptr=head->next; - 所以ptr现在是NULL
  • 然后对于while条件,它会尝试取消引用ptr->x,并且由于ptr为NULL,因此会出现段错误。

快速解决这个问题的方法是:

while(ptr != NULL && ptr->x ....) {

但你需要考虑这是否是你想要的实际逻辑;一旦你超越了它,你就会遇到其他问题(例如,count永远不会改变),这可以用调试器以相同的方式进行整理。