注:此项目来源于吕鑫老师的教程

#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语言动态链表数据结构实现的学生信息项目的更多相关文章

  1. C语言动态链表数据结构

    链表的操作增删改查 typedef int DATA; struct SNode { DATA data; SNode* pNext; }; SNode* g_head=NULL;//全局变量 //从 ...

  2. 使用C语言协助办公_02批量修改学生信息

    最新录制了一个使用C语言批量修改学生信息的视频,主要是讲了如何处理文件路径以及批量修改的思路.灵感来源于需要将整个17级社保照片按规格改名字.具体见:https://chuanke.baidu.com ...

  3. 大一C语言结课设计之《学生信息管理系统》

    第一次写这么长的程序,代码仅供參考,有问题请留言. /* ** 学生信息管理系统 ** IDE:Dev-Cpp 4.9.9.2 ** 2014-6-15 */ #include <stdio.h ...

  4. c语言结构体保存并输出学生信息

    最近在学习数据结构,巩固下c语言. #include<stdio.h> /*定义结构体student并设置别名stud*/ /*typedef struct student{ int nu ...

  5. 【转载】C语言综合实验1—学生信息管理系统

    http://www.cnblogs.com/Anker/archive/2013/05/06/3063436.html 实验题目:学生信息管理系统 实验要求:用户可以选择1-7可以分别进行学生信息的 ...

  6. 学生信息管理系统(C语言)

    #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student ...

  7. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  8. C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List

    C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...

  9. 学生信息管理系统-顺序表&&链表(数据结构第一次作业)

    实验目的 : 1 .掌握线性表的定义: 2 .掌握线性表的基本操作,如建立.查找.插入和删除等. 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能: (1) 根 ...

随机推荐

  1. 数据表格控件 DataGridControl

    数据表格控件 书154页 <?xml version="1.0" encoding="utf-8"?> <s:Application xmln ...

  2. bat cmd 获取管理员权限

    @ echo off % % ver|find "5.">nul&&goto :Admin mshta vbscript:createobject()(win ...

  3. HDU 4686 Arc of Dream(矩阵)

    Arc of Dream [题目链接]Arc of Dream [题目类型]矩阵 &题解: 这题你做的复杂与否很大取决于你建的矩阵是什么样的,膜一发kuangbin大神的矩阵: 还有几个坑点: ...

  4. jQuery-表格属性

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Rpgmakermv(12) gacha插件系列

    很有趣的插件,可以做扭蛋啦,抽奖啦之类的东西.... 简单的示范: a.开始抽奖画面: b.抽奖中 c.随机得到物品 d.查看收集图鉴 e.图鉴内容 1.gacha 作用: get the item ...

  6. UIView的背景颜色

    一个UIColor代表一种颜色,通过UIColor的类方法,可以获得很多常用的颜色 + (UIColor *)blackColor;      // 0.0 white 黑色 + (UIColor * ...

  7. xpath ,css

    https://docs.scrapy.org/en/latest/intro/tutorial.html xpath @选择属性  .当前目录下选择 //任意路径选择 /bookstore/book ...

  8. jsp登陆界面代码

    <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncod ...

  9. 导航,头部,CSS基础

    1.制作自己的导航条. 2.HTML头部元素: <base>  定义了页面链接标签的默认链接地址 <style>  定义了HTML文档的样式文件 <link>  定 ...

  10. QString 与 string转换

    [1]QString 转换为string QString qString("好好学习天天向上"); std::string stdString = qString.toStdStr ...