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) 根 ...
随机推荐
- SpringMVC注解式开发之接收请求参数
逐个接收(涉及注解@RequestParam) index.jsp的name必须和后端的名字一致,第一种才可以实现. 以对象形式整合接收 域属性参数的接收 数组或集合参数的接收 restfull风格传 ...
- 011-Server服务器对象属性
Transfer:第一个页面直接调用第二个页面,执行完第二个页面后不再返回第一个页面,立即响应到客户端浏览器.Execute:第一个页面直接调用第二个页面,执行完第二个页面后再返回第一个页面执行,最后 ...
- SQL Server如何将Id相同的字段合并,并且以逗号隔开
需要用到stuff函数: 例: id name 1 张三 1 李四 ...
- 合并dict、list的方法
dict1={1:[1,11,111],2:[2,22,222]}dict2={3:[3,33,333],4:[4,44,444]}合并两个字典得到类似 {1:[1,11,111],2:[2,22,2 ...
- Java操作队列
Java操作队列 常见的几种模式: 1 简单队列simple 模型:(p + 队列 + c) P:生产者producer,将消息发送到队列 红色:消息队列 C:消费者consumer,从队列消费消 ...
- leetCodelinked-list-cycle-ii找到链表的环
题目 Given a linked list, return the node where the cycle begins. If there is no cycle, return null. N ...
- workerman程序调试
现象1 启动后报错类似如下: php start.php start PHP Warning: stream_socket_server(): unable to connect to tcp://x ...
- 几种线程安全的Map解析
转载自 面试必问-几种线程安全的Map解析 HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局 ...
- 102.自己实现ArrayList
package collection; import java.util.ArrayList; import java.util.List; /** * 自己实现一个ArrayList,帮助理解底层结 ...
- CentOS7 zabbix服务 简单安装文档
1. 简介 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快 ...