简体   繁体   English

为什么此链表从上次输入中打印? C链表程序

[英]Why this linked list prints from last input? C linked-list program

So I have this simple linked list program: 所以我有这个简单的链表程序:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct record record;
struct record {
    char name[32]; 
    float score;
};

typedef struct node node;
struct node {
    record data;
    node *next; 
}; 

int main() {
    char data[100];
    char name[32];
    float x;
    node *p, *head;
    int counter = 0;

    head = 0;

    while ((fgets(data, 60, stdin) != NULL) && counter <= 3) {
        p = (node *) malloc (sizeof(node));

        sscanf(data, "%s %f", name, &x);
        strcpy(p->data.name,name);
        p->data.score = x;
        p->next = head;
        head = p;

        counter++;
    }

     printf("-----------------------\n");
     while (p) {
         printf("%s %f\n",p->data.name, p->data.score);
         p = p->next ;
     }

     return 0;
}

And this is the input and output: 这是输入和输出:

 //input
 bob 10
 shiela 5
 john 1
 elisa 10

 //print input
 elisa 10.000000
 john 1.000000
 shiela 5.000000
 bob 10.000000

Why is it that it start printing from last input? 为什么从最后一个输入开始打印?

How can i print this starting from the first data i entered? 我如何从输入的第一个数据开始打印?

The reason you're getting the nodes in reverse order is because this code: 之所以以相反的顺序获取节点,是因为以下代码:

p->next = head;
head = p;

inserts node at the beginning of the list, such as: 在列表的开头插入节点,例如:

head -> null
head -> A -> null
head -> B -> A -> null
head -> C -> B -> A -> null

and so on. 等等。

Then, when you traverse from head to null , they appear to come out in reverse order but, in actual fact, that's just an side effect of your insertion method. 然后,当您从head遍历到null ,它们似乎以相反的顺序出现 ,但实际上,这只是您的插入方法的副作用。

If you want them inserted in the list in the "correct" order, introduce a tail pointer and code it thus: 如果希望按“正确”的顺序将它们插入列表中,请引入tail指针并对其进行编码:

p->next = null;      // new node will always be end of list
if (head == NULL)    // special trap for empty list
    head = p;        //     means set up head
else                 // otherwise
    tail->next = p;  //     current tail now points to new node
tail = p;            // make new node the tail for next time

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM