链接列表创建功能任意添加节点

时间:2013-10-21 00:30:10

标签: c linked-list

我在C中有一个函数,它应该为链表创建3个节点。问题是该函数似乎添加了一个额外的节点,我无法发现我的错误。有人可以看看输出和代码,让我知道我的错误是什么?问题可能出在虚拟机编译环境中吗?我在运行BackTrack Linux的虚拟机中使用以下代码进行编译:

  

gcc link.c -o link

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DELIMITER ,

struct node {
    int data;
    struct node *next;
};

struct node* create()
{
    //define head pointers
    struct node *head = NULL;
    struct node *second = NULL;
    struct node *third = NULL;

    //allocate memory
    head = malloc(sizeof(struct node));
    second = malloc(sizeof(struct node));
    third = malloc(sizeof(struct node));

    //setup fields
    //assign links
    head->data = 15;
    head->next = second;

    second->data = 20;
    second->next = third;

    third->data = 25;
    third->next = NULL;

    return head;
}

int main(int argc, const char *argv[])
{
    int size;
    struct node *head;

    head = create();

    struct node *curr = head;

    while(curr->next != NULL)
    {
        printf("%d\n", curr->data);
        curr++;
    }

    return 0;
}

这是输出:

  

15   0   20   0

2 个答案:

答案 0 :(得分:1)

使用链表时,curr ++不能像在标准数组中那样工作。链表的整个要点是列表中的数据不是连续的。您不能简单地增加curr并期望它指向列表中的下一个元素,因为malloc不承诺顺序调用将返回内存的连续单元格的地址。

您正在寻找的是

curr = curr->next;

但是,这也需要您修改循环。由于curr-&gt; next将在最后一个节点之前为NULL,因此将跳过最后一个元素。你在条件

curr->next != NULL
经过上述调整后,

curr != NULL

此外,malloc返回void指针,虽然没有必要,但我会说你应该将它们转换为正确的指针类型。

 //allocate memory
head = (struct node*) malloc(sizeof(struct node));
second = (struct node*) malloc(sizeof(struct node));
third = (struct node*) malloc(sizeof(struct node));

答案 1 :(得分:0)

while(curr)
{
    printf("%d\n", curr->data);
    curr = curr->next;
}

我更喜欢

for(curr = head; curr ; curr = curr->next)
{
    printf("%d\n", curr->data);
}