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) 根 ...
随机推荐
- java类的包装类
包装类的基本用法 为什么需要包装类(Wrapper Class) java并不是纯面向对象的语言,java语言是一个面向对象的语言,但是java中的基本数据类型却不是面向对象的,但是我们在实际使用中经 ...
- docker tool
安装docker tool http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 安装1.8.3 有把vbox等服务器地址加 ...
- centos python2升级为python3 升级旧版本django
阿里云centos python3 及django的配置 安装python3后 pip 会把下载的包安入python2.7 下面解决该问题 python3.5安装1,安装依赖包#yum install ...
- HTML/HTML5 Input类型&&表单
1.HTML 中"不常用"input类型中的属性值: disabled:输入字段禁用: maxlength:输入字段的最大字符长度: readonly:输入字符只读,无法修改: s ...
- html5-增强的表单-表单的重写
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- jQuery安装
http://www.runoob.com/jquery/jquery-install.html 网页中添加jQuery: 方法一:可以从http://jquery.com/download/ 下载j ...
- QScrollBar & QSlider & QDial
[1]滚动条 & 滑块 & 表盘 Qt示例工程: (1)slidergroup.h #include <QGroupBox> QT_BEGIN_NAMESPACE clas ...
- vm无法删除干净老版本,新版本无法安装解决
百度中搜索“Windows Installer Clean UP 简体中文版”来下载安装好 开始程序,打开此软件, 找到vm,点remove 再次安装vm新版本,ok
- requests 学习笔记
除了get 方式外 还有post 等等 注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里 import requests getpara = {"key1":& ...
- array_contains 分析函数使用演示
Hive中的array_contains函数与SQL中的 in关键字 操作类似,用于判定 包含(array_contains)或不包含(!array_contains)关系.与 in不同的是array ...