-
2021-11-26 15:11:13
#include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> typedef struct score { int score_c; //C语言成绩 int score_math; //高等数学 int score_english; //大学英语成绩 }Score; typedef struct Student { char name[100]; //姓名 char num[100]; //学号 char sex; //性别 (m代表女生f代表男生) int age; //年龄 Score score; //成绩 }stu; typedef struct LNode { stu data; struct LNode* next; }LinkList; char nam[100];//名字 char nu[100];//学号 char s;//性别 int ag;//年龄 Score sc;//成绩 void menu()/* 菜单界面*/ { printf("\t\t\t ******************************************************\n\n"); printf("\t\t\t * 学生信息管理系统 * \n\n"); printf("\t\t\t ******************************************************\n\n"); printf("\t\t\t*********************系统功能菜单*************************\n"); printf("\t\t\t ---------------------- ---------------------- \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 0.系统帮助及说明 * * 1.刷新学生信息 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 2.查询学生信息 * * 3.修改学生信息 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 4.增加学生信息 * * 5.按学号删除信息 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 6.显示当前信息 * * 7.保存当前学生信息* \n"); printf("\t\t\t ********************** ********************** \n"); printf("\t\t\t * 8.退出系统 * \n"); printf("\t\t\t ********************** \n"); printf("\t\t\t ---------------------- ---------------------- \n"); } void help()/*帮助界面*/ { printf("\n\t\t\t0.欢迎使用系统帮助!\n"); printf("\n\t\t\t1.初次进入系统后,请先选择增加学生信息;\n"); printf("\n\t\t\t2.按照菜单提示键入数字代号;\n"); printf("\n\t\t\t3.增加学生信息后,切记保存;\n"); printf("\n\t\t\t4.谢谢您的使用!\n"); system("pause"); } void InitList(LinkList *&L)//初始化链表 { L = (LinkList*)malloc(sizeof(LinkList)); L->next = NULL; } void LinkInsert(LinkList*& L, LinkList* p) {//插入 LinkList* q= NULL; q = L; p->next = q->next; q->next = p; L = q; } void addstu(LinkList*& L) { printf("请输入学生的信息:\n"); printf("学号:"); scanf_s("%s", nu,15); LinkList* q = L->next; while (q != NULL) //用于判断学生信息是否已经存在 { if (0 == strcmp(q->data.num, nu)) { printf("该学生已存在\n"); break; } q = q->next; } if (q == NULL) { LinkList* p; InitList(p); strcpy_s(p->data.num, nu); printf("姓名:"); scanf_s("%s", nam,15); strcpy_s(p->data.name, nam); printf("性别:(m为男 f为女)"); scanf_s(" %c", &s,4); p->data.sex = s; printf("年龄:"); scanf_s("%d", &ag); p->data.age = ag; printf("C语言成绩:"); scanf_s("%d", &sc.score_c); while (sc.score_c < 0 || sc.score_c>100) { printf("输入有误,请重新输入\n"); scanf_s("%d", &sc.score_c); } p->data.score.score_c = sc.score_c; printf("高等数学成绩:"); scanf_s("%d", &sc.score_math); while (sc.score_math < 0 || sc.score_math>100) { printf("输入有误,请重新输入\n"); scanf_s("%d", &sc.score_math); } p->data.score.score_math = sc.score_math; printf("大学英语成绩:"); scanf_s("%d", &sc.score_english); while (sc.score_english < 0 || sc.score_english>100) { printf("输入有误,请重新输入\n"); scanf_s("%d", &sc.score_english); } p->data.score.score_english = sc.score_english; LinkInsert(L, p); } } void deletestu(LinkList*& L) { printf("请输入要删除学生的学号:\n"); scanf_s("%s", nu,15); LinkList* p, * pre; if (L->next == NULL) { printf("还没有学生的信息,请增加学生信息\n"); return; } pre = L; p = pre->next; int judge = 0; while (p) { if (0==strcmp(p->data.num, nu)) { judge = 1; pre->next = p->next; free(p); printf("删除成功\n"); break; } pre = p; p = pre->next; } if (judge == 0) { printf("该学生不存在\n"); } } void changestu(LinkList*& L) { int judge = 0; printf("请输入改变学生学号:\n"); scanf_s("%s", nu,15); LinkList* q = L->next; if (q != NULL) { if (0 == strcmp(q->data.num, nu)) { judge = 1; printf("请输入修改目标:1.姓名 2.成绩 3.年龄\n"); int choose; scanf_s("%d", &choose); switch (choose) { case 1: printf("请输入您要修改的名字:"); scanf_s("%s", nam,15); printf("修改的名字为:%s\n", nam); strcpy_s(q->data.name, nam); printf("修改名字成功!\n"); system("pause"); break; case 2: printf("请输入您要修改的成绩:"); scanf_s("%d%d%d", &sc.score_c, &sc.score_math, &sc.score_english); printf("修改的c成绩为:%d 修改的高等数学成绩为:%d 修改的大学英语成绩为:%d\n", sc.score_c, sc.score_math, sc.score_english); q->data.score = sc; printf("修改成绩成功!\n"); system("pause"); break; case 3: printf("请输入您要修改的年龄:"); scanf_s("%d",&ag); printf("修改的年龄为:%d\n", ag); q->data.age=ag; printf("修改年龄成功!\n"); system("pause"); break; } } if (judge == 0) { printf("该学生不存在\n"); system("pause"); } } } void findstu(LinkList*& L) { int flag; printf("请选择查询方式:\n"); printf("1.学号\n"); printf("2.姓名\n"); scanf_s("%d", &flag); LinkList* q = L->next; if (flag == 1) { printf("1.请输入查询学生学号:\n"); scanf_s("%s", nu,15); while (q != NULL) { if (0 == strcmp(q->data.num, nu)) { printf("姓名:%s\n", q->data.name); printf("学号:%s\n", q->data.num); printf("性别:%c\n", q->data.sex); printf("年龄:%d\n", q->data.age); printf("c语言成绩:%d\n", q->data.score.score_c); printf("高等数学成绩:%d\n", q->data.score.score_math); printf("大学英语成绩:%d\n", q->data.score.score_english); break; } q = q->next; } } if(flag==2) { printf("2.请输入姓名:\n"); scanf_s("%s", nam, 15); while (q != NULL) { if (0 == strcmp(q->data.name, nam)) { printf("姓名:%s\n", q->data.name); printf("学号:%s\n", q->data.num); printf("性别:%c\n", q->data.sex); printf("年龄:%d\n", q->data.age); printf("c语言成绩:%d\n", q->data.score.score_c); printf("高等数学成绩:%d\n", q->data.score.score_math); printf("大学英语成绩:%d\n", q->data.score.score_english); break; } q = q->next; } } if (q == NULL) { printf("查询不到该学生信息\n"); } } void display(LinkList*& L) { LinkList* q = L->next; if (q == NULL) { printf("还没有学生信息,请增加学生信息\n"); return; } while (q) { printf("姓名:%s\t", q->data.name); printf("学号:%s\t", q->data.num); printf("性别:%c\t", q->data.sex); printf("年龄:%d\t", q->data.age); printf("c语言成绩:%d\t", q->data.score.score_c); printf("高等数学成绩:%d\t", q->data.score.score_math); printf("大学英语成绩:%d\n", q->data.score.score_english); q = q->next; } } void sort(LinkList* L)//按学号排序排序 并输出排序后的结果 { LinkList* q, * p, * r = L->next; //判断 if (r == NULL) { printf("还没有学生信息,请增加学生信息\n"); return; } while (r) //两层循环完成排序 { p = r; q = r->next; LinkList* tmp;//用于排序时暂存节点 InitList(tmp); while (q) { if (q->data.num < p->data.num) //学号由小到大 { /*先复制q结点信息到tmp*/ strcpy_s(tmp->data.num, q->data.num); strcpy_s(tmp->data.name, q->data.name); tmp->data.sex = q->data.sex; tmp->data.age = q->data.age; tmp->data.score = q->data.score; /*再复制p结点信息到q*/ strcpy_s(q->data.num, p->data.num); strcpy_s(q->data.name, p->data.name); q->data.sex = p->data.sex; q->data.age = p->data.age; q->data.score = p->data.score; /*最后复制exchange结点信息到p*/ strcpy_s(p->data.num, tmp->data.num); strcpy_s(p->data.name, tmp->data.name); p->data.sex = tmp->data.sex; p->data.age = tmp->data.age; p->data.score = tmp->data.score; } q = q->next; } r = r->next; } printf("刷新后的学生信息是:\n"); display(L); } void save(LinkList*& L) { FILE* fp; LinkList* p = L->next; fopen_s(&fp, "D:\\study-C++\\project1\\student.txt", "w+"); if (!fp) { printf("打不开此文件,按任意键退出\n"); exit(1); } if (fp != 0) { while (p) { fprintf(fp, "%s %s %c %d %d %d %d \n", p->data.num, p->data.name, p->data.sex, p->data.age, p->data.score.score_c, p->data.score.score_math, p->data.score.score_english); p = p->next; } printf("保存成功\n"); fclose(fp); } } void readStuDentput(LinkList*& L) //运行前把文件内容读取到电脑内存 { FILE* fp; fopen_s(&fp,"D:\\study-C++\\project1\\student.txt", "r"); //以只读方式打开当前目录下的.txt if (fp == NULL) { printf("文件不存在\n"); exit(0); //终止程序 } int i = 0; while (!feof(fp)) { char nu[100];//学号 char nam[100];//名字 char s;//性别 int ag;//年龄 score sc;//成绩 fscanf_s(fp, " %s %s %c %d %d %d %d", nu, 15, nam, 15, &s, &ag, &sc.score_c, &sc.score_math, &sc.score_english); i++; } fclose(fp); FILE* FP; fopen_s(&FP,"D:\\study-C++\\project1\\student.txt", "r"); //以只读方式打开当前目录下的.txt if (FP == NULL) { printf("无法打开文件\n"); exit(0); //终止程序 } int b = i - 1; int j = 1; while (!feof(FP)) { fscanf_s(FP, "%s %s %c %d %d %d %d", nu,15, nam,15, &s, &ag, &sc.score_c, &sc.score_math, &sc.score_english); LinkList* n = (LinkList*)malloc(sizeof(LinkList)); strcpy_s(n->data.num, nu);//把后者的内容拷贝到前者中 strcpy_s(n->data.name, nam);//把后者的内容拷贝到前者中 n->data.sex = s; n->data.age = ag; n->data.score = sc; LinkInsert(L, n);//插入新的节点 n = n->next; if (j == b) { break; } j++; } fclose(FP); //关闭文件 } int main() { LinkList* L; InitList(L); readStuDentput(L); //运行前把文件内容读取到电脑 int choose; while (1) { printf("\n"); menu(); //功能菜单 printf("请输入您的选择:\n"); scanf_s("%d", &choose); switch (choose) { case 0://系统帮助及说明 help(); break; case 1://刷新信息(按学号排序) sort(L); break; case 2: //查询学生信息 findstu(L); break; case 3://修改学生信息 changestu(L); break; case 4://增加学生信息 addstu(L); break; case 5://删除学生信息 deletestu(L); break; case 6://输出所有学生的信息 display(L); break; case 7://保存学生信息到文件 save(L); break; case 8://退出 printf("谢谢使用!"); exit(0); default: printf("请输入正确的选择\n"); break; } } return 0; }
更多相关内容 -
学生信息管理系统_链表实现.zip
2021-07-17 21:06:27适合大学在校生,C++实现,数据结构相关,包括增删改查,统计,插入等相关操作,保证可执行 -
基于C语言的学生信息管理系统链表版.zip
2021-08-09 23:03:39使用VS2010 -
学生信息管理系统链表.c
2021-10-05 07:22:20学生信息管理系统(链表),包含学生信息的增删改查排序尾插等操作 -
C++课程设计学生信息管理系统 链表操作
2018-11-05 19:25:25本系统采用了面向过程的程序设计理念,自顶向下逐步求精,将学生管理系统分成若干个相互独立的模块,使每个模块的工作变得简单明确。全部程序均使用链表结构,采用动态存储分配,不会造成内存浪费和溢出,使删除模块... -
链表实现学生信息管理系统完整版
2016-07-29 15:54:15cout学生成绩管理系统-------------------------"; cout时间:" (&t); cout*******************************************************************************\n" 录入学生信息\n" 显示所有学生信息\n" ... -
学生信息管理系统(链表作业)
2017-12-08 13:24:14数据结构中链表的学生信息管理系统,很简单,努力就可以写出来 -
C/C++ 学生信息管理系统 链表
2011-09-02 20:56:52C/C++ 学生信息管理系统 链表 C/C++ 学生信息管理系统 链表 -
链表实现的学生信息管理系统
2018-10-29 11:37:47本实验要求同学们根据自己所在班级成员管理的线性表特性,应用所学的线性表知识设计一个基本的班级管理系统。该系统至少包含新成员入社、老成员退社、成员查询,以及两个班级合并等功能。 案例用c实现,用链表进行... -
基于链表的学生信息管理系统之C语言实现(分享版).rar
2020-05-01 23:10:47学习【数据结构课程】中线性表知识,自己动手做的【学生信息 管理 系统】。 目的:重在功能实现,思考探索。 编程语言:C IDE:VC++6.0 基础功能:增、删、查、改。 【扩展功能: 1.数据的保存、读取; 2.账号的... -
通过链表实现的学生信息管理系统————大一上课设
2022-03-04 15:09:551.纯c语言实现 2.可在devc++上运行 3.含有读写文件的操作。 4.基于链表实现。 5.增删改查,排序,等功能齐全 6.bug较少(可能会有) -
学生信息管理系统(c语言单链表实现)
2018-10-15 20:35:42学生信息管理系统,压缩包有源码,程序,报告。声明:本人只是用来学习。 -
学生信息管理系统(链表&&C语言)
2022-01-11 17:41:02学生信息管理系统总源码(可直接复制运行)目录
1.头文件和预处理
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11
2.定义学生结构体的数据结构
typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st;
3.定义每条记录或节点的数据结构
/* 定义每条记录或节点的数据结构 */ typedef struct node { struct Student data; //数据域 struct node *next; //指针域 }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名
4.函数接口代码.
1.定义提示菜单
//定义提示菜单 void myMenu(){ printf("*****************************菜单*****************************\n"); printf("***********************1 增加学生记录*************************\n"); printf("***********************2 删除学生记录*************************\n"); printf("***********************3 查找学生记录*************************\n"); printf("***********************4 修改学生记录*************************\n"); printf("***********************5 统计学生人数 ************************\n"); printf("***********************6 显示学生记录*************************\n"); printf("***********************7 退出系统 ****************************\n"); }
2.增加学生记录
void inputStudent(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.输入学号接口·
void inputStudentNo(char s[],char no[]){ printf("请输入要%s的学生学号:",s); scanf("%s",no); }
4.遍历表中学生
//遍历表中学生 void displayNode(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.增加学生记录
/* 增加学生记录 */ bool addNode(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; return true; } else{ //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后) q = p; p = p->next; } } //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面 q->next = node; } return true; system("pause"); system("cls"); }
6.删除学生信息
//删除学生信息 bool deleteNode(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"); return true; } else { q=p; p=p->next; } } system("pause"); system("cls"); return false; }
7.查找学生信息
//查找学生信息 bool queryNode(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; return true; } else { p=p->next; } } system("cls"); return false; }
8.修改学生信息
//修改学生信息 bool modifyNode(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"); return true; } else { p=p->next; } } system("cls"); return false; }
9.统计学生人数
//统计学生人数 int countNode(Link head){ //统计学生人数,扫描链表统计节点个数,返回节点数 Link p; int count = 0; p = head->next; while(p) { p=p->next; count++; } //填充代码 system("cls"); return count; }
10.清空链表
//清空链表 void clearLink(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函数
int main() { 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) { case 1: //增加学生记录 if(addNode(head)) printf("成功插入一个学生记录。\n\n"); break; case 2: //删除学生记录 if(deleteNode(head)) printf("成功删除一个学生记录。\n\n"); else printf("没有找到要删除的学生节点。\n\n"); break; case 3: //查询学生记录 if(queryNode(head)) printf("成功找到学生记录。\n\n"); else printf("没有找到要查询的学生节点。\n\n"); break; case 4: //修改学生记录 if(modifyNode(head)) printf("成功修改一个学生记录。\n\n"); else printf("没有找到要修改的学生节点。\n\n"); break; case 5: //统计学生人数 count = countNode(head); printf("学生人数为:%d\n\n",count); break; case 6: //显示学生记录 displayNode(head); break; case 7: //退出前清除链表中的所有结点 clearLink(head); return 0; default: printf("输入不正确,应该输入0-7之间的数。\n\n"); system("cls"); break; } } return 0; }
6.总源码(可直接复制运行)
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11 /* 定义学生结构体的数据结构 */ typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st; /* 定义每条记录或节点的数据结构 */ typedef struct node { struct Student data; //数据域 struct node *next; //指针域 }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名 //定义提示菜单 void myMenu(){ printf("*****************************菜单*****************************\n"); printf("***********************1 增加学生记录*************************\n"); printf("***********************2 删除学生记录*************************\n"); printf("***********************3 查找学生记录*************************\n"); printf("***********************4 修改学生记录*************************\n"); printf("***********************5 统计学生人数 ************************\n"); printf("***********************6 显示学生记录*************************\n"); printf("***********************7 退出系统 ****************************\n"); } void inputStudent(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"); } void inputStudentNo(char s[],char no[]){ printf("请输入要%s的学生学号:",s); scanf("%s",no); } //遍历表中学生 void displayNode(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"); } /* 增加学生记录 */ bool addNode(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; return true; } else{ //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后) q = p; p = p->next; } } //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面 q->next = node; } return true; system("pause"); system("cls"); } bool deleteNode(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"); return true; } else { q=p; p=p->next; } } system("pause"); system("cls"); return false; } //查找学生信息 bool queryNode(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; return true; } else { p=p->next; } } system("cls"); return false; } //修改学生信息 bool modifyNode(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"); return true; } else { p=p->next; } } system("cls"); return false; } //统计学生人数 int countNode(Link head){ //统计学生人数,扫描链表统计节点个数,返回节点数 Link p; int count = 0; p = head->next; while(p) { p=p->next; count++; } //填充代码 system("cls"); return count; } //清空链表 void clearLink(Link head){ Link q,p; p=head->next; q=head; while(p) { q->next=p->next; free(p); p=q->next; } //遍历链表,用free语句删除链表中用malloc建立起的所有的节点 } int main() { 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) { case 1: //增加学生记录 if(addNode(head)) printf("成功插入一个学生记录。\n\n"); break; case 2: //删除学生记录 if(deleteNode(head)) printf("成功删除一个学生记录。\n\n"); else printf("没有找到要删除的学生节点。\n\n"); break; case 3: //查询学生记录 if(queryNode(head)) printf("成功找到学生记录。\n\n"); else printf("没有找到要查询的学生节点。\n\n"); break; case 4: //修改学生记录 if(modifyNode(head)) printf("成功修改一个学生记录。\n\n"); else printf("没有找到要修改的学生节点。\n\n"); break; case 5: //统计学生人数 count = countNode(head); printf("学生人数为:%d\n\n",count); break; case 6: //显示学生记录 displayNode(head); break; case 7: //退出前清除链表中的所有结点 clearLink(head); return 0; default: printf("输入不正确,应该输入0-7之间的数。\n\n"); system("cls"); break; } } return 0; }
7.测试结果
-
链表实现学生信息管理系统
2019-04-21 16:52:34改源代码用链表实现了学生信息的增删改查,读写入(出)文件,同时实现了学生信息的排序,链表的清空,插入。双向链表的插入排序,能够帮助学习链表。 -
C语言使用链表实现学生信息管理系统
2020-12-23 03:45:38本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 代码实现的功能: 1.插入学生信息 2.显示学生信息 3.删除学生信息 4.在指定位置插入学生信息 5.查找学生信息 代码内容: #... -
C语言不用链表完成学生管理系统(完整代码).doc
2021-08-20 18:42:46C语言不用链表完成学生管理系统(完整代码)--附源码 -
C语言学生信息管理系统链表实现
2020-12-16 08:15:33文章目录效果图全部源代码 效果图 全部源代码 #include<stdio.h>...struct Student { //通过结构体输入学生信息 long num; char name[20]; float score[3]; //float aver; struct Studen效果图
全部源代码
#include<stdio.h> #include<string.h> #include<stdlib.h> struct Student { //通过结构体输入学生信息 long num; char name[20]; float score[3]; //float aver; struct Student *next; }; int main(void) { //主函数 void Window(); void Choose(); Window(); //进入首页面 Choose(); //程序控制台 } void Window() { //菜单界面 printf("-学生信息管理系统-\n"); printf(" ---1、初始化信息---\n"); printf(" ---2、存入文件---\n"); printf(" ---3、增加信息---\n"); printf(" ---4、改动信息---\n"); printf(" ---5、删除信息---\n"); printf(" ---6、查询信息---\n"); printf(" ---7、显示信息---\n"); printf(" ---0、退出系统---\n"); printf("-非常感谢您的使用-\n"); return; } void Choose() { struct Student *creat(); void reserve(struct Student *head); void print(struct Student *head); void Add(struct Student *head); void Change(struct Student *head); void Find(struct Student *head); struct Student *Del(struct Student *head); struct Student *head, *head1; int button; printf("请选择您要进行的操作:\n"); scanf("%d", &button); while (button) { if (button == 1) { head = creat(); //录入学生信息 } else if (button == 2) { reserve(head); //将学生成绩以二进制的形式存放到文件中 } else if (button == 3) { Add(head); //增加新的学生信息 } else if (button == 4) { Change(head); //改动某个学生的信息 } else if (button == 5) { head = (Del(head)); //删除某个学生的信息 reserve(head); } else if (button == 6) { Find(head); //查找某个学生的信息 } else if (button == 7) { print(head); //显示文件中的学生信息 } else if (button == 0) { break; //退出系统 } printf("请选择您要进行的操作:\n"); scanf("%d", &button); } } struct Student *creat() { //录入学生信息 struct Student *head, *p1, *p2; int n = 1; printf("请输入学生的信息(输入所有信息为0时信息结束):\n"); p2 = (struct Student *)(malloc(sizeof(struct Student))); p1 = p2; scanf("%ld%s%f%f%f", &p1->num, p1->name, &p1->score[0], &p1->score[1], &p1->score[2]); while(p1 -> num != 0 ) { if(n==1) // 赋初值 { head = p1; n=0; } else { p2->next = p1; } p2 = p1; p1 = (struct Student *)(malloc(sizeof(struct Student))); scanf("%ld%s%f%f%f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]); } p2->next=NULL; printf("录入信息已完成!\n"); return head; } // 存入文件 void reserve(struct Student *head) { //将学生信息以二进制的方式写到文件中 FILE *fp; struct Student *p, *p1, stu[3]; if ((fp = fopen("stud.txt", "wb")) == NULL) { printf("文件读写错误!"); exit(0); } p = head; while (p != NULL) { if (fwrite(p, sizeof(sizeof(struct Student)), 1, fp) != 1) { //往文件中写内容和读取内容都必须要写这一步 } p = p->next; } fclose(fp); printf("学生信息已读入文件!\n"); return; } // 增加信息 void Add(struct Student *head) { void reserve(struct Student *head); ; struct Student *p1, *p2 = NULL, *pNew; long num; printf("请输入要插入的位置(前一个学生的学号):"); scanf("%ld", &num); p1 = head; while (p1 != NULL) { if (p1->num == num) { p2 = p1->next; pNew = (struct Student *)(malloc(sizeof(struct Student))); printf("学号:"); scanf("%ld", &pNew->num); printf("姓名:"); scanf("%s", pNew->name); printf("成绩:"); scanf("%f%f%f", &pNew->score[0], &pNew->score[1], &pNew->score[2]); p1->next = pNew; pNew->next = p2; break; } p1 = p1->next; } reserve(head); printf("增加学生信息成功!\n"); return; } // 删除信息 struct Student *Del(struct Student *head) { struct Student *p, *p1; long num; printf("请输入要删除学生的学号:"); scanf("%ld", &num); p = head; while (p != NULL) { if (head->num == num) { head = head->next; //先看第一个是否是要删除的成绩 free(p); break; } else { p1 = p; p1 = p->next; if (p1->num == num) { p->next = p1->next; p = p1; free(p1); break; } p = p->next; } } printf("删除学生信息成功!\n"); return head; } // 变更信息 void Change(struct Student *head) { //改动学生的成绩 void reserve(struct Student *head); struct Student *p, newMessage; long Name; long num; char nam[20]; printf("请输入要修改的学生学号:"); scanf("%ld", &Name); p = head; while (p != NULL) { if (p->num == Name) { break; //为什么会提示无效的数组,字符串之间能用==进行赋值吗??大傻瓜 } p = p->next; } if (p == NULL) { printf("未找到该学生信息!\n"); return; } printf("\n请输入新的信息:"); printf("学号:"); scanf("%ld", &num); printf("姓名:"); scanf("%s", nam); p = head; while (p != NULL) { if (p->num == Name) { p->num = num; strcpy(p->name, nam); //为什么会提示无效的数组,字符串之间能用==进行赋值吗??大傻瓜 } p = p->next; } reserve(head); printf("修改学生信息成功!\n"); return; //重新保存到文件中 } // 查找信息 void Find(struct Student *head) { //查找学生信息 struct Student *p; float num; p = head; printf("请输入你要查找的学生的学号信息:"); scanf("%f", &num); while (p != NULL) { if (p->num == num) { printf("学号:%ld 姓名:%s 成绩:%.2f %.2f %.2f ", p->num, p->name, p->score[0], p->score[1], p->score[2]); break; } p = p->next; } if (p == NULL) { printf("未找到该学生信息!\n"); } printf("查找学生信息结束!\n"); return; } // 显示信息 void print(struct Student *head) { //从文件输出各个学生的信息 printf("----------------学生信息----------------\n"); printf(" 学号 姓名 语文 数学 英语\n"); struct Student *p1; FILE *fp; fp = fopen("stud.txt", "rb"); p1 = head; while (p1 != NULL) { if (fread(p1, sizeof(sizeof(struct Student)), 1, fp) != 0) { //将文件中的内容以二进制的方式读取并且显示到屏幕上 printf(" %3ld%10s %6.2f %5.2f %5.2f\n", p1->num, p1->name, p1->score[0], p1->score[1], p1->score[2]); } p1 = p1->next; } fclose(fp); return; }
-
基于链表的学生信息管理系统(一)
2022-04-16 20:43:03c语言链表的基本操作- 链表的概念
通俗来讲,链表就是将动态申请的结构体类型相同的数据结构连接成类似一个表的形式,由于动态申请的内存是系统随机分配的,为了能够找到这些结构体,因此结构体中除了必要的数据外,还有一个结构体类型的指针用来保存下一个结构体的地址。链表的基本原理如图所示。
指针next用来保存下一个结构体的地址,这样只要知道一个结构体的地址,就可以通过指针来找到其他的结构体。
- 链表的定义
以学生的姓名学号为例,定义一个结构体,在结构体中加入指向地址的指针,因为指针指向的是下一个结构体,因此,指针的类型必须是结构体。
实际就是一个结构体的定义,接下来对结构体成员进行赋值。
再给字符数组赋值时不能直接使用“=”,指针指向的内存不能改写,只能使用strcpy进行赋值。将结构体指针指向NULL,就得到了一个只有一个结构体的链表。可以打印输出链表的内容。
- 链表的遍历输出
当链表中不只有一个结构体时,只需要知道其中的一个地址,就可以访问整个链表。
p.next保存p1的地址,p1.next保存p2的地址。访问时p->next指向p1,p->next->next就可以指向p2。但是重复出现的next显然不符合使用的习惯,循环就可以解决这个问题。
将循环的过程封装成函数,方便以后调用。
- 链表的创建
创建链表首先就需要申请动态内存,因为创建的链表有很多,动态内存的申请可以放进for循环中解决。链表的创建从第一个节点开始依次创建,然而顺序创建比较困难,因为头节点只能找到下一个节点,因此,我们可以让每一次新创建的节点成为头节点,这样就可以完成链表的创建。
STU *link_insert(STU *head,STU *pnew) { if (head==NULL) { head = pnew; pnew->next=NULL; } else if (pnew != NULL) { pnew->next= head; head = pnew; } return head; }
- 链表的释放
释放链表同样需要一个一个释放,因为链表中的指针保存了下一个节点的地址,因此在释放之前需要找一个中间变量先保存将要释放的节点保存起来。
STU *link_free(STU *head){ STU *ps; ps=head; while(head!=NULL) { ps = head->next; free(head); head=ps; } }
- 链表的查询
查询就是将整个链表遍历,从而找到符合条件的输出。
STU *link_find(STU *head) { char name[10]; scanf("%s",name); while(head!=NULL) { if (strcmp(head->name,name)==0 ) break; head = head->next; } return head; }
- 链表节点的删除
删除一个链表的节点首先应该考虑的问题是删除后还是一个链表,只是少了这一个节点,其次,删除节点必须要先找到节点,因此可以在查询的基础上加上删除的逻辑。以三节点链表为例,假设要删除中间节点 ,因为节点中的指针保存着下一个节点的地址,所以找一个中间变量来保存头节点。
要删除中间的节点,先要建立第一个和第三个节点的关系。然后释放掉第二个节点
但是要删除头节点就又出了问题,因为单向链表只能找到下一个节点,并不能找到他的上一个节点,其实只需要删除的时候去判断一下,如果是头节点,直接去释放就好了,另外,因为函数返回值是head,因此,有必要找一个其他变量来代替头节点所以完整的删除代码如下。
STU *link_delete(STU *head,char name[]) { STU *pf,*ps; pf = head; ps = head; while(head!=NULL) { if (strcmp(head->name,name)==0) { if (pf==head) head = head->next; else ps->next=pf->next; free(pf); break; } ps = pf; pf = pf->next; } return head; }
当然可以在主函数中使用死循环来测试节点的删除,看是否存在有漏洞。
本文参考b站视频所写,视频地址:Java视频教程-Java视频资源-海量下载-千锋教育
-
C语言链表实现学生信息管理系统
2020-06-03 08:27:58大一做的这个程序,主要是链表的增删查改操作。.../////////////////学生信息管理系统 /////////////////存入、查找、删除、修改、输出学生信息,学生信息包括姓名,性别,年龄,学号,电话; typedef -
【免费】C语言程序设计实训 基于链表的学生信息管理系统
2021-07-18 09:20:56C/C++实现,包括源代码,实验报告。源代码有详细注释。实现了文件存取,学生信息的查找,插入,修改,删除,排序等。 -
数据结构实验报告-利用链表实现简易学生信息管理系统(C语言)
2022-04-07 12:59:31数据结构实验报告-利用链表实现简易学生信息管理系统,内容包含实验目的,实验环境,实验源代码,实验运行截图,实验小结等。 说明:如有bug,还请反馈! -
学生信息管理系统 双链表
2013-06-21 13:15:03内含两个工程 货有所值哦!!! student类 mis.cpp(管理函数) -
C语言链表实现的学生成绩管理系统
2020-07-24 18:21:22用C语言链表实现的学生成绩管理系统,交互友好,包含录入、插入、修改成绩等大量功能,本作业成绩95+,包你满意 -
学生信息管理系统C语言链表版.rar
2020-08-28 21:06:42自己花了点时间琢磨了一个简易版的链表,里面很多地方还是比较复杂的,希望大佬能指导修改一下,同时也供初学数据结构的码友参考学习 -
C语言实现学生信息管理系统(单链表)
2020-08-28 05:51:23主要为大家详细介绍了C语言实现学生信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
C语言链表学习--学生信息管理系统
2019-08-16 15:55:17最近学习了下C语言的链表,为了更加熟悉链表,就随意写了个学生信息管理系统(写的很垃圾,大佬勿喷) 本人最近刚好有点时间,就去看了看c语言的链表,看到网上各种c语言的学生信息管理代码,确实都是现成的东西,... -
【C项目】 文件,结构体,链表,排序, 学生信息管理系统
2021-05-19 19:09:432、通过键盘输入学生信息,包括学生学号、姓名、成绩;3、将输入的信息保存到指定文件中;4、从文件中读取学生信息;5、显示全部学生信息;6、按学生总分进行降序排序;7、删除学生信息;8、查找学生信息,可以通过... -
C语言链表实现学生管理系统
2020-08-25 21:56:10主要为大家详细介绍了C语言链表实现学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下