C语言 打印链表数据时,仅打印第一个元素



我为用户编写了这段代码,以在列表中输入他们想要的节点数,以及每个节点的元素。我的错误仅在我尝试打印列表的值时发生。似乎我只打印列表的第一个值。要么这样,要么我无法成功将数据分配给列表。

注意 "list.h" 仅包含 stdio 和 stdlib 库,以及结构体定义。它只保存数据和指向同一结构的指针。

#include "list.h"
struct node *head = NULL;
void print_data(){
struct node* temp;
temp = head;
printf("nn");
while(temp != NULL){
printf("%d ", temp->data);
temp = temp->next;
}
}
void insert(data){
struct node *temp = malloc(sizeof(struct node));
struct node *p;
temp->data = data;
temp->next = NULL;
if( head == NULL ){
head = temp;
}else{
p = head;
while( p->next != NULL){
p = p->next;
p->next = temp;
}
}
}
int main(){
int i, amount, element;
printf("nEnter Amound of Nodes: n");
scanf(" %d", &amount);
for( i = 0; i < amount; ++i){
printf("nEnter Node #%d amount ", i + 1);
scanf(" %d", &element);
insert(element);
}
print_data();
}

您的插入是错误的。假设您想在链表的最后一个插入节点。但是您的代码在列表的开头插入节点,而没有正确处理列表的其余部分。因此,您的其余列表将丢失。

while( p->next != NULL){
p = p->next;
p->next = temp;
}

应该是

while( p->next != NULL){
p = p->next;
}
p->next = temp;

insert函数的while中,从第二个元素开始,您将temp分配给每个元素。您必须首先到达列表的末尾,然后将其添加到列表中。因此,将作业移出while循环。

我通常会推到列表的头部,而不是尾部。 即:

my_struct_t tmp->next = list_head;

list_head = TMP;

这样,您可以避免每次需要添加到列表时循环到列表的末尾。

最新更新