选课清单--数据结构课程设计(十字链表+哈希表实现)

题目如上(九院版,被老师要求选这个题目做,不知道还有没有别的学校是这种题目,都可以相互借鉴hh)

代码写的有冗余,结构体应该有三个,一个学生,一个课程,一个十字链表的结构体,如果公用十字链表的结构体,学生和课程会有很多指针用不上,但是我懒,不想改了,将就着看吧......

代码如下:

//课程编号为1——2500的编号 
//学号为十位数字 
#include<cstdio>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<time.h> 
#include<map>
using namespace std;
const int MAXstu=40010,MAXcou=2510,mod=1e5;
typedef long long LL;
bool st1[MAXstu];
bool st2[MAXcou];//初始化学生和课程的姓名,方便生成整套的大数据
char stuNames[10][20]={"Alice","Bob","Charlie","David","Emma","Frank","Grace","Henry","Ivy","Jack"};
char couNames[10][20]={"Math","Physics","Chemistry","Biology","History","Literature","Art","Music","Computer Science","Geography"};struct Node
{LL stuid;//学生学号char stuname[20];//学生姓名int couid;//课程编号char couname[20];//课程名struct Node *prestu;//指向学生前驱节点struct Node *stu;//指向学生后继节点struct Node *precou;//指向课程前驱节点struct Node *cou;//指向课程后继节点
};
struct Node students[MAXstu],courses[MAXcou]; //函数声明 
void Add_Stu();//添加学生 
void Add_Cou();//添加课程
void ChooseCourse();//学生进行选课
void printStuCou();//输出学生所选课程信息
void printCouStu();//输出课程被学生选的信息 
void DeleteStu();//删除学生信息 
void DeleteCou();//删除课程信息
int hash1(long long);//学生学号哈希 LL hashid[MAXstu]={0};
int hash1(LL id){//学生学号哈希,采用除留余数法int k=id%MAXstu;while(hashid[k]!=id&&hashid[k]!=0){//线性探测k++;if(k==MAXstu)k=0;//循环数组}hashid[k]==id;return k;
}
void Add_Stu(char name[],LL id)//添加学生
{int k=hash1(id);//学号的哈希值if(st1[k]){printf("该学生已存在,请勿重复添加!!!\n");return;}st1[k]=true;strcpy(students[k].stuname,name);//姓名放里面students[k].stuid=id;//学号放里面students[k].cou=NULL;//该学生选的课程链表初始化为空students[k].precou=NULL; printf("添加学生成功!!!\n"); 
}
void Add_Cou(char name[],int id)//添加课程
{if(st2[id]){printf("该课程已存在,请勿重复添加!!!\n");return;}st2[id]=true;strcpy(courses[id].couname,name);//课程名courses[id].couid=id;//课程编号courses[id].stu=NULL;//选该课程的学生链表初始化为空courses[id].prestu=NULL;printf("添加课程成功!!!\n");
}
void ChooseCourse(LL stuid,int couid)//学生进行选课
{Node *t=(Node*)malloc(sizeof(Node));//申请一个新的节点 t->stuid=stuid,t->couid=couid;strcpy(t->couname,courses[t->couid].couname);//课程名 //四个指针域都为空 t->cou=NULL;t->precou=NULL;t->stu=NULL;t->prestu=NULL;int k=hash1(t->stuid);//学号的哈希值 if(!st1[k]){printf("该学生不存在,输入错误,选课失败!!!\n"); return;}if(!st2[t->couid]){printf("该课程不存在,输入错误,选课失败!!!\n");return;}strcpy(t->stuname,students[k].stuname);//学生姓名 //给学生连节点Node *p=students[k].cou;Node *q;if(p==NULL){students[k].cou=t;}else{q=p,p=p->cou;while(p!=NULL)q=p,p=p->cou;q->cou=t;t->precou=q;}//给课程连节点p=courses[t->couid].stu;if(p==NULL){courses[t->couid].stu=t;}else{q=p,p=p->stu;while(p!=NULL)q=p,p=p->stu;q->stu=t;t->prestu=q;}printf("学号为%010lld的学生成功选择了课程编号为%d的课程!!!\n",t->stuid,t->couid);
}void printStuCou()//输出学生所选课程信息
{LL id;printf("请输入您要查找学生的学号:"); scanf("%lld",&id);int k=hash1(id);if(!st1[k]){cout<<"该学生不存在,输入错误!!!"<<endl;return;}Node *p=students[k].cou;if(p==NULL){cout<<"该学生暂未选择任何课程!!!"<<endl;return;}printf("学生名为%s,学号为%010lld的学生所选的课程如下:\n",students[k].stuname,id);while(p!=NULL){printf("课程编号:%04d   课程名:%s\n",p->couid,p->couname);p=p->cou;}
}
void printCouStu()//输出课程被学生选的信息 
{int id;printf("请输入您要查找的课程编号:");scanf("%d",&id);if(!st2[id]){cout<<"该课程不存在,输入错误!!!"<<endl;return;}Node *p=courses[id].stu;if(p==NULL){cout<<"该课程暂未被任何学生选择!!!"<<endl; return;}printf("课程名为%s,课程编号为%d的课程被选的信息如下:\n",courses[id].couname,id);while(p!=NULL){printf("学号:%010lld  学生姓名:%s\n",p->stuid,p->stuname);p=p->stu; }
} 
void DeleteStu()//删除学生信息 
{LL id;printf("请输入您要删除的学生学号:");scanf("%lld",&id);int k=hash1(id);if(!st1[k]){printf("该学生不存在,删除失败!!!\n");return;} st1[k]=false;//标记删除 Node *p=students[k].cou;while(p!=NULL){if(p==courses[p->couid].stu)courses[p->couid].stu=p->stu;else{if(p->prestu!=NULL)p->prestu->stu=p->stu;if(p->stu!=NULL)p->stu->prestu=p->prestu;}Node *t=p;p=p->cou;delete(t);}printf("学号为%010lld的学生删除成功!!!\n",id); 
}void DeleteCou()//删除课程信息
{int id;printf("请输入你要删除的课程编号:");scanf("%d",&id);if(!st2[id]){printf("不存在该课程,删除失败!!!\n");return;}st2[id]=false;//标记删除Node *p=courses[id].stu;while(p!=NULL){int k=hash1(p->stuid);if(p==students[k].cou)students[k].cou=p->cou;else{if(p->precou!=NULL)p->precou->cou=p->cou;if(p->cou!=NULL)p->cou->precou=p->precou;}Node *t=p;p=p->stu;delete(t);}printf("课程编号为%d的课程删除成功!!!\n",id);
}void initializeData()//初始化,随机生成学生和课程及学生选课的数据 
{srand(time(NULL));// 设置随机种子//生成随机学生数据,rand()最大可生成32767,9999999999/32767=305185 for (int i=0;i<MAXstu;++i){LL id=(LL)305185*rand()%9999999999+1; // 随机生成学生学号char name[20];strcpy(name,stuNames[rand()%10]); // 从学生姓名数组中随机选择一个姓名Add_Stu(name,id);//添加学生}// 生成随机课程数据for (int i=0;i<MAXcou;i++){int id=rand()%2500+1;//随机生成课程编号char name[20];strcpy(name,couNames[rand()%10]);Add_Cou(name,id);//添加课程 }//随机选择部分学生并为其分配已选的课程for (int i=0;i<MAXstu/2;i++)//假设有一半的学生已经完成选课 {int k=rand()%40000+1; //随机选择学生学号的哈希值 if(!st1[k])continue;//如果该学生不存在,则直接进入下层循环 LL stuid=students[k].stuid;//记录学生编号 int numCourses=rand()%5+1; //随机生成已选课程的数量,假设每个学生选 1 到 5 门课for(int j=0;j<numCourses;j++){int couid=rand()%2500+1; // 随机生成课程编号ChooseCourse(stuid,couid);//学生选课}}
}int main()
{//initializeData();//初始化数据,不加这句话就要自己手动初始化了while(1){cout<<"********************************"<<endl;cout<<"*====请选择以下数字进行操作====*"<<endl;cout<<"*     0 退出系统               *"<<endl;cout<<"*     1 添加学生信息           *"<<endl;cout<<"*     2 添加课程信息           *"<<endl;cout<<"*     3 删除学生信息           *"<<endl;cout<<"*     4 删除课程信息           *"<<endl;cout<<"*     5 学生进行选课           *"<<endl;cout<<"*     6 输出课程所选学生名单   *"<<endl;cout<<"*     7 输出学生选课课程清单   *"<<endl;cout<<"********************************"<<endl;int choice;printf("请输入您要做的操作:");scanf("%d",&choice);switch(choice){case 0:exit(0);case 1:{int op=1;while(op){char name[20];LL id;printf("请输入要添加的学生姓名和学号(学号小于等于十位数):");scanf("%s%lld",name,&id);Add_Stu(name,id);printf("继续添加学生请输入1,否则输出0,请输入:");scanf("%d",&op);}break;}case 2:{int op=1;while(op){int id;char name[20];printf("请输入要添加的课程编号(课程编号小于等于四位数)和课程名:");scanf("%d%s",&id,name);Add_Cou(name,id);printf("继续添加课程请输入1,否则输出0,请输入:");scanf("%d",&op);}break;}case 3:DeleteStu();break;case 4:DeleteCou();break;case 5:{int op=1;while(op){LL stuid;int couid;scanf("%lld%d",&stuid,&couid);ChooseCourse(stuid,couid);printf("继续选课请输入1,否则输出0,请输入:"); scanf("%d",&op);}break;}case 6:printCouStu();break;case 7:printStuCou();break;}}return 0;
} 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/346593.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构初阶 · 链式二叉树的部分问题

目录 前言&#xff1a; 1 链式二叉树的创建 2 前序 中序 后序遍历 3 树的节点个数 4 树的高度 5 树的叶子节点个数 6 树的第K层节点个数 前言&#xff1a; 链式二叉树我们在C语言阶段已经实现了&#xff0c;这里介绍的是涉及到的部分问题&#xff0c;比如求树的高度&am…

2024年6月8日,骑行杨柳冲峡谷:一场心灵与自然的交响曲

引言&#xff1a;寻找生活的节奏在这个快节奏的时代&#xff0c;我们常常迷失在都市的喧嚣中&#xff0c;忘记了如何聆听内心的声音。2024年6月8日&#xff0c;我与一群志同道合的校卡骑行群骑友&#xff0c;踏上了前往杨柳冲峡谷的旅程&#xff0c;这不仅仅是一次简单的户外活…

远程咨询的好处都有哪些呢?

随着科技的飞速发展&#xff0c;远程咨询正逐渐成为人们获取医疗服务的一种新方式。那么什么是远程咨询呢&#xff1f;其又有哪些好处呢&#xff1f;下面就给大家详细地说说。 远程咨询的概念 远程咨询&#xff0c;顾名思义&#xff0c;是指通过互联网技术&#xff0c;实现患…

nlp学习笔记

目录 很多入门例子 bert chinese 很多入门例子 https://github.com/lansinuote/Huggingface_Toturials bert chinese import torch import torch.nn as nn from transformers import AutoTokenizer, AutoModel, BertModel, TFBertModel, BertTokenizer# youpath = D:/bert-…

腾讯云和windows11安装frp,实现内网穿透

一、内网穿透目的 实现公网上&#xff0c;访问到windows上启动的web服务 二、内网穿透的环境准备 公网服务器、windows11的电脑、frp软件(需要准备两个软件&#xff0c;一个是安装到公网服务器上的&#xff0c;一个是安装到windows上的) frp下载地址下载版本 1.此版本(老版…

「动态规划」如何求粉刷房子的最少花费?

LCR 091. 粉刷房子https://leetcode.cn/problems/JEj789/description/ 假如有一排房子&#xff0c;共n个&#xff0c;每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然&#xff0c;因为市…

【全开源】驾校练车管理系统源码(FastAdmin+ThinkPHP)

&#x1f698;驾校练车管理系统&#xff1a;让学车之路更顺畅&#xff01;&#x1f4c8; 一款基于FastAdminThinkPHP开发的驾校管理系统&#xff0c;驾校管理系统(DSS)主要面向驾驶学校实现内部信息化管理&#xff0c;让驾校管理者和工作人员更高效、更快捷的完成枯燥无味的工…

基于JSP的医院远程诊断系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP Servlet JSPBean 工具&#xff1a; IDEA/Eclipse、Navica…

差动放大器

差动器的出现是为了解决直接耦合电路存在的零点漂移问题&#xff0c;另外&#xff0c;差动放大器还有灵活的输入&#xff0c;输出方式。 一&#xff0c;基本差动放大器 差动放大器在电路结构上具有对称性&#xff0c;三极管VT1&#xff0c;VT2同型号&#xff0c;R1R2,R3R4,R5…

MySQL数据库(二)和java复习

一.MySQL数据库学习(二) (一).DQL查询数据 DQL&#xff08;Data Query Language&#xff09;是用于从数据库中检索数据的语言。常见的 DQL 语句包括 SELECT、FROM、WHERE、GROUP BY、HAVING 和 ORDER BY 等关键字&#xff0c;用于指定要检索的数据、数据源、过滤条件、分组方…

20240607每日通信--------VUE3前端引入scoket-io,后端引入Netty-SocketIO,我成功了,希望一起交流沟通

无语 前置&#xff1a; VUE3 前端集成scoket-io socket.io-client Sringboot 3.0JDK17集成Netty-SocketIO Netty-SocketIO 失败原因一&#xff1a; 前期决定要写demo时候&#xff0c;单独了解了&#xff0c;后端引入Netty-SocketIO注意事项&#xff0c;详见我先头写的博客 前…

PCL 生成空间椭圆点云

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 设椭圆在 X O Y XOY XOY平面上,参数方程为:

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 20 - 21节&#xff09; P20《19.ArkUI-属性动画和显式动画》 本节先来学习属性动画和显式动画&#xff1a; 在代码中定义动画&am…

蓄电池MSDS报告办理 锂电池运输鉴定中英文报告申请

MSDS 指的是化学产品安全技术说明书 MSDS 报告一般是由工厂所出具的&#xff0c;但也逐渐的应用在各种贸易过程当中&#xff0c;在海运过程当中&#xff0c;相关的产品也需要提供 MSDS 认证报告&#xff0c;不过有些人对于 MSDS 认证所规定的内容不是很了解&#xff0c;接下来大…

Apple开发者macOS设备与描述文件Profile创建完整过程

安装并打开Apple Configurator 新建描述文件 输入macOS平台的描述文件的相关信息,然后选择证书 选择一个可用证书 存储描述文件 存储成功如下: 使用文本编辑器打开刚才保存的描述文件,找到设备名与UDID

绿联Nas docker 中 redis 老访问失败的排查

部署了一些服务&#xff0c;老隔3-5 天其他服务就联不上 redis 了&#xff0c;未确定具体原因&#xff0c;只记录观察到的现象 宿主机访问 只有 ipv6 绑定了&#xff0c;ipv4 绑定挂掉了 其他容器访问 也无法访问成功 当重启容器后&#xff1a; 一切又恢复正常。 可能的解…

简易概况广告变现

广告变现是指媒体或平台通过向用户展示广告主的广告&#xff0c;从而获得收入的过程。 广告变现就像是一个店主&#xff0c;他需要一个吸引人的店面&#xff0c;提供优质的内容和服务&#xff0c;然后在店里摆放一些别人的商品或服务&#xff0c;每当有客人看了或买了这些商品或…

RocketMQ查询出重复数据,两条MessageID一样的解决办法如下

问题描述 在使用RocketMQ的可视化工具dashboard-1.0.0时,首先生产了10条数据,但是查询时却查出来了14条,有四条数据重复,重复数据MessageID和key相同,但是通过key单独查询却只能查出一条 测试代码 package com.fdw.rocketmq.producer;import org.apache.rocketmq.client…

【精通NIO】NIO介绍

一、什么是NIO NIO&#xff0c;全称为New Input/Output&#xff0c;是Java平台中用于替代传统I/O&#xff08;Blocking I/O&#xff09;模型的一个功能强大的I/O API。NIO在Java 1.4版本中被引入&#xff0c;其设计目标是提供一种非阻塞的、低延迟的I/O操作方式&#xff0c;以…

清华出品,开源最强,我又出手了(全网首发!)

清华出品的ChatGLM-6B自开源那刻起&#xff0c;GLM系列的每一次更新都受到了业界的热切关注。尤其是ChatGLM第3代开源之后&#xff0c;其强大和适配性让很多人惊叹&#xff0c;之后大家对GLM的第4代模型充满了期待。终于&#xff0c;今天它来了&#xff01;我要为大家介绍的是这…