第一个元素在 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("%dn",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节点时中断循环,而不是在NULLnext节点时中断循环(因为while测试发生在循环体之前)。

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

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

这是打印列表函数的问题,您应该需要打印直到当前节点不等于 null。 即在 Java 中我使用 while 循环..

而 (curnode!=null)*请记住.next不在这里使用,因为当您使用它时,您的One元素将被跳过

最新更新