0


学生信息管理系统(链表&&C语言)

目录

1.头文件和预处理

#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<stdbool.h>#include<iostream>usingnamespace std;#define NO_LENGTH  20#define NAME_LENGTH 11

2.定义学生结构体的数据结构

typedefstruct Student{char studentNo[NO_LENGTH];char studentName[NAME_LENGTH];int score;}st;

3.定义每条记录或节点的数据结构

/* 定义每条记录或节点的数据结构 */typedefstruct node
{struct Student data;//数据域struct node *next;//指针域}Node,*Link;//Node为node类型的别名,Link为node类型的指针别名

4.函数接口代码.

1.定义提示菜单

//定义提示菜单voidmyMenu(){printf("*****************************菜单*****************************\n");printf("***********************1 增加学生记录*************************\n");printf("***********************2 删除学生记录*************************\n");printf("***********************3 查找学生记录*************************\n");printf("***********************4 修改学生记录*************************\n");printf("***********************5 统计学生人数 ************************\n");printf("***********************6 显示学生记录*************************\n");printf("***********************7 退出系统 ****************************\n");}

2.增加学生记录

voidinputStudent(Link l){printf("请输入学生学号:");scanf("%s",l->data.studentNo);printf("请输入学生的姓名:");scanf("%s",l->data.studentName);printf("请输入学生的成绩:");scanf("%s",&(l->data.score));//每个新创建的节点的next域都初始化为NULL
     l->next =NULL;system("cls");}

3.输入学号接口·

voidinputStudentNo(char s[],char no[]){printf("请输入要%s的学生学号:",s);scanf("%s",no);}

4.遍历表中学生

//遍历表中学生 voiddisplayNode(Link head){if(head==NULL){printf("学生为空\n");return;}else{
        Link p=head->next;while(p){
            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;}}// 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息system("pause");system("cls");}

5.增加学生记录

/* 增加学生记录 */booladdNode(Link head){
     Link p,q;//p,q两个节点一前一后
     Link node;//node指针指向新创建的节点
     node=(Link)malloc(sizeof(Node));inputStudent(node);

     q = head;
     p = head->next;//q指向head后面的第一个有效节点if(head->next==NULL)//链表为空时
        head->next = node;else{//循环访问链表中的所有节点while(p !=NULL){if(node->data.studentNo < p->data.studentNo){//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                q->next = node;
                node->next = p;returntrue;}else{//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                q = p;
                p = p->next;}}//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
        q->next = node;}returntrue;system("pause");system("cls");}

6.删除学生信息

//删除学生信息booldeleteNode(Link head){// 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false//输入要处理的学号char no[NO_LENGTH];inputStudentNo("删除",no);
        Link p=head->next;
    Link q=head;while(p){if(strcmp(p->data.studentNo,no)==0){
            q->next=p->next;free(p);system("pause");system("cls");returntrue;}else{
            q=p;
            p=p->next;}}system("pause");system("cls");returnfalse;}

7.查找学生信息

//查找学生信息 boolqueryNode(Link head){// 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false//输入要处理的学号char no[NO_LENGTH];inputStudentNo("查找",no);
        Link p=head->next;while(p){if(strcmp(p->data.studentNo,no)==0){system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;returntrue;}else{
            p=p->next;}}system("cls");returnfalse;}

8.修改学生信息

//修改学生信息 boolmodifyNode(Link head){// 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false//输入要处理的学号char no[NO_LENGTH];inputStudentNo("修改",no);
    Link p=head->next;while(p){if(strcmp(p->data.studentNo,no)==0){
            cout<<"请输入修改后的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"请输入修改后的学号"<<endl; 
            cin>>p->data.studentNo;
            cout<<"请输入修改后的成绩"<<endl; 
            cin>>p->data.score;system("cls");returntrue;}else{
            p=p->next;}}system("cls");returnfalse;}

9.统计学生人数

//统计学生人数intcountNode(Link head){//统计学生人数,扫描链表统计节点个数,返回节点数
    Link p;int count =0;
    p = head->next;while(p){
        p=p->next;
        count++;}//填充代码system("cls");return count;}

10.清空链表

//清空链表 voidclearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;while(p){
        q->next=p->next;free(p);
        p=q->next;}//遍历链表,用free语句删除链表中用malloc建立起的所有的节点}

5.main函数

intmain(){int select;int count;
    Link head;// 定义链表//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
    head =(Link)malloc(sizeof(Node));
    head->next =NULL;while(1){myMenu();printf("\n请输入你的选择(0-7):");//显示提示信息scanf("%d",&select);switch(select){case1://增加学生记录if(addNode(head))printf("成功插入一个学生记录。\n\n");break;case2://删除学生记录if(deleteNode(head))printf("成功删除一个学生记录。\n\n");elseprintf("没有找到要删除的学生节点。\n\n");break;case3://查询学生记录if(queryNode(head))printf("成功找到学生记录。\n\n");elseprintf("没有找到要查询的学生节点。\n\n");break;case4://修改学生记录if(modifyNode(head))printf("成功修改一个学生记录。\n\n");elseprintf("没有找到要修改的学生节点。\n\n");break;case5://统计学生人数
            count =countNode(head);printf("学生人数为:%d\n\n",count);break;case6://显示学生记录displayNode(head);break;case7://退出前清除链表中的所有结点clearLink(head);return0;default:printf("输入不正确,应该输入0-7之间的数。\n\n");system("cls");break;}}return0;}

6.总源码(可直接复制运行)

#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<stdbool.h>#include<iostream>usingnamespace std;#define NO_LENGTH  20#define NAME_LENGTH 11/* 定义学生结构体的数据结构 */typedefstruct Student{char studentNo[NO_LENGTH];char studentName[NAME_LENGTH];int score;}st;/* 定义每条记录或节点的数据结构 */typedefstruct node
{struct Student data;//数据域struct node *next;//指针域}Node,*Link;//Node为node类型的别名,Link为node类型的指针别名//定义提示菜单voidmyMenu(){printf("*****************************菜单*****************************\n");printf("***********************1 增加学生记录*************************\n");printf("***********************2 删除学生记录*************************\n");printf("***********************3 查找学生记录*************************\n");printf("***********************4 修改学生记录*************************\n");printf("***********************5 统计学生人数 ************************\n");printf("***********************6 显示学生记录*************************\n");printf("***********************7 退出系统 ****************************\n");}voidinputStudent(Link l){printf("请输入学生学号:");scanf("%s",l->data.studentNo);printf("请输入学生的姓名:");scanf("%s",l->data.studentName);printf("请输入学生的成绩:");scanf("%d",&(l->data.score));//每个新创建的节点的next域都初始化为NULL
     l->next =NULL;system("cls");}voidinputStudentNo(char s[],char no[]){printf("请输入要%s的学生学号:",s);scanf("%s",no);}//遍历表中学生 voiddisplayNode(Link head){if(head==NULL){printf("学生为空\n");return;}else{
        Link p=head->next;while(p){
            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;}}// 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息system("pause");system("cls");}/* 增加学生记录 */booladdNode(Link head){
     Link p,q;//p,q两个节点一前一后
     Link node;//node指针指向新创建的节点
     node=(Link)malloc(sizeof(Node));inputStudent(node);

     q = head;
     p = head->next;//q指向head后面的第一个有效节点if(head->next==NULL)//链表为空时
        head->next = node;else{//循环访问链表中的所有节点while(p !=NULL){if(node->data.studentNo < p->data.studentNo){//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                q->next = node;
                node->next = p;returntrue;}else{//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                q = p;
                p = p->next;}}//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
        q->next = node;}returntrue;system("pause");system("cls");}booldeleteNode(Link head){// 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false//输入要处理的学号char no[NO_LENGTH];inputStudentNo("删除",no);
        Link p=head->next;
    Link q=head;while(p){if(strcmp(p->data.studentNo,no)==0){
            q->next=p->next;free(p);system("pause");system("cls");returntrue;}else{
            q=p;
            p=p->next;}}system("pause");system("cls");returnfalse;}//查找学生信息 boolqueryNode(Link head){// 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false//输入要处理的学号char no[NO_LENGTH];inputStudentNo("查找",no);
        Link p=head->next;while(p){if(strcmp(p->data.studentNo,no)==0){system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;returntrue;}else{
            p=p->next;}}system("cls");returnfalse;}//修改学生信息 boolmodifyNode(Link head){// 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false//输入要处理的学号char no[NO_LENGTH];inputStudentNo("修改",no);
    Link p=head->next;while(p){if(strcmp(p->data.studentNo,no)==0){
            cout<<"请输入修改后的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"请输入修改后的学号"<<endl; 
            cin>>p->data.studentNo;
            cout<<"请输入修改后的成绩"<<endl; 
            cin>>p->data.score;system("cls");returntrue;}else{
            p=p->next;}}system("cls");returnfalse;}//统计学生人数intcountNode(Link head){//统计学生人数,扫描链表统计节点个数,返回节点数
    Link p;int count =0;
    p = head->next;while(p){
        p=p->next;
        count++;}//填充代码system("cls");return count;}//清空链表 voidclearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;while(p){
        q->next=p->next;free(p);
        p=q->next;}//遍历链表,用free语句删除链表中用malloc建立起的所有的节点}intmain(){int select;int count;
    Link head;// 定义链表//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
    head =(Link)malloc(sizeof(Node));
    head->next =NULL;while(1){myMenu();printf("\n请输入你的选择(0-7):");//显示提示信息scanf("%d",&select);switch(select){case1://增加学生记录if(addNode(head))printf("成功插入一个学生记录。\n\n");break;case2://删除学生记录if(deleteNode(head))printf("成功删除一个学生记录。\n\n");elseprintf("没有找到要删除的学生节点。\n\n");break;case3://查询学生记录if(queryNode(head))printf("成功找到学生记录。\n\n");elseprintf("没有找到要查询的学生节点。\n\n");break;case4://修改学生记录if(modifyNode(head))printf("成功修改一个学生记录。\n\n");elseprintf("没有找到要修改的学生节点。\n\n");break;case5://统计学生人数
            count =countNode(head);printf("学生人数为:%d\n\n",count);break;case6://显示学生记录displayNode(head);break;case7://退出前清除链表中的所有结点clearLink(head);return0;default:printf("输入不正确,应该输入0-7之间的数。\n\n");system("cls");break;}}return0;}

7.测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


本文转载自: https://blog.csdn.net/qq_59708493/article/details/122437867
版权归原作者 Domo泷 所有, 如有侵权,请联系我们删除。

“学生信息管理系统(链表&amp;&amp;C语言)”的评论:

还没有评论