在C链接列表中添加节点并列出它们

时间:2014-03-30 17:14:44

标签: c linked-list

我正在练习c中的链表,我想创建一个程序,从键盘读取条目并在添加每个节点后列出链表的内容,但输出始终是第一个节点,我不能找出原因,有人可以指出这段代码中的缺陷:

#include <stdio.h>
#include <stdlib.h>

typedef int ID;

typedef struct node {
    ID id;
    struct node * next;
} node_t;

int main(){
    node_t * head;
    node_t * conductor;
    head = NULL;
    ID id;
    int i=0;

    while(i<10){
        printf("Introduce an id:\n");
        scanf("%d", &id);
        if(head == NULL){
            head = malloc(sizeof(node_t));
            head->id = id;
            head->next = NULL;
        }
        else{
            conductor = head;
            while(conductor != NULL)
                conductor = conductor->next;

            conductor = malloc(sizeof(node_t));
            conductor->id = id;
            conductor->next = NULL;
        }
        conductor = head;
        printf("the list contains these elements:\n");
        while(conductor != NULL){
            printf("%d\n", conductor->id);
            conductor = conductor->next;
        }
        ++i;
    }
}

3 个答案:

答案 0 :(得分:2)

他的问题出在你的while循环中

while (conductor != NULL)

要添加新节点,您需要在找到最后一个导体后设置conductor-&gt; next。 这样的事情可以奏效:

 While (conductor->next != NULL)

答案 1 :(得分:2)

在插入之前,您正在运行列表的末尾。你应该去导体 - >接下来变成NULL,插入新节点并设置导体 - >接下来指向新节点。

其他一些指示:

  1. 正确缩进。这样可以更容易发现错误
  2. 将代码拆分为addNoderemoveNodeprintList等功能,
  3. 逐个添加元素到链表的末尾是每次插入的O(n)时间。保持尾指针或插入头部以进行O(1)插入。这非常重要,并且通过微不足道的努力可以带来很多加速。头部和头部尾部被跟踪,您可以插入两侧并从O(1)中的头部移除。从尾部移除仍将采用O(n)虽然AFAIK

答案 2 :(得分:1)

您需要以下内容

conductor = head;
// Find the last node in the list
while(conductor->next != NULL)
    conductor = conductor->next;

// Setup the new node
node_t* newNode = malloc(sizeof(node_t));
newNode->id = id;
newNode->next = NULL;

// Have the last node's next pointer point to the new node
constructor->next = newNode;

关键是你将构造函数移动到列表中的最后一个节点,新节点将连接到最后一个节点之后的列表中。

通常使用链接列表,您应该跟踪当前的头部和尾部,这将在添加新节点时提高性能,您将注意到每次都需要遍历现有列表。