期末课程设计要求
程序代码:
运行截图:
//writing by ZYR
//2021-6-25&&26
#include<iostream>
#include<string.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct student {
char name[20];
int score;
char StuNum[10];
}ElemType;
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef struct Dnode { //定义双向链表
ElemType data;//定义数据域类型
struct Dnode *prior;//定义前驱指针
struct Dnode *next;//定义后驱指针
} Dnode,*DLinkList;
Status InitList(DLinkList &L) { //初始化双向链表
L=new Dnode;//创建双向链表
L->prior=NULL;
L->next=NULL;
}
Status Insert(DLinkList &L,ElemType e) { //在链表头部插入数据元素
Dnode* p=new Dnode;//创建结点空间
p->data=e;//结点数据域赋值
p->next=L->next;//p结点的后继为以前的首元结点
p->prior=L;//p的前驱为首元结点
if(L->next) { //如果之前没有数据元素的话,L->next为NULL则无法访问其前驱指针
L->next->prior=p;//原来的首元结点的前驱为新插入结点
}
L->next=p;//p为新的首元结点
}
void show(DLinkList L) { //显示双向链表中的元素
Dnode* p=L->next;
while(p) {
cout<<p->data.StuNum<<" "<<p->data.name<<" "<<p->data.score<<endl;
p=p->next;
}
cout<<endl;
}
Dnode* GetNode(DLinkList L,int m) { //获取指定位置结点
Dnode *p=L->next;
int j=1;
while(j<m&&p) {
p=p->next;
j++;
}
return p;//当i大于表长或者链表为空,返回的p为NULL
}
Status InsertList(DLinkList &L,int i,ElemType e) { //将e插入链表第i个位置
Dnode *p,*s;
if(!(p=GetNode(L,i)))//如果i不存在,返回ERROR
return ERROR;
s=new Dnode;//创建新结点
//头插法插入
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return OK;
}
Status DeletList(DLinkList &L,int i) { //删除学生信息表中的第i个元素
int j=1;
Dnode *p=GetNode(L,i);//查找第i个元素
if(p) {
p->prior->next=p->next;
if(p->next!=NULL) {
p->next->prior=p->prior;
}
delete p;
return OK;
} else {
return ERROR;
}
}
Status ModifyList(DLinkList &L,char* name,int score) { //修改学生成绩
Dnode *p=L->next;
while(p) {
if(strcmp(p->data.name, name)==0) {
p->data.score=score;
return OK;
}
p=p->next;
}
return ERROR;
}
Dnode *GetNodeValue(DLinkList L,char *name) { //获取指定位置学生信息表元素
Dnode *p=L->next;//p指向头结点
while(p) {
if(strcmp(p->data.name, name)==0) {
return p;
}
p=p->next;
}
return NULL;
}
Status GetLength(DLinkList L) { //统计学生信息表数据元素个数
Dnode *p=L->next;//p指向头结点
int i=0;
while(p) {
i++;
p=p->next;
}
return i;
}
void sortList(DLinkList &L) {//对学生成绩进行排序
if(L->next) {
DLinkList p=new Dnode;//使p为新双向链表表头
p->next=L->next;
L->next->prior=p;
L->next=NULL;
Dnode *pmax,*q;
while(p->next) {
q=p->next;
pmax=p->next;
while(q) {
if(pmax->data.score<q->data.score) {
pmax=q;
}
q=q->next;
}
pmax->prior->next=pmax->next;
if(pmax->next) {
pmax->next->prior=pmax->prior;
}
pmax->next=L->next;//头插法插入
pmax->prior=L;
L->next=pmax;
}
}
}
void SaveData(DLinkList L) { //保存链表数据文件到data.txt里面
FILE* fp=fopen("E:\数据结构\课程设计day1\data.txt","w");
if(fp==NULL) {
cout<<"打开文件失败!"<<endl;
return;
}
Dnode *p=L->next;//p指向头结点
while (p!=NULL) {
fwrite(&p->data,sizeof(ElemType),1,fp);
p=p->next;
}
fclose(fp);//关闭文件
cout<<"数据保存成功"<<endl;
}
Status Clear(DLinkList &L) { //清空链表数据元素
Dnode *p,*q;
if(L->next==NULL) {
return 0;
}
p=L->next;
while(p) {
q=p->next;
delete p;
p=q;
}
L->next=NULL;
return OK;
}
void ReadData(DLinkList &L) { //读取data.txt里的数据并写入到链表中
Clear(L);
FILE *fp=fopen("E:\数据结构\课程设计day1\data.txt","r");
if(fp==NULL) {
cout<<"打开文件失败!"<<endl;
return;
}
ElemType e;
Dnode *r=L;
while(fread(&e,sizeof(ElemType),1,fp)) {
//用尾插法将数据插入到链表里
Dnode *p=new Dnode;
p->data=e;
p->next=NULL;
p->prior=r;
r->next=p;
r=p;
}
fclose(fp);
cout<<"加载数据成功!"<<endl;
}
void tips() {
cout<<"*********Welcome To This System*********"<<endl;
cout<<"**********你可以进行如下操作:***********"<<endl;
cout<<"* 1 创建学生表 *"<<endl;
cout<<"* 2 查找结点的位置 *"<<endl;
cout<<"* 3 插入学生信息 *"<<endl;
cout<<"* 4 删除学生信息 *"<<endl;
cout<<"* 5 修改学生成绩 *"<<endl;
cout<<"* 6 查找学生信息元素 *"<<endl;
cout<<"* 7 学生信息链表长度 *"<<endl;
cout<<"* 8 学生成绩排序 *"<<endl;
cout<<"* 9 返回菜单 *"<<endl;
cout<<"* a 保存数据 *"<<endl;
cout<<"* b 读取数据 *"<<endl;
cout<<"* 0 退出系统 *"<<endl;
cout<<"****************************************"<<endl;
}
int main() {
tips();
int i,m,n,score;
char name[20];
ElemType e;
DLinkList L;
InitList(L);
Dnode *p;
char c;
while(1) {
cin>>c;
switch(c) {
case '1': {
cout<<"请输入要插入元素的个数:"<<endl;
cin>>n;
for(int i=1; i<=n; i++) {
cout<<"请输入第"<<i<<"个学生的学号:"<<endl;
cin>>e.StuNum;
cout<<"请输入第"<<i<<"个学生的姓名:"<<endl;
cin>>e.name;
cout<<"请输入第"<<i<<"个学生的分数:"<<endl;
cin>>e.score;
Insert(L, e);
}
cout<<"学生信息表为:"<<endl;
show(L);
break;
}
case '2': {
cout<<"请输入需要查找学生的位置:";
cin>>m;
p=GetNode(L,m);
cout<<"该学生学号为:"<<endl;
cout<<p->data.StuNum<<endl;
cout<<"该学生姓名为:"<<endl;
cout<<p->data.name<<endl;
cout<<"该学生成绩为:"<<endl;
cout<<p->data.score<<endl;
break;
}
case '3': {
cout<<"请输入插入学生信息的位置:"<<endl;
cin>>i;
cout<<"请输入插入学生的学号:"<<endl;
cin>>e.StuNum;
cout<<"请输入插入学生的姓名:"<<endl;
cin>>e.name;
cout<<"请输入插入学生的成绩:"<<endl;
cin>>e.score;
InsertList(L,i,e);
cout<<"插入后学生信息表为:"<<endl;
show(L);
break;
}
case '4': {
cout<<"请输入需要删除结点的位置:"<<endl;
cin>>i;
DeletList(L,i);
cout<<"删除后学生信息表为:"<<endl;
show(L);
break;
}
case '5': {
cout<<"请输入需要修改的学生姓名:"<<endl;
cin>>name;
cout<<"请输入需要修改的学生成绩:"<<endl;
cin>>score;
ModifyList(L,name,score);
cout<<"修改后的学生信息表为:" <<endl;
show(L);
break;
}
case '6': {
cout<<"请输入需要查找的学生的姓名:" ;
cin>>e.name;
p=GetNodeValue(L,e.name);
if(p)
cout<<"存在学生" <<p->data.name<<endl;
else
cout<<"不存在该学生"<<endl;
break;
}
case '7': {
cout<<"该学生信息表长度为:";
cout<<GetLength(L)<<endl;
break;
}
case '8' : {
cout<<"双向链表元素进行排序后的链表为:"<<endl;
sortList(L);
show(L);
break;
}
case '9': {
tips();
break;
}
case 'a': {
SaveData(L);
break;
}
case 'b': {
ReadData(L);
show(L);
break;
}
case '0': {
return 0;
break;
}
default:{
cout<<"输入的信息有误!"<<endl;
break;
}
}
}
}
/*writing by ZYR*/
总结:
大二下数据结构期末课程设计
在学校机房磕磕绊绊写了差不多2天
算是把一学期的知识全部应用熟悉了一遍
超喜欢数据结构老师的