C语言动态链表数据结构实现的学生信息项目
注:此项目来源于吕鑫老师的教程
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>
using namespace std; struct SUser
{
int nNum;
char sName[];
float fMath;
}; typedef SUser DATA; struct SNode
{
DATA data;//28个字节
SNode* pNext;//指针变量,4个字节
}; SNode* g_Head = NULL;
//头部添加
void AddHeand(DATA data)
{
SNode* pNew = (SNode*)malloc(sizeof(SNode));
pNew->data = data;
pNew->pNext = g_Head; g_Head = pNew;
}
//尾部添加
void AddTail(DATA data)
{
SNode* pNew =(SNode*)malloc(sizeof(SNode));
pNew->data =data;
pNew->pNext = NULL;
if (!g_Head)//链表为空时
{
g_Head = pNew;
return;
} SNode* p = g_Head;
while(p->pNext!=NULL)
{
p = p->pNext;
}
p->pNext = pNew;
} //保存到文件中
void Save()
{
FILE* fp = fopen("study.dat","w");
if (!fp)
{
return;
}
SNode* p = g_Head;
while(p)
{
//fwrite(&p->data,1,sizeof(p->data),fp);
fwrite(p,,sizeof(p->data),fp );
p = p->pNext;
} fclose(fp);
}
//从文件中读取
void Load()
{ FILE* fp = fopen("study.dat","r"); if (!fp)
{
return;
}
DATA data; while(fread(&data,,sizeof(data),fp)==sizeof(data))
AddTail(data); fclose(fp);
}
//打印
void PrintAll()
{
SNode* p = g_Head;
int i =;
/*if (!p)
{
printf("当前链表为空!\n");
return;
}*/
puts("学号\t姓名\t数学");
while (p)
{
printf("%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath);
++i;
p=p->pNext;
}
printf("总共%d条记录\n",i);
system("pause");
} void Input(int nDir)
{
DATA data;
printf("请输入学号:");
scanf_s("%d",&data.nNum); printf("请输入姓名:");
scanf_s("%s",data.sName,sizeof(data.sName)); printf("请输入数学成绩:");
scanf_s("%f",&data.fMath);
if (nDir == )
{
AddHeand(data);
}
else
{
AddTail(data);
}
Save();
PrintAll(); } int AddMenu()
{
system("cls");
puts("\n\n\t\t1、向头部插入:");
puts("\t\t2、向尾部插入:");
puts("\t\t0、回到主菜单:"); int i = ; scanf_s("%d",&i); switch(i)
{
case :
case :
Input(i);
break;
}
return i;
} int Judge(SNode* q,SNode* m,int index)
{
switch(index)
{
case ://姓名
return strcmp(q->data.sName,m->data.sName)<;
case ://学号
return q->data.nNum < m->data.nNum;
case ://成绩
return q->data.fMath < m->data.fMath;
} return ;
}
//排序
void Sort(int index)
{
SNode* p = g_Head;
if (!p)
{
return;
} while (p->pNext)
{
SNode* q = p->pNext;
SNode* m = p;
while(q)
{
if (Judge(q,m,index))
{
m = q;
}
q = q->pNext;
} if (m != p)//不等时交换
{
DATA t = p->data; p->data=m->data;
m->data = t;
}
p = p->pNext;
} system("pause");
}
//按学号排序
void SortByNum()
{
SNode* p = g_Head;
if (!p)
{
return;
} while (p->pNext)
{
SNode* q = p->pNext;
SNode* m = p;
while(q)
{
if (q->data.nNum < m->data.nNum)
{
m = q;
}
q = q->pNext;
} if (m != p)//不等时交换
{
DATA t = p->data; p->data=m->data;
m->data = t;
}
p = p->pNext;
} system("pause");
}
//按姓名排序
void SortByName()
{
SNode* p = g_Head;
if (!p)
{
return;
} while (p->pNext)
{
SNode* q = p->pNext;
SNode* m = p;
while(q)
{
if (strcmp(q->data.sName, m->data.sName)<)
{
m = q;
}
q = q->pNext;
} if (m != p)//不等时交换
{
DATA t = p->data; p->data=m->data;
m->data = t;
}
p = p->pNext;
} system("pause");
}
//按成绩排序
void SortByMath()
{
SNode* p = g_Head;
if (!p)
{
return;
} while (p->pNext)
{
SNode* q = p->pNext;
SNode* m = p;
while(q)
{
if (q->data.fMath > m->data.fMath)
{
m = q;
}
q = q->pNext;
} if (m != p)//不等时交换
{
DATA t = p->data; p->data=m->data;
m->data = t;
}
p = p->pNext;
} system("pause");
} int SortMenu()
{
system("cls");
puts("\n\n\t\t1、按姓名排序:");
puts("\t\t2、按学号排序:");
puts("\t\t3、按成绩排序:");
puts("\t\t0、退出排序:"); int i = ; scanf_s("%d",&i); switch(i)
{
case :
break;
SortByName();
case :
SortByNum();
break;
case :
SortByMath();
break;
default:
return i;
}
PrintAll(); return i;
}
//按姓名删除节点
int DeleteByName()
{
PrintAll(); char name[];
printf("请输入姓名:"); scanf("%s",name); SNode* p = g_Head;
SNode* p1 = NULL;//记录前一个节点
if (!p)
{
return ;
} //如果是头节点要特殊处理
if(strcmp(p->data.sName,name)== )
{
g_Head = p->pNext;
delete p;
return ;
}
while(p)
{
if (strcmp(p->data.sName,name)== )
{
p1->pNext=p->pNext;
free(p);
return ;
}
p1=p;
p=p->pNext;
} return ;
}
//按学号删除节点
int DeleteByNum()
{
PrintAll();
int iNum =;
printf("请输入学号:"); scanf_s("%d",&iNum); SNode* p = g_Head;
SNode* p1 = NULL;//记录前一个节点
if (!p)
{
return ;
} //如果是头节点要特殊处理
if(p->data.nNum== iNum)
{
g_Head = p->pNext;
delete p;
return ;
}
while(p)
{
if (p->data.nNum== iNum)
{
p1->pNext=p->pNext;
free(p);
return ;
}
p1=p;
p=p->pNext;
}
return ;
} int DeleteMenu()
{
system("cls");
puts("\n\n\t\t1、按姓名删除:");
puts("\t\t2、按学号删除:");
puts("\t\t0、退出回主菜单:"); int i = ,j=; scanf_s("%d",&i); switch(i)
{
case :
j = DeleteByName();
if(j>)
{
printf("删除成功!");
}
else
{
printf("删除失败!");
}
break;
case :
j = DeleteByNum();
if(j>)
{
printf("删除成功!");
}
else
{
printf("删除失败!");
}
break;
default:
return i;
}
PrintAll(); return i;
}
//查找
int FindByName()
{
char name[];
printf("请输入姓名:"); scanf("%s",name); SNode* p = g_Head;
while (p)
{
if (strcmp(p->data.sName,name)==)
{
puts("学号\t姓名\t数学"); printf("%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath);
return ;
} p=p->pNext;
}
return ;
}
//按学号查找
int FindByNum()
{
int iNum =;
printf("请输入学号:"); scanf_s("%d",&iNum); SNode* p = g_Head;
while (p)
{
if (p->data.nNum == iNum)
{
puts("学号\t姓名\t数学"); printf("%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath);
return ;
} p=p->pNext;
}
return ;
}
int FindMenu()
{
system("cls");
puts("\n\n\t\t1、按姓名查找:");
puts("\t\t2、按学号查找:");
puts("\t\t0、退出回主菜单:"); int i = ; scanf_s("%d",&i); switch(i)
{
case :
FindByName();
break;
case :
FindByNum();
break;
default:
return i;
}
system("pause");
return i;
}
//按姓名修改成绩
int ModifyByName()
{
char name[];
float fmath =0.0;
printf("请输入姓名:");
scanf("%s",name);
printf("请输入新成绩:");
scanf("%f",&fmath); SNode* p = g_Head;
while (p)
{
if (strcmp(p->data.sName,name)==)
{
printf("修改前:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath);
p->data.fMath=fmath; puts("学号\t姓名\t数学"); printf("修改后:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath);
return ;
} p=p->pNext;
}
return ;
}
//按学号修改成绩
int ModifyByNum()
{
float fmath =0.0;
int iNum =;
printf("请输入学号:");
scanf_s("%d",&iNum);
printf("请输入新成绩:");
scanf("%f",&fmath); SNode* p = g_Head;
while (p)
{
if (p->data.nNum == iNum)
{
printf("修改前:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath);
p->data.fMath=fmath;
puts("学号\t姓名\t数学"); printf("修改后:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath);
return ;
} p=p->pNext;
}
return ;
} //只能修改成绩
int ModifyMenu()
{
system("cls");
puts("\n\n\t\t1、按姓名修改:");
puts("\t\t2、按学号修改:");
puts("\t\t0、退出回主菜单:"); int i = ; scanf_s("%d",&i); switch(i)
{
case :
ModifyByName();
break;
case :
ModifyByNum();
break;
default:
return i;
}
system("pause");
return i;
} int Menu()
{
system("cls");//clear screen
puts("\n\t\t1、浏览所有信息");
puts("\t\t2、添加信息");
puts("\t\t3、删除信息");
puts("\t\t4、修改信息");
puts("\t\t5、查找信息");
puts("\t\t6、颜色设置");
puts("\t\t0、退出");
printf("\t\t请选择:");
int i = ;
scanf_s("%d",&i);
switch(i)
{
case :
//PrintAll();
while(SortMenu());
break;
case :
while(AddMenu())
;
break;
case :
while(DeleteMenu())
;
break;
case :
while(ModifyMenu())
;
break;
case :
while(FindMenu())
;
break;
case :
break; } return i;
}
int main()
{
system("color 1f"); printf("\n\n");
printf(" \t *******************************************************************\n");
printf(" \t ****** ******\n");
printf(" \t ****** 员工工管理信息系统 ******\n");
printf(" \t ****** ******\n");
printf(" \t ****** 2018-8-5 ******\n");
printf(" \t ****** http://www.cnblogs.com/chechen/ ******\n");
printf(" \t ****** 按任意键继续 ******\n"); char c = _getch(); Load();
while(Menu())
;
return ;
}
项目效果图:

主菜单:

浏览信息:

设置颜色默认的控制台前景和背景色:

C语言动态链表数据结构实现的学生信息项目的更多相关文章
- C语言动态链表数据结构
链表的操作增删改查 typedef int DATA; struct SNode { DATA data; SNode* pNext; }; SNode* g_head=NULL;//全局变量 //从 ...
- 使用C语言协助办公_02批量修改学生信息
最新录制了一个使用C语言批量修改学生信息的视频,主要是讲了如何处理文件路径以及批量修改的思路.灵感来源于需要将整个17级社保照片按规格改名字.具体见:https://chuanke.baidu.com ...
- 大一C语言结课设计之《学生信息管理系统》
第一次写这么长的程序,代码仅供參考,有问题请留言. /* ** 学生信息管理系统 ** IDE:Dev-Cpp 4.9.9.2 ** 2014-6-15 */ #include <stdio.h ...
- c语言结构体保存并输出学生信息
最近在学习数据结构,巩固下c语言. #include<stdio.h> /*定义结构体student并设置别名stud*/ /*typedef struct student{ int nu ...
- 【转载】C语言综合实验1—学生信息管理系统
http://www.cnblogs.com/Anker/archive/2013/05/06/3063436.html 实验题目:学生信息管理系统 实验要求:用户可以选择1-7可以分别进行学生信息的 ...
- 学生信息管理系统(C语言)
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student ...
- 使用C语言描述静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...
- C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List
C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...
- 学生信息管理系统-顺序表&&链表(数据结构第一次作业)
实验目的 : 1 .掌握线性表的定义: 2 .掌握线性表的基本操作,如建立.查找.插入和删除等. 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能: (1) 根 ...
随机推荐
- 从0开始搭建vue+webpack脚手架(二)
接着从0开始搭建vue+webpack脚手架(一) 三.配置webpack-dev-server 1. webpack-dev-server自带一个node的服务器, 项目在服务端运行的同时可以实现热 ...
- Visio 保存卡死解决办法
右键Visio图标 属性--兼容性--以兼容模式运行这个程序 要打上对勾 且下面的系统版本要选和你电脑版本一致的选项 特权等级 以管理员身份运行次程序 要打上对勾
- Rpgmakermv(31)MOG插件与YEP的结合
问题简述: 因为我在开发时使用了gamequestsystem(任务插件),所以必须使用YEP_mainmenumanager; 此时,我又想加个MOG_Picture插件(图片收集插件): 当他们在 ...
- Maven的特点、优点-功能摘要
Maven功能摘要 以下是Maven的主要特点: 遵循最佳实践的简单项目设置 - 在几秒钟内启动新项目或模块 所有项目的一致使用 - 意味着新开发人员进入项目的时间不会增加 卓越的依赖管理,包括自动更 ...
- [博客迁移]探索Windows Azure 监控和自动伸缩系列1 - 连接中国区Azure
最近准备基于Microsoft Azure Management Libraries 实现虚拟机的监控.主要的需求就是获取虚拟机内置的性能计数器数据,基于性能计数器实现后续的监控和自动伸缩. 作为这一 ...
- Swift闭包(I) @autoclosure和@escaping的区别
1. 参考资料 https://www.cnblogs.com/sgxx/p/6209944.html https://www.jianshu.com/p/99ade4feb8c1
- 【2017-03-13】Tsql 数学函数、字符串函数、转换函数、时间日期函数
一.数学函数(针对值类型操作) 1.ceiling():取上限 只要小数点后有数字大于0,整数位自动进1 2.floor():取下限 将小数点位舍去,不管小数点位大小 3.round(四舍五入的值,保 ...
- Spark学习之路 (六)Spark Transformation和Action
Transformation算子 基本的初始化 java static SparkConf conf = null; static JavaSparkContext sc = null; static ...
- 大数据处理框架之Strom:kafka storm 整合
storm 使用kafka做数据源,还可以使用文件.redis.jdbc.hive.HDFS.hbase.netty做数据源. 新建一个maven 工程: pom.xml <project xm ...
- python 读csv文件对列名进行合法性验证
如果正在读取CSV 数据并将它们转换为命名元组,需要注意对列名进行合法性认证.例如,一个CSV 格式文件有一个包含非法标识符的列头行,这样最终会导致在创建一个命名元组时产生一个ValueError 异 ...