我为用户编写了这段代码,以在列表中输入他们想要的节点数,以及每个节点的元素。我的错误仅在我尝试打印列表的值时发生。似乎我只打印列表的第一个值。要么这样,要么我无法成功将数据分配给列表。
注意 "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;
这样,您可以避免每次需要添加到列表时循环到列表的末尾。