为什么insert函数总是附加在链表的末尾?

时间:2016-12-15 09:55:15

标签: c data-structures linked-list

我已编写此代码以按位置插入链接列表。

void insert(node *list, int data, int position) {
    int c;

    node *temp; 
    node *prev; 
    node *curr;

    curr = list;

    temp = malloc(sizeof(node));
    temp->num = data;

    if (curr == NULL) { 
        curr = temp;
        curr->next = NULL;
    } else { 
        while (curr != NULL && c != position) { 
            prev = curr;
            curr = curr->next;
            c++;
        }
        if (c = 0) { 
            temp->next = curr;
            curr = temp;
        } else if (curr == NULL) { 
            prev->next = temp;
        } else { 
            prev->next = temp;
            temp->next = curr;
        }
    }
}

但是,我相信无论什么都会执行此块,并且数据会附加到链表的末尾。

else if (curr == NULL) { 
      prev->next = temp;

为什么curr始终为空?如果位置小于列表中的元素数量,则不应该为空...

3 个答案:

答案 0 :(得分:1)

您尚未在开头将c变量初始化为0。还有条件 if(c = 0)应该是 if(c == 0)

temp-> next = NULL也应该在temp-> num = data之后完成,否则在

的情况下它将保持未初始化状态
      else if (curr==NULL) { 
               prev->next=temp;
      }

这些是我注意到的。

答案 1 :(得分:1)

您的代码中存在多个问题:

  • 未初始化局部变量c。在没有事先初始化的情况下使用它会调用未定义你应该这样定义:

    int c = 0;
    
  • 测试if (c = 0)c的值设置为0并始终失败。请改用==运算符:

    if (c == 0) {
        ...
    
  • 您必须返回list并将list设置为curr是否已在列表开头插入元素(位置0)或列表为空。< / p>

以下是改进版本:

node *insert(node *list, int data, int position) {
    node *temp = malloc(sizeof(node));
    if (temp == NULL) {
        return NULL;
    }
    temp->num = data;
    if (list == NULL || position <= 0) {
        temp->next = list;
        return temp;
    } else {
        node *curr = list;
        while (position-- > 0 && curr->next != NULL) {
            curr = curr->next;
        }
        temp->next = curr->next;
        curr->next = curr;
        return list;
    }
}

答案 2 :(得分:1)

你在那里有一个局部变量:c

该变量具有自动存储功能,其起始值不确定。 你必须初始化

int c = 0;

否则它的初始值可以是函数被调用时寄存器旧值或内存垃圾,所以

while (curr!=NULL && c != position)

行为未定义。

此外,if之后的if检查有问题:相等的关系运算符是==

if (c=0)

必须是

if (c==0)

否则,您要将0分配给c,而不是测试其值。