gpt4 book ai didi

C - 链表的 addLast 函数的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 00:41:29 24 4
gpt4 key购买 nike

我正在用 C 语言创建链表数据结构。但是,我在执行 addLast 函数时收到一些奇怪的行为。直到我下次调用 addLast 时,添加的元素似乎才出现。我的代码(我将通过内联注释解释我认为我的代码是如何工作的):

辅助代码:

typedef struct LinkedList linkedlist;
typedef int ListElement;

struct LinkedList{
ListElement data;
linkedlist *next;
};

//Initializes a list;
void CreateList(linkedlist *list, ListElement contents){
list->data = contents;
list->next = NULL;
}

//Prints the items of the list, head first.
void displayList(linkedlist *list){
printf("(%d", list->data);
linkedlist *node = list->next;

if(node == NULL){
}
else{
while(node->next != NULL){
printf(" %d", node->data);
node = node->next;
}
}

printf(")");
}

有问题的代码:

//Adds an element at the tail of the list
void addLast(linkedlist *list, ListElement forAdding){
linkedlist *node = list;
linkedlist *NewNode = (linkedlist *) malloc(sizeof(linkedlist));

//Go to the last element in the list
while(node->next != NULL){
node = node->next;
}

//Prepare the node we will add
NewNode->data = forAdding;
NewNode->next = NULL;

//Since node is pointing to the tail element, set its
//next to the NewNode---the new tail
node->next = NewNode;
}

//Special attention to this function!
void List(ListElement items[], linkedlist *list, int numItems){
int i = 0;

while(i < numItems){
addLast(list, items[i]);
printf("Before ");
displayList(list);
printf("\n");
printf("Added %d", items[i]);
displayList(list);
printf("\n");
i++;
}
}

主要功能:

int main(){
linkedlist *l= (linkedlist *) malloc(sizeof(linkedlist));
CreateList(l, 0);
int a_list[5] = {1, 2, 3, 5, 6};
List(a_list, l, sizeof(a_list)/sizeof(a_list[0]));
printf("A list of five elements: %d", sizeof(a_list)/sizeof(a_list[0]));
displayList(l);
removeLast(l);
addLast(l, 7);
printf("\nAdded something at last position: ");
displayList(l);
printf("\n");
}

为此我得到了输出:

Before (0)
Added 1(0)
Before (0)
Added 2(0 1)
Before (0 1)
Added 3(0 1 2)
Before (0 1 2)
Added 5(0 1 2 3)
Before (0 1 2 3)
Added 6(0 1 2 3 5)
A list of five elements: 5(0 1 2 3 5)
Added something at last position: (0 1 2 3 5 6)

如您所见,添加的项目似乎只会出现在我下次调用 addLast 时。

到目前为止,我已经知道它实际上在那里,尽管出于某种原因它不会被打印出来。例如,如果我在关闭函数 List 之前执行另一个 addLast(list, 6); 调用(当然是在循环之外!),输出行 Added something at last position... (在调用 addLast(l, 7); 后实际会显示 Added something at last position: (0 1 2 3 5 6 6)

那么,我做错了什么?

谢谢!

最佳答案

问题不在 AddLast() 中,它只是您的 displayList() 函数:)。您在最后一个元素之前停止打印 1 个元素。

像这样更改 displayList() 函数:

void displayList(linkedlist *list){
printf("(");
linkedlist *node = list;

while(node != NULL){
printf(" %d", node->data);
node = node->next;
}

printf(")");
}

这个函数也可以打印空列表。

关于C - 链表的 addLast 函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6623664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com