精华内容
下载资源
问答
  • 主要为大家详细介绍了C语言使用链表实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • C语言嵌套链表实现学生成绩管理系统 链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。 场景: 一个年级,相当链表A 该年级5个班,每个班5个人,相当于链表B1--B5 ...定义学生链表的结点

    C语言嵌套链表实现学生成绩管理系统

    链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。 场景: 一个年级,相当链表A 该年级5个班,每个班5个人,相当于链表B1--B5 做一个学生成绩管理系统 学生成绩有语文 数学 英语 功能: 录入成绩 找三科总分的最高分 最低分 算出平均分

    提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。

    链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。

    链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。

    说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

    作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。
    C语言嵌套链表实现学生成绩管理系统:熟悉链表的创建,结构体指针的使用。

    实现思路:创建学生链表->创建班级链表
    其中
    学生链表的结点的数据域存放学生的信息;
    班级链表的结点的数据域为指向学生链表头结点的指针;
    利用这样的嵌套链表实现多个班级,以及每个班级多个学生的成绩管理。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、代码实现

    1.包含头文件

    代码如下(示例):

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

    2.定义学生链表的结点

    代码如下(示例):

    struct Student //声明学生链表的节点
    {
            int chinese;
            int math;
            int english;
            int sum;
            struct Student* next;
    };
    
    
    

    3.定义班级链表的结点

    代码如下(示例):

    struct Class//声明班级链表的节点
    {
            struct Student* student;
            struct Class* next;
    };
    
    
    
    

    4.创建一个新的学生链表的结点并且通过尾插法插入链表中

    代码如下(示例):

    struct Student* CreateStudentNode(struct Student*head,int num)//生成一个新的学生节点并且利用尾插法插入链表中
    {
            struct Student* p=NULL;
            struct Student* node=(struct Student*)malloc(sizeof(struct Student));//为新节点开辟空间
            //初始化新节点
            node->next=NULL;
            printf("输入第%d个学生的信息:(语文 数学 英语)\n",num+1);
            scanf("%d %d %d",&node->chinese,&node->math,&node->english);
            node->sum=node->chinese+node->math+node->english;
    
            if(head->next==NULL){                                     //链表只有一个节点时
                    head->next=node;
                    return head;
            }
            else{                                                     //链表有多个节点时  将指针p移到链表尾  
                    p=head;
                    while(p->next!=NULL){    p=p->next;  }      //将指针p移到链表尾     
            }
    
            p->next=node;
            return head;
    }
    
    
    
    
    

    5.生成学生链表

    代码如下(示例):

    struct Student* init_StudentLink()//生成学生链表
    {
            int sum,i;
            struct Student* head=(struct Student*)malloc(sizeof(struct Student));//生成头节点
            struct Student* p=NULL;
            scanf("%d",&sum);//学生数
            for(i=0;i<sum;i++){
    
                    p=CreateStudentNode(head,i);
    
            }
    
            return p;
    }
    
    

    6.创建一个新的班级链表的结点并且通过尾插法插入链表中

    代码如下(示例):

    struct Class* CreateClassNode(struct Class* head,int num)//生成一个新的班级节点并且利用尾插法插入链表中
    {
            struct Class* p=NULL;
            struct Class* node=(struct Class*)malloc(sizeof(struct Class));
            node->next=NULL;
            struct Student* q=NULL;
    
            printf("输入第%d班级的人数:\n",num+1);
            q=init_StudentLink();
            node->student=q;
    
            if(head->next==NULL){
                    head->next=node;
            }
            else{
                    p=head;
                    while(p->next!=NULL){ p=p->next; }
    
            }
    
            return 0;
    
    }
    
    
    

    7.生成班级链表

    代码如下(示例):

    void init_Class(struct Class* head)//生成班级链表
    {
            int sum,i;
            printf("请输入建立的班级数\n");
            scanf("%d",&sum);
            for(i=0;i<sum;i++){
                    CreateClassNode(head,i);
            }
    
    }
    

    8.打印结点信息

    代码如下(示例):

    void printf_node(struct Class *head)//打印节点信息
    {
            int max,min;
            struct Class *q=NULL;
            struct Student *p=NULL;
            q=head->next;
            min=max=q->student->next->sum;
            printf("*****************************************************************************************************\n");
            printf("成绩统计\t(语文\t数学\t英语\t总分\t平均分)\n");
            printf("*****************************************************************************************************\n");
    
            int i=0,j=0;
            p=q->student->next;
            while(q){
                    i++;
                    for(p;p->next!=NULL;p=p->next){
                            j++;
                            printf("第%d班第%d学生的成绩\n",i,j);
                            printf("语文:%d 数学:%d  英语:%d 总分:%d 平均分:%lf\n",p->chinese,p->math,p->english,p->sum,(double)(p->sum)/3);
                            if(p->sum>max){
                                    max=p->sum;
                            }
                            if(p->sum<min){
                                    min=p->sum;
                            }
    
                    }
                    printf("\n");
                    q=q->next;
                    j=0;
            }
    
            printf("总分最高为:%d\n",max);
            printf("总分最低为:%d\n",min);
    }
    
    

    9,主函数

    代码如下(示例):

    int main()
    {
    
            struct Class* head=(struct Class*)malloc(sizeof(struct Class));
            head->next=NULL;//生成班级头结点
            init_Class(head);//生成班级链表
            printf_node(head);//打印信息
    
            return 0;
    }
    
    

    展开全文
  • c语言链表结构,实现一个学生管理系统,并将信息保存到本地文件。
  • c语言嵌套链表实现学生成绩管理系统 第一次写博客,把学习过程记录下来,望大佬路过指正 如题: 链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。 场景:一个年级,相当链表A 该年级5个班,每个班5个人,...

    c语言嵌套链表实现学生成绩管理系统

    第一次写博客,把学习过程记录下来,望大佬路过指正

    如题:
    链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。
    场景:一个年级,相当链表A
    该年级5个班,每个班5个人,相当于链表B1–B5
    做一个学生成绩管理系统
    学生成绩有语文 数学 英语
    功能: 录入成绩 找三科总分的最高分 最低分 算出平均分

    此题考验了我们的链表嵌套,链表的掌握程度及C语言

    下面为我的一些见解:
    我用的是while循环,我写的代码在打印学生成绩这一步总是会一直循环,然后自己退出执行,这是我遇到的问题。
    造成这个问题是因为我在写链表时没有把链表的尾节点指向NULL,变成了野指针,指向了垃圾内存。
    解决这个问题可以用for循环加一个限制次数,也可以把我们链表的尾节点指向NULL。
    下面我写的代码:
    首先我们要定义两个结构体,class和student
    在这里插入图片描述

    然后我们要实现第一个功能(插入学生的信息)
    在这里插入图片描述
    实现第二个功能(插入班级信息)
    在这里插入图片描述
    实现第三个功能(打印学生信息)
    在这里插入图片描述
    实现第四个功能(找年级的极值)
    在这里插入图片描述
    实现第五个功能(算出平均值)
    在这里插入图片描述
    第六,输出

    展开全文
  • C语言链表实现学生籍贯管理系统 //源码 #include<stdio.h> #include<stdlib.h> #include<string.h> //定义一个学生结构体 typedef struct student { char no[12]; //学号 char name[40]; //...

    C语言用链表实现学生籍贯管理系统
    //源码

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    //定义一个学生结构体
    typedef struct student
    {
        char no[12];            //学号
        char name[40];          //姓名
        char tele[20];          //电话号码
        int D[18];              //电话号码码
        char jg[60];            //籍贯
        char addr[80];          //通讯地址
        struct student* next;   //指向下一节点的指针
    }STU;
    
    //函数声明放在这里
    STU* LIstInit(STU* L);
    STU* ListCreate(STU* L, int n);
    void ListInsert(STU* L);
    void ListDelete(STU* L, char n[40]);
    void LIstSearch(STU* L, char n[]);
    void input(STU* p, int i);
    void output(STU* L);
    void menu();
    
    //创建表头,初始化链表
    STU* LIstInit(STU* L)
    {
        STU* head = NULL;
        head = (STU*)malloc(sizeof(STU));
        head->next = NULL;
        L = head;
        return L;
    }
    
    //创建链表,将新生成的节点插入到链表的表头
    STU* ListCreate(STU* L, int n)
    {
        int i;
        for (i = 0; i < n; i++)
        {
            STU* p;
            //将新生成的节点插入到链表中
            p = NULL;
            p = (STU*)malloc(sizeof(STU));
            input(p, i);
            p->next = L->next;
            L->next = p;
        }
        return L;
    }
    
    //对链表进行节点的插入操作
    void ListInsert(STU* L)
    {
        STU* s = NULL;
        //生成一个新节点s
        s = (STU*)malloc(sizeof(STU));
        printf("请输入您要插入的学生的学号:");
        scanf("%s", &s->no);
        printf("请输入您要插入的学生的姓名:");
        scanf("%s", &s->name);
        printf("请输入您要插入的学生的电话号码:");
        scanf("%s", &s->tele);
        printf("请输入您要插入的学生的身份证号码:");
        scanf("%s", &s->D);
        printf("请输入您要插入的学生的籍贯:");
        scanf("%s", &s->jg);
        printf("请输入您要插入的学生的通讯地址:");
        scanf("%s", &s->addr);
        s->next = L->next;
        L->next = s;
    }
    
    //对链表的进行节点的删除操作
    void ListDelete(STU* L, char n[])
    {
        STU* p = L->next, * pre = L;  //定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点
        if (p == NULL)
            printf("数据为空,无法删除!");
        else
        {
            while (strcmp(p->name, n) != 0)
            {
                pre = p;
                p = pre->next;
                if (p == NULL)
                {
                    printf("没有找到相关信息,无法删除\n");
                    return;
                }
            }
            pre->next = p->next;
            free(p);
            printf("删除成功");
        }
    }
    
    void LIstSearch(STU* L, char n[])
    {
        STU* p = L->next;
        if (p == NULL)
            printf("数据为空,无法查找!");
        else
        {
            while (strcmp(p->name, n) != 0)
            {
                p = p->next;
                if (p == NULL)
                {
                    printf("没有找到相关信息\n");
                    return;
                }
            }
            printf("该学生的籍贯为:\n");
            printf("\t%s\n", p->jg);
        }
    }
    
    void ListModify(STU* L, char na[])
    {
        char JG[60];
        STU* p = L->next;
        while (p != NULL)
        {
            if (strcmp(p->name, na) == 0)
            {
                printf("请选择您修改后的学生籍贯:\n");
                scanf("%s", &JG);
                strcpy(p->jg, JG);
                break;
            }
            p = p->next;
        }
    }
    
    void input(STU* p, int i)
    {
        printf("请输入第%d名学生的学号:", i + 1);
        scanf("%s", &p->no);
        printf("请输入第%d名学生的姓名:", i + 1);
        scanf("%s", &p->name);
        printf("请输入第%d名学生的电话号码:", i + 1);
        scanf("%s", &p->tele);
        printf("请输入第%d名学生的身份证号码:", i + 1);
        scanf("%s", &p->D);
        printf("请输入第%d名学生的籍贯:", i + 1);
        scanf("%s", &p->jg);
        printf("请输入第%d名学生的通讯地址:", i + 1);
        scanf("%s", &p->addr);
    }
    
    void output(STU* L)
    {
        STU* p = L->next;
        while (p != NULL)
        {
            printf("%s\t", p->no);
            printf("%s\t", p->name);
            printf("\t%s", p->tele);
            printf("\t\t%s", p->D);
            printf("\t%s", p->jg);
            printf("\t%s", p->addr);
            printf("\n");
            p = p->next;
        }
    }
    
    void PrintFile(STU* L)
    {
        STU* p = L->next;
        FILE* fp;
        fp = fopen("student.txt", "w");
        fprintf(fp, "学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
        while (p != NULL)
        {
            fprintf(fp, "%s\t", p->no);
            fprintf(fp, "%s\t", p->name);
            fprintf(fp, "\t%s", p->tele);
            fprintf(fp, "\t%s", p->D);
            fprintf(fp, "\t%s", p->jg);
            fprintf(fp, "\t\t%s", p->addr);
            fprintf(fp, "\n");
            p = p->next;
        }
        printf("保存成功,请到当前目录下的student.txt文件中查看");
        fclose(fp);
    }
    
    void menu()
    {
        printf("\n\n");
        printf("\t\t\t===================学试报名管理系统===================\n");
        printf("\t\t\t* 作者:XXX  班级:XXXXXXXX  学号:XXXXXXXXXXXXXXX      *\n");
        printf("\t\t\t*                                                  *\n");
        printf("\t\t\t*          1>. 录入学生的相关信息                    *\n");
        printf("\t\t\t*          2>. 全部学生的相关信息                    *\n");
        printf("\t\t\t*          3>. 查找某个就学生的籍贯                  *\n");
        printf("\t\t\t*          4>. 修改某个学生的籍贯                    *\n");
        printf("\t\t\t*          5>. 删除某个学生的相关信息                *\n");
        printf("\t\t\t*          6>. 插入某个学生的相关信息                *\n");
        printf("\t\t\t*          7>. 保存学生信息                         *\n");
        printf("\t\t\t*          0>. 退出管理系统                         *\n");
        printf("\t\t\t*                                    欢迎使用本系统!*\n");
        printf("\t\t\t=====================================================\n");
        printf("\t\t\t输入选项,按回车进入选项:                             \n");
    }
    
    int main()
    {
        int item, n;         //item用于接收输入的命令,n用于接收输入的学生人数
        char nam[30];
        STU* L = NULL;
        L = LIstInit(L);
        do
        {
            menu();
            printf("请输入相应的数字,进行相应的操作:\n");
            scanf("%d", &item);
            switch (item)
            {
            case 1:
                printf("请输入您要录入的学生人数:");
                scanf("%d", &n);
                L = ListCreate(L, n);
                break;
            case 2:
                printf("全部学生信息如下:\n");
                printf("学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
                output(L);
                break;
            case 3:
                printf("请输入您要查找的学生姓名:");
                scanf("%s", nam);
                LIstSearch(L, nam);
                break;
            case 4:
                printf("请输入您要修改的学生姓名:");
                scanf("%s", nam);
                ListModify(L, nam);
                break;
            case 5:
                printf("请输入您要删除的学生的姓名:");
                scanf("%s", nam);
                ListDelete(L, nam);
                break;
            case 6:
                ListInsert(L);
                break;
            case 7:
                PrintFile(L);
                break;
            case 0:
                printf("即将退出学生籍贯管理系统.....");
                exit(0);
            default:
                break;
            }
            printf("\n\n\n\n");
        } while (item);
        return 0;
    }
    
    

    部分运行结果截图
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • (使用C语言)(基本思路已给出) 基于链表学生成绩管理系统(1)输入5个学生3门课的成绩存入链表中; (2)输出学生信息; (3)求每个学生的平均分; (4)输入一个学号num,查找其学号等于num的学生。要求:用链表存放学生...
  • 学生管理系统(C语言综合链表实现)

    千次阅读 多人点赞 2019-04-08 14:39:39
    学生管理系统(C语言综合链表实现) 题目:定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项,分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针,其中:学号、姓名、...

    学生管理系统(C语言综合链表实现)

    题目:定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项,分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针,其中:学号、姓名、成绩是输入项,等级、名次是计算项。请按如下功能要求设计一个学生成绩管理程序,编程要求:

    ⑴ 设计main函数(10分):建立一个菜单系统,调用Creat_Link函数建立一个StuLink类型的学生链表;调用Insert_Node函数在链表尾插入一个新结点;调用Edit_Node函数修改链表中指定学号的结点;调用Delete_Node函数删除链表中指定学号的结点;调用Query_Node函数查询链表中指定学号的结点并显示查询结果;调用Rank_Link函数计算学生链表中每个学生的名次;调用Analysis_Link函数统计并返回各等级人数;调用Output_Link函数按指定数据项的顺序【学号(升序),或者,成绩(降序)】输出学生成绩表、各等级人数。
    ⑵ 设计Creat_Link函数(10分):建立一个StuLink类型的学生链表,返回链表头指针。每个链表结点代表一个学生信息,要求输入学号、姓名和成绩,其中:学号从1开始按递增1自动生成,成绩必须在[0,100]区间的整数,当输入成绩为-1时,表示输入结束。
    ⑶ 设计Insert_Node函数(10分):在链表尾插入一个新结点。新结点的学号是链表中最大学号加1,姓名和成绩从键盘输入(注意:成绩必须在[0,100]区间的整数),根据成绩计算等级。注意:插入结点会导致链表中各结点名次的变化。
    ⑷ 设计Edit_Node函数(10分):修改链表中指定学号的结点(注意:学号不能修改,成绩必须在[0,100]区间的整数)。注意:当修改成绩时会导致等级和名次的变化。
    ⑸ 设计Delete_Node函数(10分):删除链表中指定学号的结点。注意:删除操作需要重新计算链表中各结点的名次。
    ⑹ 设计Query_Node函数(10分):查询链表中指定学号的结点,并显示查询结果。
    ⑺ 设计Rank_Link函数(10分):计算学生链表中每个学生的名次。名次规则:按成绩降序排名,从第1名开始依次排名,若出现并列名次,则名次需要叠加。例如,若出现5个并列第1名,则没有第2名,下一个名次是第6名,依此类推。
    ⑻ 设计Analysis_Link函数(10分):统计并返回各等级人数。等级标准:
    A:90及以上 B:80及以上 C:70及以上 D:60及以上 E:60以下
    ⑼ 设计Sort_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】对学生链表进行排序。
    ⑽ 设计Output_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】输出学生成绩表、各等级人数。学生成绩表每行输出一个学生信息(依次为学号、姓名、成绩、等级和名次,各项间以1个空格隔开),各等级人数分行输出。

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    struct StuLink
    {
    	int xh;
    	char xm[20];
    	int cj;
    	char dj;
    	int mc;
    	struct StuLink *next;
    };
    
    
    struct StuLink* Creat_Link(struct StuLink* head);		//建立一个StuLink类型的学生链表
    struct StuLink* Insert_Node(struct StuLink * head);		//在链表尾插入一个新结点
    struct StuLink* Edit_Node(struct StuLink* head);		//修改链表中指定学号的结点
    struct StuLink* Delete_Node(struct StuLink* head);		//删除链表中指定学号的结点
    struct StuLink* Rank_Link(struct StuLink* head);		//计算学生链表中每个学生的名次
    void Query_Node(struct StuLink* head);					//查询链表中指定学号的结点
    void Analysis_Link(struct StuLink *head);				//统计并返回各等级人数
    void Sort_Link(struct StuLink* head,int n);				//按指定数据项的顺序(学号升序)(成绩降序)进行排序
    void Output_Link(struct StuLink *head,int n)			//按指定数据项的顺序(学号升序)(成绩降序)输出成绩 
    void display_by_xh(struct StuLink* head);				//将学生节点按学号升序排序 
    void display_by_cj(struct StuLink* head);				//将学生节点按学成绩降序排序
    void swap(struct StuLink* p1, struct StuLink* p2);		//交换两个节点的值 
    
    int main()
    {
    	int n;
    	struct StuLink *head=NULL;
    	while(1)
    	{
    		system("cls");
    		printf("     主菜单—学生成绩管理      \n");
    		printf(" =============================\n");
    		printf("|1-创建链表  	2-链表维护    |\n");
    		printf("|3-计算排序     4-统计分析    |\n");
    		printf("|5-报表输出     0-退出        |\n"); 
    		printf(" =============================\n");
    		printf("     请输入菜单编号(0-5):");
    		scanf("%d",&n);
    		while(!(n==1 || n==2 || n==3 || n==4 || n==5 || n == 0 ) )
    		{
    			printf("输入错误,请重新输入"); 
    			scanf("%d",&n);
    		}
    		if(n==0)
    		{
    			printf("感谢使用成绩管理系统,谢谢!");
    			break;
    		}
    		switch(n)
    		{
    			case 1:
    				head=Creat_Link(head);
    				fflush(stdin);
    				printf("\n按回车键继续\n"); 
    				getchar();
    				break;
    			case 2:
    				while(1)
    				{
    					system("cls");
    					printf("  二级菜单—链表维护管理\n");
    					printf(" ======================\n");
    					printf("|  1-添加一个学生信息  |\n");
    					printf("|  2-修改一个学生信息  |\n");
    					printf("|  3-删除一个学生信息  |\n");
    					printf("|  4-查询一个学生信息  |\n");
    					printf("|  0-退回上级菜单      |\n");
    					printf(" ======================\n");
    					printf("  请输入菜单编号(0-4):");
    					scanf("%d",&n);
    					while(!(n==1 || n==2 || n==3 || n==4 || n==5 || n == 0 ))
    					{
    						printf("输入错误,请重新输入"); 
    						scanf("%d",&n);
    					}
    					if(n==0)break;
    					else 
    						switch(n)
    						{
    							case 1:head=Insert_Node(head);break;
    							case 2:head=Edit_Node(head);break;
    							case 3:head=Delete_Node(head);break;
    							case 4:Query_Node(head);break;
    						}
    					fflush(stdin);
    					printf("请按回车键继续");
    					getchar();
    				}
    				break;
    			case 3:
    				while(1)
    				{
    					system("cls");
    					printf("        二级菜单—计算排序管理\n");
    					printf(" ======================================\n");
    					printf("|  1-计算学生名次    2-按学号升序排序  |\n");
    					printf("|  3-按成绩降序排序  0-返回上级菜单    |\n");
    					printf(" ======================================\n");
    					printf("         输入菜单编号(0-3): "); 
    					scanf("%d",&n);
    					while(!(n==1 || n==2 || n==3 || n == 0 ) )
    					{
    						printf("输入错误,请重新输入"); 
    						scanf("%d",&n);
    					}
    					if(n==0)break;
    					else 
    						switch(n)
    						{
    							case 1:head=Rank_Link(head),display_by_xh(head);break;
    							case 2:Sort_Link(head,2);break;
    							case 3:Sort_Link(head,3);break;
    						}
    					fflush(stdin);
    					printf("请按回车键继续");
    					getchar();
    
    				}
    				break;
    			case 4:
    				Analysis_Link(head);
    				fflush(stdin);
    				printf("请按回车键继续");
    				getchar();
    				break;
    			case 5:
    				while(1)
    				{
    					system("cls");
    					printf("        二级菜单—报表输出管理\n");
    					printf(" ========================================\n");
    					printf("|  1-学号升序  2-成绩降序 0-返回上级菜单 |\n"); 
    					printf(" ========================================\n");
    					printf("           输入菜单编号(0-2): "); 
    					scanf("%d",&n);
    					while(!(n==1 || n==2 || n==3 || n == 0  ) )
    					{
    						printf("输入错误,请重新输入"); 
    						scanf("%d",&n);
    					}
    					if(n==0)break;
    					else 
    						switch(n)
    						{
    							case 1:Output_Link(head,1);break;
    							case 2:Output_Link(head,2);break;
    						}
    					fflush(stdin);
    					printf("请按回车键继续");
    					getchar();
    				}
    
    		}
    
    	}
    	return 0;
    }
    
    
    struct StuLink* Creat_Link(struct StuLink* head)
    {
    	struct StuLink *p1=NULL, *p2=NULL;
    	int score=0,i=1;
    	char name[20];
    	printf("请输入学生姓名和成绩\n");
    	printf("(输入成绩为-1结束输入):\n");
    	while(1)
    	{
    		scanf("%s%d",name,&score);
    		while(!(score>=0 && score<=100) && score != -1)
    		{
    			printf("输入成绩错误,请重新输入:");
    			scanf("%s%d",name,&score);
    		}
    		if(score == -1)break;		
    		if((p1=(struct StuLink *)malloc(sizeof(struct StuLink)))==NULL)
    		{
    			printf("error");
    			exit(0);
    		}
    		p1->next=NULL; 	//当链表只有一个结点时,head的next为NULL 
    		p1->xh=i++;		//创建链表时学号自动生成 
    		strcpy(p1->xm,name);
    		p1->cj=score;
    		if(score>=90) p1->dj='A';
    		else if(score>=80 && score<90) p1->dj='B';
    		else if(score>=70 && score<80) p1->dj='C';
    		else if(score>=60 && score<70) p1->dj='D';
    		else p1->dj='E';
    		if(i==2)head=p1;
    		else p2->next=p1;
    		p2=p1;	
    	}
    
    	head=Rank_Link(head);
    	printf("\n名次计算结果和链表创建结果如下:\n"); 
    	display_by_xh(head); 
    	return head;
    }
    
    struct StuLink* Insert_Node(struct StuLink * head)
    {
    	struct StuLink *p1=head,*p0=NULL,*p2=NULL;
    	char name[20];
    	int score;
    	printf("请输入姓名和成绩:\n");
    	scanf("%s%d",name,&score);
    	while(!(score>=0 && score<=100) )
    	{
    		printf("输入成绩错误,请重新输入"); 
    		scanf("%s%d",name,&score);
    	} 
    	if((p0=(struct StuLink *)malloc(sizeof(struct StuLink)))==NULL)
    	{
    		printf("error");
    		exit(0);
    	}
    	strcpy(p0->xm,name);
    	p0->cj=score; 
    	if(score>=90) p0->dj='A';
    	else if(score>=80 && score<90) p0->dj='B';
    	else if(score>=70 && score<80) p0->dj='C';
    	else if(score>=60 && score<70) p0->dj='D';
    	else p0->dj='E';
    	p0->next=NULL;
    	if(p1==NULL)
    	{
    		p0->xh=1;			//若链表为空,学号为1 
    		head=p0,head->next=NULL;
    	} 
    	else
    	{
    		while(p1!=NULL)	//若不为空 
    		{
    			p2=p1;
    			p1=p1->next;
    		}	
    		p0->xh=p2->xh+1;		//新成学号为最大学号加一
    		p2->next=p0; 
    	}
    	head=Rank_Link(head);
    	printf("\n名次计算结果和链表插入结果如下:\n");
    	display_by_xh(head); 
    	return head;
    
    }
    
    struct StuLink* Rank_Link(struct StuLink* head)
    {
    	int i,count=0;
    	struct StuLink* p1=NULL,*p2=NULL;
    	for(p1=head;p1!=NULL;p1=p1->next)
    	{
    		for(p2=head;p2!=NULL;p2=p2->next)
    		{
    			if(p1->cj < p2->cj)count++;
    		}
    		p1->mc=count+1;
    		count=0;
    	}
    	return head;
    } 
    
    struct StuLink* Edit_Node(struct StuLink* head)
    {
    	struct StuLink *p=head;
    	int num;
    	printf("请输入要修改学生的学号:");
    	scanf("%d",&num);
    	while( p->xh != num && p->next!=NULL)
    	{
    		p=p->next;
    	}
    	if(p->xh==num)
    	{
    		int score;
    		char name[20];
    		printf("学号=%d,姓名=%s,成绩=%d,等级=%c,名次=%d\n",p->xh,p->xm,p->cj,p->dj,p->mc);
    		printf("请输入姓名和成绩:\n");
    		scanf("%s%d",name,&score);
    		while(!(score>=0 && score<=100) )
    		{
    			printf("输入成绩错误,请重新输入"); 
    			scanf("%s%d",name,&score);
    		}
    		strcpy(p->xm,name);
    		p->cj=score; 
    		if(score>=90) p->dj='A';
    		else if(score>=80 && score<90) p->dj='B';
    		else if(score>=70 && score<80) p->dj='C';
    		else if(score>=60 && score<70) p->dj='D';
    		else p->dj='E';
    		head=Rank_Link(head);
    		printf("\n名次计算结果和链表修改结果如下:\n");
    		display_by_xh(head);
    	}
    	else printf("该学号学生不存在\n"); 
    	return head;
    }
    
    struct StuLink* Delete_Node(struct StuLink* head)
    {
    	struct StuLink *p1,*p2;
    	int num;
    	printf("请输入删除的学生学号:");
    	scanf("%d",&num); 
    	p1=head;
    	while( num != p1->xh &&  p1->next!=NULL)
    	{
    		p2=p1;
    		p1=p1->next;
    	}
    	if(p1->xh==num)
    	{
    		if(head==p1)head=p1->next;
    		else p2->next=p1->next;
    		printf("删除成功\n");
    		head=Rank_Link(head);
    		printf("\n名次计算结果和链表删除结果如下:\n");
    		display_by_xh(head); 
    	}
    	else printf("找不到学号为%d的学生\n",num);
    	return head;
    }
    
    void Query_Node(struct StuLink* head)
    {
    	struct StuLink *p1=head;
    	int num;
    	printf("请输入要查询的学生学号:");
    	scanf("%d",&num);
    	while( num != p1->xh &&  p1->next!=NULL)
    	{
    		p1=p1->next;
    	}
    	if(p1->xh == num)
    	{
    		printf("学号=%d, 姓名=%s, 成绩=%d, 等级=%c 名次=%d \n",p1->xh,p1->xm,p1->cj,p1->dj,p1->mc);
    	}
    	else printf("找不到学号为%d的学生\n",num); 
    }
    
    void Analysis_Link(struct StuLink *head)
    {
    	int a[5]={0},i;
    	struct StuLink *p1=head;
    	while(p1 !=  NULL)
    	{
    		if(p1->dj == 'A') a[0]++;
    		else if(p1->dj == 'B') a[1]++;
    		else if(p1->dj == 'C') a[2]++;
    		else if(p1->dj == 'D') a[3]++;
    		else if(p1->dj == 'E') a[4]++;
    		p1=p1->next;
    	}
    	printf("A:90分及以上  B:80分及以上  C:70分及以上  D:60分及以上 E:60分以下\n");
    	printf("A级人数=%d\n",a[0]);
    	printf("B级人数=%d\n",a[1]);
    	printf("C级人数=%d\n",a[2]);
    	printf("D级人数=%d\n",a[3]);
    	printf("E级人数=%d\n",a[4]);
    }
    
    void Output_Link(struct StuLink *head,int n)
    {
    	if(n==1)display_by_xh(head);
    	else display_by_cj(head);
    }
    
    void Sort_Link(struct StuLink* head,int n)
    {
    	if(n==2)display_by_xh(head);
    	else display_by_cj(head);
    }
    
    void display_by_xh(struct StuLink* head)
    {	
    	struct StuLink *p=NULL, *p1=NULL;
    	for(p=head;p!=NULL;p=p->next)
    		for(p1=p->next;p1!=NULL;p1=p1->next)
    			if(p->xh > p1->xh)swap(p,p1); 
    	printf("学号\t\t姓名\t成绩\t等级\t名次\n");
    	for(p=head;p!=NULL;p=p->next)
    		printf("%d\t\t%s\t%d\t%c\t%d\n",p->xh,p->xm,p->cj,p->dj,p->mc);
    }
    
    void display_by_cj(struct StuLink* head)
    {
    	struct StuLink* p=NULL,*p1=NULL;
    	for(p=head;p!=NULL;p=p->next)
    		for(p1=p->next;p1!=NULL;p1=p1->next)
    			if(p->cj < p1->cj)swap(p,p1); 
    	printf("学号\t\t姓名\t成绩\t等级\t名次\n");
    	for(p=head;p!=NULL;p=p->next)
    		printf("%d\t\t%s\t%d\t%c\t%d\n",p->xh,p->xm,p->cj,p->dj,p->mc);
    }
    
    void swap(struct StuLink* p1, struct StuLink* p2)
    {
    	int temp;
    	char c_temp;
    	char t_name[20];
    	c_temp=p1->dj,p1->dj=p2->dj,p2->dj=c_temp;
    	strcpy(t_name,p1->xm);
    	strcpy(p1->xm,p2->xm);
    	strcpy(p2->xm,t_name);
    	temp=p1->xh, p1->xh=p2->xh, p2->xh=temp;
    	temp=p1->cj, p1->cj=p2->cj, p2->cj=temp;
    	temp=p1->mc, p1->mc=p2->mc, p2->mc=temp;
    } 
    
    展开全文
  • C语言双向链表实现

    千次阅读 2017-09-10 17:53:26
    链表是计算机编程中常用的一种数据结构,在大部分面向对象的编程语言中都会有封装好的类供用户直接使用,只有在数据结构课程中,老师才会要求学生用代码实现一个链表,而如果用C语言实现链表,除了要了解链表的特性...
  • C语言链表实现学生信息管理系统 问题分析及任务描述 用链表这种存储结构,每个学生作为一个数据元素,包括date1(每个学生的信息),date2(每个学生的成绩信息)这两个数据项,用结构体详细定义date1中的学号,姓名...
  • 通过C语言编程的基于链表学生成绩管理系统,实现学生成绩管理的各个功能
  • 使用c语言单向链表实现简单学生成绩管理系统 本文优化整个代码框架结构,完善用户可以对系统信息的修改。本例中,使用一系列c语言知识,有利于巩固c语言语法,具体包括结构体,枚举,while循环,switch语句,还有...
  • C语言链表学习

    2021-01-18 18:24:08
    C语言链表 一.引言 假设需要建立一个学生信息表,学生人数无法估计,而且学生人数经常发生变化,应该如何实现? 一般我们会想到用数组来存储,但是数组属于静态存储分配,必须事先确定容量,故无法实现; 因此引出...
  • 2. 可随时添加学生信息,将新加入的学生信息按学号顺序添加到链表中 3. 设计遍历输出函数 3. 设计查找函数,根据学号查找或姓名查找 5. 可随时删除学生信息,根据学号删除 #!/usr/bin/env C # -*- coding:utf-...
  • C语言链表知识编出了简单的学生管理系统,可实现创建、查询、删除、排序、保存、读取等功能
  • 链接C语言,单链表实现,读入信息 /*头文件*/ #include <stdio.h> #include<dos.h> /*dos.h包含了与dos相关的结构、flags等数据,还有dos相关的低级IO函数、 内存访问函数、中断访问函数等等。 */ #...
  • 做一个学生成绩管理系统,学生成绩有语文 数学 英语 功能: 录入成绩 找三科总分的最高分 最低分 算出平均分 首先定义两个结构体变量分别是Class类和Student类。 struct Class { struct Student *phead; struct ...
  • 【例子】C语言链表的使用简单例子:使用链表存放学生的数据,并且能够删除或插入结点C语言链表的使用什么是链表描述代码运行结果 C语言链表的使用 什么是链表 略 描述 使用链表存放学生的数据(学号、姓名) ...
  • C语言写的学生报名管理系统 //代码 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> int temp, hh; typedef struct { char stu_name[40]; //姓名 int ...
  • 使用c语言单向链表实现简单学生成绩管理系统 链表是一种基本的数据结构类型,可以实现对信息的管理,实现此系统,需要定义一个管理信息的数据类型结构体,然后 对数据信息进行增删改查即可。 本文定义一个个人成绩...
  • C语言链表做一个简单的学生成绩管理系统简单的学生成绩管理系统介绍代码声明所需要的头文件和定义代码结构体的建立班级链表的建立简单的学生成绩管理系统介绍所需要的头文件和定义代码结构体的建立班级链表的建立 ...
  • 使用c语言单向链表实现简单学生成绩管理系统 现在这个简单系统不能保存数数据,不能退出,本文使用lo操作将链表中维护的数据保存到文件中,即退出保存,重新运行再从文件中提取数据。 #include<stdio.h> #...
  • C语言常见课后题目,完成基于链表结构的学生成绩管理系统

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,385
精华内容 554
关键字:

c语言学生链表

c语言 订阅