首页 > 其他分享 >[C语言/PTA] 建立学生信息链表

[C语言/PTA] 建立学生信息链表

时间:2023-06-14 21:56:21浏览次数:32  
标签:node struct PTA C语言 链表 stud 节点 指针

题目要求

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

函数接口定义:

void input();

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

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

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

输入为若干个学生的信息(学号、姓名、成绩),当输入学号为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

解题思路

结合所给代码,可分析代码功能实现如下:

使用结构体定义学生信息节点,包括学号、姓名、分数以及指向下一个节点的指针成员变量。

函数 void input() 用于读取用户输入的学生信息,动态创建节点并按照尾插法插入到链表中。

主函数 main() 中调用函数 input() 创建链表,然后再使用 for 循环遍历链表并输出每个节点的数据。

代码

void input()
{
    struct stud_node *q;                // 定义临时指针变量 q,用于操作新的节点
    int len=0;                          // 定义链表中节点数(即长度)的计数器,初始值为 0

    q = (struct stud_node*)malloc(sizeof(struct stud_node));    // 在动态内存中分配新的节点空间
    q->next = NULL;                     // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
    scanf("%d ",&q->num);               // 从键盘上读入学号
    while ( q->num != 0 )               // 如果输入的学号不为 0,说明还有待创建的新节点
    {
        len++;                          // 计数器加 1,表示又成功创建了一个新节点
        scanf("%s %d",q->name,&q->score);   // 从键盘上读入姓名和分数,并存储到链表节点中

        // 根据链表节点数 len 来判定是头插法还是尾插法
        if ( len == 1 )                 // 如果当前是第一个节点,直接将头指针和尾指针都指向该节点
        {
            head = q;
            tail = q;
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }
        else                            // 否则,使用尾插法将新节点插入到链表末尾
        {
            tail->next = q;             // 将尾指针指向的节点的 next 成员变量指向 q,即当前新节点
            tail = q;                   // 尾指针更新为当前节点
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }

        q = (struct stud_node*)malloc(sizeof(struct stud_node));   // 在动态内存中分配新的节点空间
        q->next = NULL;                 // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
        scanf("%d ",&q->num);           // 读取下一个学号,继续进行链表的创建
    }
}

定义 struct stud_node 结构体,用于存储学号、姓名、分数以及指向下一个节点的指针。

定义链表的头指针和尾指针:struct stud_node *head, *tail。

在 main() 函数中,通过调用 input() 函数来创建链表;然后再通过 for 循环遍历链表并输出每个节点的数据。

  1. 函数 void input() 中首先创建了一个临时指针变量 q,用于操作新的节点,并在动态内存中分配新的节点空间。

  2. 通过 scanf() 函数从键盘上读取学号、姓名和分数等信息,并存储到新创建的节点中。

  3. 通过计数器 len 的值,判断是要使用头插法还是尾插法将新节点插入到链表中。如果当前新节点是第一个节点,那么直接将头指针和尾指针都指向该节点;否则,就使用尾插法将新节点插入到链表末尾。

  4. 重复上述步骤,直到读取的学号为 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;                // 定义临时指针变量 p
    
    head = tail = NULL;                 // 头指针和尾指针初始值均为 NULL
    input();                            // 调用 input() 函数创建链表
    for ( p = head; p != NULL; p = p->next )   // 循环遍历链表并输出每个节点的数据
        printf("%d %s %d\n", p->num, p->name, p->score);

    return 0;
}

void input()
{
    struct stud_node *q;                // 定义临时指针变量 q,用于操作新的节点
    int len=0;                          // 定义链表中节点数(即长度)的计数器,初始值为 0

    q = (struct stud_node*)malloc(sizeof(struct stud_node));    // 在动态内存中分配新的节点空间
    q->next = NULL;                     // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
    scanf("%d ",&q->num);               // 从键盘上读入学号
    while ( q->num != 0 )               // 如果输入的学号不为 0,说明还有待创建的新节点
    {
        len++;                          // 计数器加 1,表示又成功创建了一个新节点
        scanf("%s %d",q->name,&q->score);   // 从键盘上读入姓名和分数,并存储到链表节点中

        // 根据链表节点数 len 来判定是头插法还是尾插法
        if ( len == 1 )                 // 如果当前是第一个节点,直接将头指针和尾指针都指向该节点
        {
            head = q;
            tail = q;
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }
        else                            // 否则,使用尾插法将新节点插入到链表末尾
        {
            tail->next = q;             // 将尾指针指向的节点的 next 成员变量指向 q,即当前新节点
            tail = q;                   // 尾指针更新为当前节点
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }

        q = (struct stud_node*)malloc(sizeof(struct stud_node));   // 在动态内存中分配新的节点空间
        q->next = NULL;                 // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
        scanf("%d ",&q->num);           // 读取下一个学号,继续进行链表的创建
    }
}

需要注意的是: 在函数 input() 中使用 len 变量记录当前链表已有节点数,以便更新 headtail 指针。如果当前节点是第一个节点(即 len == 1),则将 headtail 都指向该节点;否则,就直接使用尾插法将新节点附加到链表末尾。同时,循环中还需要在动态内存中分配新的节点空间,并通过 q = (struct stud_node*)malloc(sizeof(struct stud_node)) 语句实现。

总结

该题考察指针和链表的相关知识点,涉及链表的创建遍历插入等操作。
我是秋说,我们下次见。

标签:node,struct,PTA,C语言,链表,stud,节点,指针
From: https://www.cnblogs.com/qiushuo/p/17481445.html

相关文章

  • [C++/PTA] 括号匹配
    题目要求给定仅包含()[]{}六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。输入格式:第一行一个整数T(T<=10)其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)输出格式:对于每个字符串,匹配输出Yes,否则输出No......
  • [C++/PTA] 办事大厅排队
    题目要求在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。输入格式:第一行一个数字N,表示排队信息或者查询信息条目的数量。以下N行,每行的内容有以下3种情况(1)inname表示名字为name的人员新来到办事大厅,排在......
  • C/C++C语言课程设计[2023-06-14]
    C/C++C语言课程设计[2023-06-14]C语言课程设计要求1、每位同学按照指定的题目完成C语言课程设计,题目不能更换,每人1题,独立完成。上课时间同学们进入学习通课程(C语言课程设计)里签到,老师会有讲解检查。2、考核要求成绩组成考核/评价环节分值(或百分比)考核/评价细则平时成绩考勤、......
  • 数据结构和算法——旋转打印链表
    1、问题描述输入参数nn为正整数,如输入n=5n=5,则按行打印如下的数字:2、问题的理解这个问题是将数字1…n21…n2按照一圈一圈的方式......
  • [C++/PTA] 计算正方体、圆柱体的表面积、体积
    题目要求从立方体、圆柱体抽象出一个公共基类Container,定义抽象类Container,模拟实现一个容器类层次结构,在主函数进行多态机制测试。各派生类要求实现基类的所有纯虚函数。抽象类classContainer{protected:staticdoublepi;public:virtualdoublearea()=0;//纯虚函数,计......
  • [C++/PTA] 抽象类Shape
    题目要求请编写一个抽象类Shape,包括两个纯虚函数,分别为计算面积getArea()和计算周长getPerim()。通过Shape类派生出矩形类Rectangle和圆类Circle,并计算各自的面积和周长。测试用例具体要求:输入1表示测试矩形类,之后输入矩形长和宽。输入2表示测试圆类,之后输入圆半径。Shape类定......
  • [C++/PTA] 计算点到直线的距离一一友元函数的应用
    题目要求计算点到直线的距离。首先设计一个点类Point,它有2个私有数据成员x和y,表示点的坐标。另一个类为直线类Line,它有3个私有数据成员a,b和c,表示直线方程ax+by+c=0。这两个类中都说明了一个友元函数dist,用于计算一个点到直线的距离。点(x.y)到直线ax+by+c=0的距离d的计算......
  • [C++/PTA] 队列操作
    题目要求请实现一个MyQueue类,实现出队,入队,求队列长度.实现入队函数voidpush(intx);实现出队函数intpop();实现求队列长度函数intsize();输入格式:每个输入包含1个测试用例。每个测试用例第一行给出一个正整数n(n<=10^6),接下去n行每行一个数字,表示一种操作:1x:......
  • [C++/PTA] 表彰优秀学生(多态)
    题目要求学期结束,班主任决定表彰一批学生,已知该班学生数在6至50人之间,有三类学生:普通生,特招运动员,学科专长生,其中学科专长生不超过5人。主函数根据输入的信息,相应建立GroupA,GroupB,GroupC类对象。GroupA类是普通生,有2门课程的成绩(均为不超过100的非负整数);GroupB类是特招运......
  • [C++/PTA] 2017Final进位与借位
    题目要求凤湖小学二年级的陈老师吃惊地发现班上的同学竟然可以分成三类,一类总是可以正确地完成三位整数加减法(GroupA);一类总是可以正确地完成三位整数的加法,但对于减法运算来说,总是忘记借位的处理(GroupB);剩下的人总是忘记加法的进位,也总是忘记减法的借位(GroupC)。现在请给出......