C语言 为什么此代码只打印链表的最后一个元素


struct Node{
int data;
struct Node* next;
};
struct Node* head; 
void Insert(int x){
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
    temp->data=x;
    temp->next=NULL;
    head=temp;
}
void Print(){
    struct Node* temp=head;
    printf("List is: n");
    do{
        printf("%d", temp->data);
        temp=temp->next;
    }while(temp!=NULL);
}
int main(){
    head = NULL; 
    printf("How many numbers do you want to put into a list? n");
    int n, i, x;
    scanf("%d", &n);
    for (i=0; i<n; i++){
        printf("Enter the number: n");
        scanf("%d", &x);
        Insert(x);
        Print(); 
    }
}  

此代码仅打印最后一个元素。我已经检查了多次,似乎找不到错误。如果有人能告诉我哪里出了问题,我将不胜感激。

提前致谢

head=temp;

此行将覆盖您以前的head。这就是为什么您只能打印最后一个元素的原因。

在链表中,有两种类型的数据输出:FIFO(先进先出(和LIFO(后进先出(。

例如:

Input = 1 2 3 4

先进先出

Output = 1 2 3 4

后进先出

Output = 4 3 2 1

先进先出

您应该声明struct Node* tail;

temp->next=NULL;后,您应该添加:

if(head==NULL){
    head=temp;
    tail=temp;
}
else{
    tail->next=temp;
    tail=temp;
}

请注意,在FIFO中不得移动头部。因此,我们需要使用 tail 来添加其他数据。

后进先出

temp->next=NULL;后,您应该添加:

temp->next=head;
head=temp;
这两个

语句:

temp->next=NULL;
head=temp;

将丢失以前插入的数据。用

temp->next=head;
head=temp;

相反。这会将新元素与列表的其余部分放在首位。

相关内容

  • 没有找到相关文章