第一个元素在C

时间:2016-05-25 16:36:09

标签: c data-structures singly-linked-list

我是初学者,在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;
  }

任何可能出错的想法?

2 个答案:

答案 0 :(得分:3)

您正在添加到前面,但是您要将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]);

答案 1 :(得分:2)

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

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

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

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