我为用户编写了此代码,以便在列表中输入他们想要的节点数以及每个节点的元素。仅当我尝试打印列表的值时,才会发生我的错误。好像我只是在打印列表的第一个值。否则,或者我没有将数据分配给列表。
注意“ list.h”仅包括stdio和stdlib库以及struct定义。它只保存数据和指向相同结构的指针。
#include "list.h"
struct node *head = NULL;
void print_data(){
struct node* temp;
temp = head;
printf("\n\n");
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();
}
答案 0 :(得分:2)
您的插入错误。假设您要在链表的最后插入节点。但是您的代码在列表的开头插入了节点,但未正确处理列表的其余部分。因此,您列表的其余部分将丢失。
while( p->next != NULL){
p = p->next;
p->next = temp;
}
应该是
while( p->next != NULL){
p = p->next;
}
p->next = temp;
答案 1 :(得分:1)
在while
函数的insert
中,您将从第二个元素开始为每个元素分配temp
。您必须先到达列表的末尾,然后再将其添加到列表中。因此,将分配移到while
循环之外。
答案 2 :(得分:0)
我通常会推到列表的开头,而不是结尾。 即:
my_struct_t tmp-> next = list_head;
list_head = tmp;
这样,您避免每次需要添加到列表时都循环到列表末尾。