我正在使用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,
答案 0 :(得分:1)
问题是C有值传递的语义,所以在这个函数的主体中
void insertNewElementAtEndWithValue(list_element element, int value) {...}
element
和value
都是参数的本地副本。
在您的情况下,您打算修改您需要引用语义的第一个参数。这可以通过使用指针来实现:
void insertNewElementAtEndWithValue(list_element* element, int value)
{
/* as before except element is a pointer */
}