其他分享
首页 > 其他分享> > 【数据结构】课程设计-学生信息管理系统(双向链表)

【数据结构】课程设计-学生信息管理系统(双向链表)

作者:互联网

期末课程设计要求

在这里插入图片描述

程序代码:

运行截图:

在这里插入图片描述

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

标签:课程设计,cout,next,链表,prior,DLinkList,信息管理系统,Dnode,name
来源: https://blog.csdn.net/m0_47282648/article/details/120230637