将节点添加到单链表的末尾

时间:2014-01-29 02:00:15

标签: c

我正在尝试将一个节点添加到单个链接列表的末尾但是遇到了分段错误(核心转储错误)

void slist_add_back(struct slist *l, char *str) {
    struct snode *temp;

    do {
        l->front = l->front->next;
        l->counter++;
    } while (l->front !=NULL);

    l->counter++;
    temp = (struct snode *)malloc(sizeof(struct snode));
    l->back = l->front;
    l->back->next = temp;
    l->back = temp;
}

4 个答案:

答案 0 :(得分:1)

当你写:

do{
      l->front = l->front->next;
      l->counter++;

   }while(l->front !=NULL);

最后l->front为空。现在l->back = l->front;暗示l->back也为空。所以这个任务是错误的:

l->back->next = temp; // causing segfault

答案 1 :(得分:0)

你的一个问题在于:

do
{
    l->front = l->front->next;
    l->counter++;
} while(l->front !=NULL);

您正在修改列表而不是迭代它。它应该是这样的:

snode* curr = l->front;
if (curr == NULL) // first element
{
    front = new snode(str);
    return;
}

while (curr->next != NULL)
{
    ++curr;
}
curr->next = new snode(str); // or the malloc version if you want to stay in C

答案 2 :(得分:0)

我想这就是你想要的东西? 我真的不明白你的代码在做什么,抱歉。

void slist_add_back(struct slist *l, char *str)
{


   struct snode *currentNode = l->front;
   if(currentNode!=NULL)
   {
      struct snode *temp = (struct snode *)malloc(sizeof(struct snode));
      while(currentNode->next!=NULL)
      {
         l->counter++;//although i dont know why
         currentNode = currentNode->next;
      }


      l->counter++;//again
      currentNode->next = temp;
      l->back = temp;
      temp->next = NULL;
   }
}

答案 3 :(得分:0)

以下是您的代码大致应如下所示:

void slist_add_back(struct slist *l, char *str)
{
    struct snode *temp = malloc(sizeof(struct snode));
    temp->next = NULL;
    //note: store str... (strdup?)

    if (! l->back) {
        l->front = temp;
    } else {
        l->back->next = temp;
    }
    l->back = temp;
    l->counter++;
}

注意:基于你的代码,如果其余的不会出现bug,我会感到非常惊讶,所以除非崩溃,即使这部分是固定的......

选择一个调试器,然后检查您的代码真正的功能。