我试着自学链表,所以我设法把一小段代码放在一起,应该创建三个链接节点,然后打印出来。只是它只输出第一个元素,我不明白为什么不输出另外两个元素。
另外,我很确定我应该释放内存,当我使用malloc?但我不知道在哪里?
无论如何,我做错了什么?下面是代码…我知道有类似的答案,但我已经检查过了,我更希望得到一个符合我具体情况的答案,因为我不会得到它…
#include<stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
void printList(struct Node *ptr);
int main(void)
{
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;
head = (struct Node*)malloc(sizeof(struct Node));
second = (struct Node*)malloc(sizeof(struct Node));
third = (struct Node*)malloc(sizeof(struct Node));
head->data = 10;
head->next = second;
second->data = 20;
head->next = third;
third->data = 30;
head->next = NULL;
printList(head);
}
void printList(struct Node *ptr)
{
struct Node *listPtr;
listPtr = ptr;
int count = 1;
if (listPtr == NULL)
{
printf("No elements in list.n");
return;
}
while (listPtr!=NULL)
{
printf("element %d = %dn",count,listPtr->data);
listPtr = listPtr->next;
count++;
}
}
我看过类似的代码示例,它们(至少有几个)看起来和我的相似,所以我真的不知道我做错了什么…
printList()
很好。问题是如何初始化main()
中的元素。@ShlomiAgiv给了你一个答案,这是另一个:
int main(void) {
struct Node nodes[] = {
{ 10, nodes + 1 },
{ 20, nodes + 2 },
{ 30, NULL }
};
printList(nodes);
}
返回:
element 1 = 10
element 2 = 20
element 3 = 30
这是一个动态分配每个节点的appendList()
。它返回正在创建的第一个节点(它是列表(如果它是一个新列表),并更新*tail
指针为最后一个节点:
struct Node *appendList(struct Node **tail, size_t len, int data[len]) {
struct Node *root = NULL;
for(size_t i = 0; i < len; i++) {
struct Node *n = malloc(sizeof *n);
if(!root)
root = n;
if(!n) {
// freeList(root);
return NULL;
}
n->data = data[i];
if(*tail) {
(*tail)->next = n;
}
*tail = n;
}
(*tail)->next = NULL;
return root;
}
int main(void) {
struct Node *tail = NULL;
struct Node *root = appendList(&tail, 3, (int []) {10, 20, 30});
appendList(&tail, 1, (int []) { 40 });
printList(root);
// freeList(root);
}
,它会打印:
element 1 = 10
element 2 = 20
element 3 = 30
element 4 = 40
写这个而不是你所做的:
second->data = 20; //same
second->next = third;
third->data = 30; //same
third->next = NULL;