6-2 建立学生信息链表

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。

函数接口定义:

void input();

该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:

struct stud_node {
    int              num;      /*学号*/
    char             name[20]; /*姓名*/
    int              score;    /*成绩*/
    struct stud_node *next;    /*指向下个结点的指针*/
};

单向链表的头尾指针保存在全局变量headtail中。

输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

裁判测试程序样例:

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

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;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0

输出样例:

1 zhang 78
2 wang 80
3 li 75
4 zhao 85

17分,没有考虑输入为0的情况,而且比较浪费空间 



void input()
{
    struct stud_node *p,*q;
    //先存第一个结点的数据
    q=(struct stud_node *)malloc(sizeof(struct stud_node));
    scanf("%d%s%d",&q->num,q->name,&q->score);
    //判断表是否为空,为空则让头指针为空
    if(q->num==0)
    {
        head=NULL;
    }
    head=q;//头指针指向第一个结点,指向q这个链表
    while(1)//while(1) 是一个无限循环的语句,它会一直执行下去,直到遇到 break 语句或者程序被强制终止。
    {
        p=(struct stud_node*)malloc(sizeof(struct stud_node));
        scanf("%d",&p->num);
        //判断输入是否结束,结束则指向空,并结束循环
        if(p->num==0)
        {
            q->next=NULL;
            break;
        }
        //继续输入结点数据
        scanf("%s %d",p->name,&p->score);
        //连接q结点和p结点
        q->next=p;
        //循环上述操作
        q=p;
    }
    q->next=NULL;//不浪费内存
}

标椎答案 ,使用尾插法。

void  input()
{
    struct stud_node* node;//先定义一个指针,指向node节点
    node = (struct stud_node*)malloc(sizeof(struct stud_node));
    //开辟节点空间
    scanf("%d", &node->num);
    //先输入第一个节点的学号
    while (node->num != 0)
    {
        scanf("%s%d", &node->name, &node->score);
        //再输入该节点的姓名,分数
        if (tail == NULL)//第一个节点的情况,此时链表为空表
        //头节点与尾节点都为空
        {
            head = node;//使node节点成为头节点同时也是尾节点
            //因为只有一个节点
            head->next = NULL;//尾节点指向的下一个指针为NULL
        }
        if (tail != NULL)tail->next = node;//第2,3...n个节点的情况
        //此时使用尾插法,在节点1前插入一个节点2
        tail = node;//再把尾指针往后遍历一位,尾节点从节点1变成节点2
        tail->next = NULL;
        node = (struct stud_node*)malloc(sizeof(struct stud_node));
        //为新节点开辟空间
        scanf("%d", &node->num);
    }
}

自己的理解 

void input()
{
    struct stud_node *node;//存储结点
    node=(struct stud_node *)malloc(sizeof(struct stud_node));
    scanf("%d",&node->num);//输入第一个结点
    //结束条件输入为0,没有学生的情况
    while(node->num!=0)
    {
        scanf("%s%d",node->name,&node->score);//满足条件则输入学生情况
        //当尾结点为空,说明是输入第一个结点的情况
        if(tail==NULL)
        {
            head=node;//头结点=node结点,说明head表与node表相同,现在只需用tail把其他结点连接起来
            head->next=NULL;//2个结点的指针指向空
        }
        //第2,3...n个节点的情况,移动指针指向存储结点
        if(tail!=NULL)
            tail->next=node;
        //只有第一个结点的时候,头结点=存储结点=尾指针=移动结点
        //第2,3...n个节点的情况,移动结点变为存储结点
        tail=node;
        //移动结点=存储结点的指针指向空
        tail->next=NULL;
         //为新节点开辟空间
        node=(struct stud_node *)malloc(sizeof(struct stud_node));
        scanf("%d", &node->num);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值