第一个元素在 C 中使用链表消失

First element disappearing using Linked Lists in C

我是学习 C 语言数据结构和抽象数据类型的初学者。我正在创建一个简单的链表实现,但是当我尝试打印该列表时,我似乎丢失了第一个元素。 Node 类型只包含一个整数和一个指向自身的指针。

我的主文件

  int main()
  {
     Node * List=createList();

     int testData[] = {1,2,3,4,5,6};

     for (int i = 0 ; i < 6 ; i++)
     {
       addFront(List,testData[i]);
       printList(List);
       printf("\n");
     }

  }

addToFront 及其支持的 initNode 定义如下:

 void addFront(Node * List, int value)
 {
    Node * toAdd = initNode(value);

    toAdd-> next = List->next;

    List->next = toAdd;
 }



 Node * initNode(int val)
 {
    Node * newNode = malloc(sizeof(Node));
    newNode -> value = val;
    newNode-> next = NULL;

    return newNode;
 }

编辑:根据要求,printList() 是:

  void printList(Node * List)
  {
     Node * original = List->next;

     while (List->next != NULL)
     { 
        printf("%d\n",List->value);
        List = List ->next;
     }

     List = original;
  }

有什么地方不对吗?

您正在添加到前面,但您正在将 toAdd 中的下一个元素设置为 List->next。您正在跳过第一个元素。

此外,您之后将 List->next 设置为 toAdd

你要做的是:

void addFront(Node** List, int value)
{
    Node * toAdd = initNode(value);
    toAdd->next = *List;
    *List = toAdd;
}

传入一个指向 Node 指针的指针,这样您就可以在函数内部修改头部。

根据 alk 的评论,现在这样称呼它:addFront(&List,testData[i]);

假设第一个节点不用于数据而仅指向列表的其余部分,那么您的大部分代码看起来都不错。问题是您没有打印列表中的所有节点。

printList() 内部,您不需要 original,因为函数参数中的 List 无论如何都是本地的...并且您需要在节点出现时中断循环重新查看是 NULL 而不是当它的 next 节点是 NULL 时(因为 while 测试发生在循环体之前)。

这是一个缩短和更正的版本,它还更新了 while 条件内的 List 指针,而不是循环之前和循环体中的指针。

void printList(Node * List)
{
   while ((List = List->next) != NULL)
   { 
      printf("%d\n",List->value);
   }
}