将输入的学生成绩组织成单向链表的简单函数

6-5 建立学生信息链表
struct stud_node {
    int              num;      /*学号*/
    char             name[20]; /*姓名*/
    int              score;    /*成绩*/
    struct stud_node *next;    /*指向下个结点的指针*/
};

单向链表的头尾指针保存在全局变量head和tail中。
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

#include 
#include 
#include 

struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next;
};
struct stud_node *head, *tail;

void input();

int main()
{
    struct stud_node *p;
	
    head = tail = NULL;
    input();
    for ( p = head; p != NULL; p = p->next )
        printf("%d %s %d\n", p->num, p->name, p->score);

    return 0;
}

void input()
{
    int a;
    struct stud_node *p;
    scanf("%d",&a);
    while(a != 0){
        struct stud_node *newNode =(struct stud_node *)malloc(sizeof(struct stud_node));
        newNode->num = a;
        scanf("%s%d",newNode->name,&newNode->score);
        if(head == NULL) head = newNode;
        else p->next = newNode; 
        p = newNode;
        scanf("%d",&a);
    } 
    if(head != NULL) p->next = NULL;
    //此处可有可无,绝大多数程序未对最后一个结点的指针初始化为NULL
    //因为结点是使用malloc函数分配的存储空间
    //这样创建的链表在使用时尾结点的指针确实为NULL
    //删除尾结点时,通常也未处理,因为会将尾结点的指针赋给上一个结点
}
体现一种程序设计思想的解法二
void input()
{
    struct stud_node *p;
    head = (struct stud_node*)malloc(sizeof(struct stud_node));
    head->next = NULL;//在新建单向链表的头上加一个空结点,该结点的next指向链表第一个真正的结点。
    //这种链表叫做带头结点的单向链表
    p = head;//p指向当前结点
    //两步操作后,在while循环内不再需要进行条件判断,提高运行效率
    while(1)
    {
        tail = (struct stud_node*)malloc(sizeof(struct stud_node));
        scanf("%d", &tail->num);//直接利用了已定义变量
        if (!tail->num) break;//if break 简单直接
        scanf("%s%d", tail->name, &tail->score);
        p->next = tail;
        p= tail;
    }
    head = head->next;//删除头上的空结点后直接退出
}
void input()
{
    struct stud_node *q;
    q=(struct stud_node *)malloc(sizeof(struct stud_node));
    scanf("%d", &q->num);
    while(q->num != 0)
    {
        scanf("%s %d", q->name, &q->score);
        if(head == NULL)
        {
             head = q;
             head->next = NULL;
        }
       if(tail != NULL)
       {
           tail->next = q;
       }
       //使用两个if区分第一次运行与之后的运行
        tail = q;
        tail->next = NULL;//此程序随时对尾结点的指针进行初始化为NULL
        q=(struct stud_node *)malloc(sizeof(struct stud_node));
        //不建议的程序结构较难理解
        scanf("%d", &q->num);
    } 
}

怀疑人生进行时啊 难受难受

既能看懂别人的又能记牢自己的解法就基本放心了····

你可能感兴趣的:(C进阶练习第III段——结构,链表,基础算法,MOOC-陈越,何钦铭-数据结构-2020春)