链接列表不会在C中添加元素

时间:2015-02-15 23:22:29

标签: c algorithm

我正在使用C中的链表实现,我面临的问题是链表不会向自身添加元素。它只打印第一个元素 这里出了点问题,我无法弄清楚是什么 无论我做什么,我设法将第一个元素的下一个字段始终为NULL的问题本地化。所有其他事情都是合法的。我在最后添加了跑步的结果。

这是链表声明:

    typedef struct list_element {
    int value;
    struct list_element *next;
} list_element;

以下是用法:

void checkLinkedList()
{
    list_element list = createNewLinkedList();
    list.value = 100;

    for (int i = 1; i < 10; i++) {            
        printf("added another\n");

        int value = rand();
        insertNewElementAtEndWithValue(list, value);
    }
}

void insertNewElementAtEndWithValue(list_element element, int value)
{       
    printf("Starting element address: %p\n", &element);

    list_element *myElement = &element;       
    int shouldContinue = 1;

    while (shouldContinue) {            
        if (myElement->next == NULL) {
            printf("next is null, value is %d \n", value);

            list_element *new = (list_element *)malloc(sizeof(list_element));
            printf("new address %p\n", new);
            new->value = value;
            new->next = NULL;
            myElement->next = new;
            printf("New is: %p, myElement->next is: %p\n", new, myElement->next);
            shouldContinue = 0;
        } else {
            printf("Proceeding to next");
            myElement = myElement->next;
        }
    }
}

结果:

./main

added another
Starting element address: 0x7fff5c10aac0
next is null, value is 16807 
new address 0x7fa3d3504b60
New is: 0x7fa3d3504b60, myElement->next is: 0x7fa3d3504b60
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 282475249 
new address 0x7fa3d3504b70
New is: 0x7fa3d3504b70, myElement->next is: 0x7fa3d3504b70
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 1622650073 
new address 0x7fa3d3504b80
New is: 0x7fa3d3504b80, myElement->next is: 0x7fa3d3504b80
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 984943658 
new address 0x7fa3d3504b90
New is: 0x7fa3d3504b90, myElement->next is: 0x7fa3d3504b90
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 1144108930 
new address 0x7fa3d3504ba0
New is: 0x7fa3d3504ba0, myElement->next is: 0x7fa3d3504ba0
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 470211272 
new address 0x7fa3d3504bb0
New is: 0x7fa3d3504bb0, myElement->next is: 0x7fa3d3504bb0
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 101027544 
new address 0x7fa3d3504bc0
New is: 0x7fa3d3504bc0, myElement->next is: 0x7fa3d3504bc0
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 1457850878 
new address 0x7fa3d3504bd0
New is: 0x7fa3d3504bd0, myElement->next is: 0x7fa3d3504bd0
added another
Starting element address: 0x7fff5c10aac0
next is null, value is 1458777923 
new address 0x7fa3d3504be0
New is: 0x7fa3d3504be0, myElement->next is: 0x7fa3d3504be0
Number of elements in list: 1
 100,

1 个答案:

答案 0 :(得分:1)

问题是C有值传递的语义,所以在这个函数的主体中

void insertNewElementAtEndWithValue(list_element element, int value) {...}

elementvalue都是参数的本地副本。

在您的情况下,您打算修改您需要引用语义的第一个参数。这可以通过使用指针来实现:

void insertNewElementAtEndWithValue(list_element* element, int value)
{
  /* as before except element is a pointer */
}