写在前面:CSDN出现了很多需要知识付费的情况,有些东西你抄我我抄你,把别人免费开源的东西照搬拿过来后收费?我不能理解我想抵制这种行为,我想能做点自己能做的事情, 有些东西可以去官方找文档,__官网也有提供下载但就是有不少人要去下载不知道已经第几方来历不明的资源?Why?__知识产权是对的为知识收费没错,有些东西真的称得上知识!!!,但是拿人家免费开源的,然后搬到这里付费我不理解!滑稽…请大伙们多多注意吧,题外话就这么多了.

注意:没有用到数据库
使用链表完成此系统!
多文件实现

正式开始

--代码都可以直接使用--不想看的,直接复制代码块里面的内容就行!我用的visual studio 2019   有些使用了 _s  如果是用别的编译器,可以自行修改!



功能介绍

- 增,删,改,查,退出,保存,以至于格式化!
- 1.录入学生信息
- 2.查看录入的学生信息(全部学生信息)
- 3.修改已录入的学生信息(以学号)
- 4.删除已录入的学生信息(以学号)
- 5.保存信息到文件
- 6.指定查找(以学号)
- 7.隐藏选项(格式化链表--清空)
- 'q'退出系统

实现功能

创建源文件main.c 函数部分

//不一一介绍,不懂得去查就行,要学会Google!
#include "myList.h"  //引入自己写得一个头文件//菜单界面
void menu(void);//函数声明,菜单显示函数.
//按钮互动
void keydown(struct Node* List);int main(void) {struct  Node* List = createrList();//创建一个叫List的链表readInfoFromFile(List, "student.txt");//读取在student.txt的文件  然后写入List链表中while (true) {//一直循环,知道用户不用这个程序后,输入'q' 退出程序!//显示菜单menu(); //然后读取用户输入的值,进行操作!keydown(List);system("pause");//暂停程序用的system("cls");//执行完一次,就清屏一次,看起来比较舒服}system("pause");//不闪退!同上面作用return 0;
}//这里是用一个结构体,到时用来储存我们的提示信息//结构体  把菜单要输入的内容都放进这里面
//功能
struct hint_menu {//桌面菜单使用!char one_menu[25];char two_menu[30];char three_menu[30];char four_menu[30];char five_menu[25];char six_menu[25];char seven_menu[25];};//桌面菜单
void menu(void) {//使用指针 chosen 指向我们的结构体 ,然后给它动态分配空间
//                                  类型                          分配的大小struct hint_menu* chosen = (struct hint_menu*)malloc(sizeof(struct hint_menu));if (chosen) {//这里的if()可写可不写,我写了是划分代码块好看点//存入要输入内容//这里修改内容即可  ,  想添加就去结构体那先添加一下数组strcpy_s(chosen->one_menu, sizeof(chosen->one_menu), "1.录入学生信息");strcpy_s(chosen->two_menu, sizeof(chosen->two_menu), "2.查看已录入的学生信息");strcpy_s(chosen->three_menu, sizeof(chosen->three_menu), "3.修改已录入的学生信息");strcpy_s(chosen->four_menu, sizeof(chosen->four_menu), "4.删除已录入的学生信息");strcpy_s(chosen->five_menu, sizeof(chosen->five_menu), "5.保存至文件");strcpy_s(chosen->six_menu, sizeof(chosen->six_menu), "6.指定查找");strcpy_s(chosen->seven_menu, sizeof(chosen->seven_menu), "q.退出系统");//其实这样比较麻烦//你们可以直接定义一个字符串//char inset[20] = "1.录入学生信息";  以此类推//输出你存入的内容printf("\n\n\n\n");printf("\t\t\t\t******************欢迎进入学生管理系统*******************\n");printf("\t\t\t\t*\t\t %s\t\t\t\t*\n", chosen->one_menu);printf("\t\t\t\t*\t\t %s  \t\t*\n", chosen->two_menu);printf("\t\t\t\t*\t\t %s  \t\t*\n", chosen->three_menu);printf("\t\t\t\t*\t\t %s  \t\t*\n", chosen->four_menu);printf("\t\t\t\t*\t\t %s \t\t\t\t*\n", chosen->five_menu);printf("\t\t\t\t*\t\t %s \t\t\t\t*\n", chosen->six_menu);printf("\t\t\t\t*\t\t %s \t\t\t\t*\n", chosen->seven_menu);printf("\t\t\t\t*********************************************************\n");printf("\t\t\t\t请输入你的选项1~6  and  (q quit program):");fflush(stdout);//刷新输出缓冲流}}//功能实现  ,按钮互动
void keydown(struct Node* List) {struct  student  info;char num[12];char choose,ch;choose = enter();switch (choose) {case '1':printf("\t\t\t\t******************录入学生信息******************\n");printf("\t\t\t\t请输入要录入的学生:学号\t姓名\t性别\t年龄\t电话\t\n");printf("\t\t\t\t请输入学号:");scanf_s("%s",info.number, (unsigned int)sizeof(info.number));printf("\t\t\t\t请输入姓名:");scanf_s("%s",info.name,(int)sizeof(info.name));printf("\t\t\t\t请输入%s的性别:",info.name);scanf_s("%s",info.gender,(int)sizeof(info.gender));printf("\t\t\t\t请输入%s的年龄:", info.name);scanf_s("%hd", &info.age);printf("\t\t\t\t请输入%s的电话:", info.name);scanf_s("%s", info.tel, (int)sizeof(info.tel));insertNodeByHead(List, info);printf("\t\t\t\t录入完成! Done!");break;case '2':printf("\t\t\t\t***************查看已录入学生信息************\n");printfNode(List);printf("\t\t\t\t一共有%d个人\n", LengthNode(List));break;case '3':printf("\t\t\t\t******************修改学生信息*******************\n");printfNode(List);printf("\t\t\t\t请输入需要修改的学生学号:");scanf_s("%s", num, (unsigned int)sizeof(num));upDataNode(List,num);break;case '4':printf("\t\t\t\t******************删除学生信息*******************\n");printfNode(List);printf("\t\t\t\t请输入需要删除的学生学号:");scanf_s("%s",num,(unsigned int)sizeof(num));deteleNodeAppoinNumber(List, num);break;case '5':printf("\t\t\t\t******************保存至文件*******************\n");weiteInfoToFile(List, "use_stu.txt");printf("\t\t\t\t备份完成\n");printf("\t\t\t\tDone\n");break;case '6':printf("\t\t\t\t******************指定位置查找*******************\n");printf("\t\t\t\t请输入想要查找的学生学号:");scanf_s("%s",num, (unsigned int)sizeof(num));printfToInput(List,num);printf("\t\t\t\t\t\t\t\tDone\n");break;case '7':printf("\t\t\t\t******************格式化链表*******************\n");printf("\t\t\t\t*********************************\n");printf("\t\t\t\t******************注意***********\n");printf("\t\t\t\t********此操作无法撤回!**********\n");printf("\t\t\t\t(确认请输入[Y] 取消请选择[q]):");ch = enter();switch (ch){case 'Y':formattedLinkedList(List);weiteInfoToFile(List, "student.txt");break;case 'q':printf("\t\t\t\t退出成功");return;break;default:printf("\t\t\t\t(确认请输入[Y] 取消请选择[q]):");break;}break;case 'q':printf("\t\t\t\t正常退出系统成功\n");exit(0);break;default:printf("\n\t\t\t\t请重新输入(1~5  and  (q quit program))\n");break;}weiteInfoToFile(List,"student.txt");
}

创建源文件头文件 enter.h 部分

#pragma once  //防止重复引用
#include "myList.h" //处理写入
char enter(void); //函数声明char enter(void) {short count = 1;//次数char input = getchar(); // 读取单个字符fflush(stdin);//清空输入缓存区,防止读取后,又读取for (int i = 1; i <= 12; i++) {//如果超过误输入超过13次,强制退出程序if (input == '\n') {//如果读取的一直是回车,就会执行,否则返回该值count++;scanf_s("%c", &input, 3);fflush(stdin);if (count == 5) {printf("\n\t\t\t\t\t\t别再调皮了!\n");continue;}else if (count == 11) {printf("\n\t\t\t\t\t\t别在摁回车键了!最后一次机会了\n");continue;}else if (count == 13) {printf("\n\t\t\t\t\t\t程序已强制退出!byebye");exit(0);}}else { return  input; }}return 0;
}

重头戏来咯
创建头文件 myList.h

#pragma once
//前面没有引用是应为这里都引用了,所以引用一次头文件就欧克了
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#include "enter.h"//定义一个学生类型的结构体
struct student {char name[20]; //姓名char gender[3];//性别char number[12]; //学号char tel[12];//电话号码short age;//年龄//需要可以在添加};//结点
struct Node {struct student data;  //数据域struct Node* next;      //指针域
};//创建链表
struct Node* createrList(void) {struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));if (headNode) {//初始化headNode->next = NULL;}return headNode;
}//创建结点
struct Node* createNode(struct student data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode) {//把数据存进去newNode->data = data;newNode->next = NULL;}return newNode;    }//插入结点             参数:插入哪个链表  插入结点的数据是多少
void insertNodeByHead(struct Node* headNode, struct student data) {//创建结点struct Node* newNode = createNode(data);//赋值//使插入的结点接在 headNode后面newNode->next = headNode->next;headNode->next = newNode;}//打印链表 也就是遍历
void  printfNode(struct Node* headNode) {struct Node* pMove = headNode->next;printf("\t\t\t\t\t学号\t姓名\t性别\t年龄\t电话\n");while (pMove != NULL) {printf("\n\t\t\t\t\t%06s\t%s\t%s\t%hd\t%s", pMove->data.number, pMove->data.name, pMove->data.gender, pMove->data.age, pMove->data.tel);pMove = pMove->next;}printf("\n");}//指定位置删除
void deteleNodeAppoinNumber(struct Node* headNode, char number[12]) {struct Node* posNode = headNode->next;struct Node* posFrontNode = headNode;if (posNode == NULL) {printf("\t\t\t\t\t\t表中没有参数\n");}else {while (strcmp(posNode->data.number,number)!=0) {//如果不是的话posFrontNode = posNode;posNode = posNode->next;if (posNode == NULL) {//找到最后一个也没有找到printf("\t\t\t\t\t\t表中没有该学号的学生.\n");return;}}//找到了posFrontNode->next = posNode->next;free(posNode);printf("\t\t\t\t\t\tDone it!\n");}}//更新已录入内容
void upDataNode(struct Node* headNode, char number[12]) {struct Node* posNode = headNode->next;struct Node* posFrontNode = headNode;struct student info;char chosen;if (posNode == NULL) {printf("\t\t\t\t\t\t无法修改,该表里面没有内容\n");}else {while (strcmp(posNode->data.number,number)!=0) {posFrontNode = posNode;posNode = posNode->next;if (posNode == NULL) {printf("\t\t\t\t\t\t该表中没有此学号的学生,无法修改\n");return;}}while (true) {printf("\t\t\t\t\t\t请输入要修改什么选项:""\n\t\t\t\t\t\t(1.学号\t2.姓名\t3.性别\t4.年龄\t5.电话)""\n\t\t\t\t\t\t(如果不需要了选择'Q')\n-->:");chosen = enter();fflush(stdin);switch (chosen) {case '1':printf("\t\t\t\t\t\t请输入需要更改的学生信息:\n");printf("\t\t\t\t\t\t请输入学号:");scanf_s("%s", info.number,(int)sizeof(info.number));strcpy_s(posNode->data.number, sizeof(posNode->data.number),info.number);printf("\t\t\t\t\t\tDone!\n");break;case '2':printf("\t\t\t\t\t\t请输入需要更改的学生信息:\n");printf("\t\t\t\t\t\t请输入姓名:");scanf_s("%s", info.name, (int)sizeof(info.name));fflush(stdin);strcpy_s(posNode->data.name, sizeof(posNode->data.name), info.name);printf("\t\t\t\t\t\tDone!\n");break;case '3':printf("\t\t\t\t\t\t请输入%s的性别:", posNode->data.name);scanf_s("%s", info.gender, (int)sizeof(info.gender));fflush(stdin);strcpy_s(posNode->data.gender, sizeof(posNode->data.gender), info.gender);printf("\t\t\t\t\t\tDone!\n");break;case '4':printf("\t\t\t\t\t\t请输入%s的年龄:", posNode->data.name);scanf_s("%hd", &info.age);posNode->data.age = info.age;printf("\t\t\t\t\t\tDone!\n");break;case '5':printf("\t\t\t\t\t\t请输入%s的电话:", posNode->data.name);scanf_s("%s", info.tel, (int)sizeof(info.tel));fflush(stdin);strcpy_s(posNode->data.tel, sizeof(posNode->data.tel), info.tel);printf("\t\t\t\t\t\tDone!\n");break;case'Q':printf("\t\t\t\t\t\t退出此选项");return;default:printf("\n\t\t\t\t\t\t请重新输入(1~5  and  (q quit ))\n");break;}}}
}//指定位置查看
void printfToInput(struct Node* headNode, char number[12]) {struct Node* posNode = headNode->next;struct Node* posFrontNode = headNode;if (posNode == NULL) {printf("\t\t\t\t\t\t该表为空\n");}else {while (strcmp(posNode->data.number,number)!=0) {posFrontNode = posNode;posNode = posNode->next;if (posNode == NULL) {printf("\t\t\t\t\t\t没有找到该学生\n");return;}}printf("\t\t\t\t\t\t学号\t姓名\t性别\t年龄\t电话\n");printf("\n\t\t\t\t\t\t%06s\t%s\t%s\t%hd\t%s", posNode->data.number, posNode->data.name, posNode->data.gender, posNode->data.age, posNode->data.tel);}printf("\n");
}//读文件
bool  readInfoFromFile(struct Node* headNode, char* fileName) {struct student data;//打开文件FILE* fp;fopen_s(&fp, fileName, "r");if (fp == NULL) {fopen_s(&fp, fileName, "w+");}//2操作if (fp == NULL) { return EOF; }while (fscanf_s(fp, "%s\t%s\t%s\t%hd\t%s", data.number,(int)sizeof(data.number), data.name, (int)sizeof(data.name), data.gender, (int)sizeof(data.gender), &data.age, data.tel, (int)sizeof(data.tel)) != EOF) {insertNodeByHead(headNode, data);}//关闭文件if (fp == NULL) { return EOF; }fclose(fp);return 0;
}//写文件
bool  weiteInfoToFile(struct Node* headNode, char* fileName) {FILE* fp;fopen_s(&fp, fileName, "w");struct Node* pMove = headNode->next;while (pMove) {if (fp == NULL) { return EOF; }fprintf_s(fp, "\n\t\t\t\t\t\t %s\t%s\t%s\t%hd\t%s", pMove->data.number, pMove->data.name, pMove->data.gender, pMove->data.age, pMove->data.tel);pMove = pMove->next;}if (fp == NULL) { return EOF; }fclose(fp);return 0;
}//求链表长度
int LengthNode(struct Node* headNode) {int lenth = 0;struct Node* pMove = headNode->next;while (pMove) {lenth++;pMove = pMove->next;}return lenth;
}//格式化模式!
void formattedLinkedList(struct Node* headNode) {struct Node* posNode ;if (headNode == NULL) {printf("\t\t\t\t\t\t该表为空\n");}else {while (headNode != NULL) {posNode = headNode->next;free(headNode);headNode = posNode;}}
}

总结 有遇到什么问题可以,私聊我,或者在评论区提出,大家帮忙改进.
不是很完善,需要什么功能后续自己在添加或者修改!

最后:我们学计算机的最重要的是不能闭门造车,可以学会去Github多学习学习多多参加项目,学到的要多分享,仅凭一个人的力量还是远远不够的!重要的是交流才能使你有巨大的进步,就讲这些,谢谢大家看到这里!

要学会帮助他人,一起进步

Done

学生管理系统(源码)(C语言版)相关推荐

  1. java计算机毕业设计微留学学生管理系统源码+数据库+系统+lw文档+mybatis+运行部署

    java计算机毕业设计微留学学生管理系统源码+数据库+系统+lw文档+mybatis+运行部署 java计算机毕业设计微留学学生管理系统源码+数据库+系统+lw文档+mybatis+运行部署 本源码技 ...

  2. 会员管理系统源码 php语言开发

    会员管理系统源码 php语言开发 可用于美容店,理发店,服装店,美甲店,奢侈品店等等 功能介绍: 1.常用功能 会员登记,会员充值,会员充次,商品消费(会员),商品消费(散客),快速消费(会员),快速 ...

  3. 会员管理系统源码 php语言开发 可用于美容店,理发店,服装店

    会员管理系统源码 php语言开发 可用于美容店,理发店,服装店,美甲店,奢侈品店等等 功能介绍: 1.常用功能 会员登记,会员充值,会员充次,商品消费(会员),商品消费(散客),快速消费(会员),快速 ...

  4. c语言mysql 学生信息管理系统_学生信息管理系统学生时代小作品源码(C语言版)...

    /*****************************************************************************/ /* 制作一个学籍管理系统:要求包含以下 ...

  5. 学生签到系统c代码_C语言学生管理系统源码分享

    1 大家好2 我就是如假包换的...陈玲3 自从运营了C语言程序设计微信公众号4 很多粉丝都给我备注5 ...奇葩6 实在是不敢当7 也被人开始叫玲玲姐8 我知道9 很多人都想看我出境10 我本人也有 ...

  6. 青年烤饼上饼顺序系统学生时代小作品源码(C语言版)

    /*****************************************************************************/ /* 煎饼上饼系统 姓名:danyuan ...

  7. 学生管理系统可储存c语言版,学生档案管理系统(C语言).doc

    学生档案管理系统(C语言).doc 河南工业大学 <数据结构>课程设计 学生档案录入查询系统 班级:计算机类1402 学号:201416920214 姓名: 任永坤 目 录 摘 要II 第 ...

  8. c语言餐厅点餐管理系统源码,C语言实现餐饮点餐管理系统.pdf

    C语语言言实实现现餐餐饮饮点点餐餐管管理理系系统统 本文实例为大家分享了C语言实现餐饮点餐管理系统的具体代码,供大家参考,具体内容 下 具体代码 下 /* 项目名称:南航餐饮管理系统 组员:梁文新,刘 ...

  9. 基于SpringBoot框架的HIS互联网医院门诊信息管理系统源码JAVA语言开发

    环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,St ...

  10. ASP.NET智慧学校管理系统源码 学生工作管理系统源码

    ASP.NET智慧学校管理系统源码 学生工作管理系统源码 开发语言:C# 数据库: SQL2008 开发工具 : VS2013 源码类型:全开源免费分享 学生工作一体化管理信息系统由首页.系统维护.思 ...

最新文章

  1. swift 中高德地图随时读取坐标地点的写法
  2. mysql期末考试试卷_mysql测试题
  3. 1.2.2 OSI参考模型
  4. XamarinEssentials教程清空键值
  5. 西湖首届本科生开招!每名学生配三位学术导师,大二全员海外交流
  6. testng.xml 配置大全
  7. mac hdmi 不能调整音量_如何使用Mac的媒体键在DisplayPortHDMI或Thunderbolt监视器上调整扬声器音量...
  8. canvas小程序-快跑程序员
  9. 被该死的Openssl编译嘲讽了一个下午
  10. uvccamera 后台服务_UVCCamera的一些坑
  11. 用配置还用Attribute来实现IoC?
  12. 对标印度的PostMan,一款中国接口测试软件的崛起
  13. Linux操作汇总(常用命令、vim)
  14. 动态添加TemplateField列
  15. 为什么最好不用SSL免费证书? 免费ssl证书有什么不好?
  16. java dao模式的优缺点_Java入门:浅谈DAO模式
  17. 5个很牛的黑科技网站分享
  18. 计算机wmi配置错误,系统没有WMI服务、WMI错误修复办法
  19. MCU】可怕,别人把我MCU固件给反汇编了!(逆向)J-FLASH通过下面的选项路径,即可读取所选Flash区域或者所有Flash区域(Entire Chip)安装IDA Pro逆向工具
  20. 数码显示实验报告C语言,数码管动态显示实验报告

热门文章

  1. mysql索引红黑联盟_MySQL的索引
  2. imu传感器工作原理_各种传感器工作原理汇总
  3. 线性求逆元模板_专栏:ACM算法面面观[9]逆元
  4. 四线温度探头怎么接线_热电阻的接线方式
  5. python 虚拟环境 windows_Python虚拟环境(Windows版)
  6. linux su - 用户名,在Linux中,su命令 (切换用户)
  7. 北大核刊最新版2020目录_重磅!最新版CSSCI 来源期刊目录(2019-2020)
  8. html倾斜变形,深入理解CSS变形transform(2d)_html/css_WEB-ITnose
  9. jquery简单的选择添加下拉列表
  10. 【java】彩票中奖码生成器:java.util.Random里的方法public int nextInt(int bound)