//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天
算是把一学期的知识全部应用熟悉了一遍
超喜欢数据结构老师的