一、问题陈述

宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,如何直观的了解宿舍的入住情况和每位同学的住宿位置是提高工作效率的重要课题,根据我们所学的C语言和数据结构课程中有关链表的内容,为宿舍管理人员编写宿舍管理查询软件,就可以轻松满足实现上述需求。
任务:

  1. 为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:

    • 采用交互工作方式
    • 可按关键字(姓名、学号、房号)进行排序
  2. 查询菜单: (用二分查找实现以下操作)
    • 按姓名查询
    • 按学号查询
    • 按房号查询
  3. 打印任一查询结果(可以连续操作)

二、概要设计

2.1 概要简述

根据系统要求,即本系统具有信息的录入,显示,排序显示、查找,插入、删除、结束程序等功能,先设计出详细的系统流程图,然后将源代码输入程序,进行编译调试即可。
程序总体分10个项目:输入记录、显示记录、按姓名排序并显示、按房间号排序并显示 、按学号排序并显示 、按姓名查找并显示 、按房间号查找并显示 、按学号查找并显示、插入一条记录按学号排序并显示以及结束程序。

2.2 线性表存储结构表示

typedef struct {char name[20];int num;            //学号和房号都为整型int room;
} stu;typedef struct {int length; //当前长度stu *elem;  //存储空间基址int listsize;  //当前分配的存储容量
} linklist;

2.3 详细设计

2.3.1 系统流程图

2.3.2 三种排序方法及二分查找法
2.3.2.1 冒泡排序(按姓名排序)
//按姓名排序(采用冒泡排序)
void sort1(linklist &L) { int i, j;stu temp;for (i = 0; i<L.length - 1; i++)for (j = 0; j<L.length-1-i; j++)if (strcmp(L.elem[j].name, L.elem[j+1].name)>0) {temp = L.elem[j];L.elem[j] = L.elem[j+1];L.elem[j+1] = temp;}
}
2.3.2.2 折半插入排序(按学号排序)
//按学号排序(采用折半插入排序)
void sort2(linklist &L) { int i, j, mid, low, high;stu temp;for (i = 1; i < L.length; i++) {if(L.elem[i].num<L.elem[i-1].num) {temp = L.elem[i];low = 0;high = i-1;while (low <= high) {mid = (low + high) / 2;if (temp.num < L.elem[mid].num)high = mid - 1;elselow = mid + 1;}for (j = i - 1; j >= high+1; j--)L.elem[j+1]=L.elem[j];L.elem[high+1]=temp;}}
}
2.3.2.3 简单选择排序(按房号排序)
//按房号排序(采用简单选择排序)
void sort3(linklist &L) { int i,j,k;stu temp;for(i=0; i<L.length-1; i++) {k=i;for(j=i+1; j<L.length; j++)if(L.elem[j].room<L.elem[k].room)k=j;if(k!=i){temp = L.elem[i];L.elem[i] = L.elem[k];L.elem[k] = temp;}}
}
2.3.2.4 二分查找法(以按姓名查找为例)
//按姓名从小到大查找(采用二分查找)
void search1(linklist &L) { if (L.length == 0) {printf("已无学生记录!\n");Ret();Menu();} else {int low = 0, high = L.length, mid, flag = 0;printf("\n");printf("按姓名查找-->请输入要查找的姓名:");char a[15], ch;scanf("%s", a);while (low <= high) {mid = (low + high) / 2;if (strcmp(a, L.elem[mid].name) == 0) {flag = 1;break;} else if (strcmp(a, L.elem[mid].name)>0)low = mid + 1;elsehigh = mid - 1;}if (flag == 1) {printf("查找成功-->该学生信息为:\n");printf("姓名       学号    房号\n");printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select())search1(L);else {system("cls");Menu();}} else {printf("该学生不存在!");if (Select())    search1(L);else {system("cls");Menu();}}}
}

三、测试与运行

3.1 系统界面

3.2 新建宿舍名单

3.3 排序(以姓名排序为例)

3.4 查询(以学号查询为例)

3.5 插入学生信息

3.6 删除学生信息

四、代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define N 40 //线性表存储空间的初始分配量
#define increase 10 //线性表存储空间的分配量增量
int choice;  //定义全局变量
typedef struct {char name[20];int num;            //学号和房号都为整型int room;
} stu;
stu stud;
typedef struct {int length; //当前长度stu *elem;  //存储空间基址int listsize;  //当前分配的存储容量
} linklist;//线性表初始化
void Init(linklist &L) { L.length = 0;L.elem = (stu *)malloc(N * sizeof(stu));L.listsize = N;
}//操作菜单
void Menu() { printf( "**************************************\n" );printf( "***       欢迎进入宿舍管理系统     ***\n" );printf( "**************************************\n" );printf( "*        1.  新建宿舍名单            *\n" );printf( "*        2.  排序宿舍信息            *\n" );printf( "*        3.  查询宿舍信息            *\n" );printf( "*        4.  插入宿舍信息            *\n" );printf( "*        5.  删除宿舍信息            *\n" );printf( "*        0.  退出系统                *\n" );printf( "**************************************\n" );printf("请输入菜单(0-5):");scanf("%d", &choice);if (choice<0 || choice>5) {system("cls");printf("输入数字不对,请重新!\n");printf("\n");Menu();}}//打印学生信息
void Display(linklist &L) { int i;printf("姓名       学号    房号\n");for (i = 0; i<L.length; i++)printf("%-10s %-2d %5d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);
}//返回主界面
void Ret() {    char c;fflush(stdin);printf("\n");printf("请按任意键进入主界面:");scanf("%c", &c);system("cls");
}//创建学生信息表
void Create(linklist &L) { if (L.length >= L.listsize) { //判断学生的人数是否超过初值,如果超过,则重新分配stu *newbase;newbase = (stu*)realloc(L.elem, (N + increase) * sizeof(stu));L.elem = newbase;L.listsize += increase;}int i = 2;char ch;printf("********开始创建学生信息**********\n");printf("\n");printf("请输入第1个学生的信息\n");printf("请输入姓名:");fflush(stdin);      // 清空输入缓冲区,得到正确的输入数据gets(stud.name);    //输入一行字符串(姓名)printf("请输入学号:");scanf("%d", &stud.num);printf("请输入房号:");scanf("%d", &stud.room);ch = getchar();strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;L.length++;printf("\n");printf("是否继续输入?<y/n>:");scanf("%c", &ch);printf("\n");while (ch == 'y') {printf("请输入第%d个学生的信息\n", i);printf("请输入姓名:");fflush(stdin);      // 清空输入缓冲区,得到正确的输入数据gets(stud.name);    //输入一行字符串(姓名)printf("请输入学号:");scanf("%d", &stud.num);printf("请输入房号:");scanf("%d", &stud.room);strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;i++;L.length=i-1;ch = getchar();printf("\n");printf("是否继续输入?<y/n>:");scanf("%c", &ch);printf("\n");}if (ch == 'n')system("cls");
}//按姓名排序(采用冒泡排序)
void sort1(linklist &L) { int i, j;stu temp;for (i = 0; i<L.length - 1; i++)for (j = 0; j<L.length-1-i; j++)if (strcmp(L.elem[j].name, L.elem[j+1].name)>0) {temp = L.elem[j];L.elem[j] = L.elem[j+1];L.elem[j+1] = temp;}
}//按学号排序(采用折半插入排序)
void sort2(linklist &L) { int i, j, mid, low, high;stu temp;for (i = 1; i < L.length; i++) {if(L.elem[i].num<L.elem[i-1].num) {temp = L.elem[i];low = 0;high = i-1;while (low <= high) {mid = (low + high) / 2;if (temp.num < L.elem[mid].num)high = mid - 1;elselow = mid + 1;}for (j = i - 1; j >= high+1; j--)L.elem[j+1]=L.elem[j];L.elem[high+1]=temp;}}
}//按房号排序(采用简单选择排序)
void sort3(linklist &L) { int i,j,k;stu temp;for(i=0; i<L.length-1; i++) {k=i;for(j=i+1; j<L.length; j++)if(L.elem[j].room<L.elem[k].room)k=j;if(k!=i){temp = L.elem[i];L.elem[i] = L.elem[k];L.elem[k] = temp;}}
}
//排序函数
void Sort(linklist &L) { int c;printf("请输入排序的方式(1:按名字排序,2:按学号排序,3:按房号排序):");scanf("%d", &c);switch (c) {case 1:sort1(L);if (L.length == 0) {printf("已无学生记录!\n");Ret();Menu();} else {printf("按姓名排序:\n");Display(L);Ret();  //调用返回主界面Menu();}break;case 2:sort2(L);if (L.length == 0) {printf("已无学生记录!\n");Ret();Menu();} else {printf("按学号排序:\n");Display(L);Ret();  //调用返回主界面Menu();}break;case 3:sort3(L);if (L.length == 0) {printf("已无学生记录!\n");Ret();Menu();} else {printf("按房号排序:\n");Display(L);Ret();  //调用返回主界面Menu();}break;default:break;}
}//选择是否继续查找
int Select() { char ch;scanf("%c", &ch);printf("是否继续查找?<y/n>:");fflush(stdin);scanf("%c", &ch);if (ch == 'y') {system("cls");return 1;} elsereturn 0;
}//按姓名从小到大查找(采用二分查找)
void search1(linklist &L) { if (L.length == 0) {printf("已无学生记录!\n");Ret();Menu();} else {int low = 0, high = L.length, mid, flag = 0;printf("\n");printf("按姓名查找-->请输入要查找的姓名:");char a[15], ch;scanf("%s", a);while (low <= high) {mid = (low + high) / 2;if (strcmp(a, L.elem[mid].name) == 0) {flag = 1;break;} else if (strcmp(a, L.elem[mid].name)>0)low = mid + 1;elsehigh = mid - 1;}if (flag == 1) {printf("查找成功-->该学生信息为:\n");printf("姓名       学号    房号\n");printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select())search1(L);else {system("cls");Menu();}} else {printf("该学生不存在!");if (Select())    search1(L);else {system("cls");Menu();}}}
}//按学号从小到大查找(采用二分查找)
void search2(linklist &L) { if (L.length == 0) {printf("\n");printf("已无学生记录!\n");Ret();Menu();} else {int low = 0, high = L.length, mid, flag = 0;int n;char ch;printf("\n");printf("按学号查找-->请输入要查找的学号:");scanf("%d", &n);while (low <= high) {mid = (low + high) / 2;if (n == L.elem[mid].num) {flag = 1;break;} else if (n>L.elem[mid].num)low = mid + 1;elsehigh = mid - 1;}if (flag == 1) {printf("查找成功----->该学生信息为:\n");printf("姓名       学号    房号\n");printf("%-1s0 %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select())search2(L);else {system("cls");Menu();}} else {printf("该学生不存在!");if (Select())search2(L);else {system("cls");Menu();}}}
}//按房号从小到大查找(采用二分查找)
void search3(linklist &L) { if (L.length == 0) { //此函数功能为:返回主界面printf("\n");printf("已无学生记录!\n");Ret();Menu();} else {int low = 0, high = L.length, mid, flag = 0;//flag作为标志符,为1则表示查找成功,否则没有所要查找的学生int m;char ch;printf("\n");printf("按房号查找-->请输入要查找的房号:");scanf("%d", &m);while (low <= high) {mid = (low + high) / 2;if (m == L.elem[mid].room) {flag = 1;break;} else if (m>L.elem[mid].room)low = mid + 1;elsehigh = mid - 1;}if (flag == 1) {printf("查找成功-->该学生信息为:\n");printf("姓名       学号    房号\n");printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select())    //调用判断函数1search3(L);else {system("cls");Menu();}} else {printf("该学生不存在!");if (Select())  //调用判断函数2search3(L);else {system("cls");Menu();}}}
}//查找函数
void Search(linklist &L) { int c;printf("请输入查找的方式(1:按名字查找,2:按学号查找,3:按房号查找):");scanf("%d", &c);switch (c) {case 1:sort1(L);search1(L);break;//先进行二分查找排序case 2:sort2(L);search2(L);break;case 3:sort3(L);search3(L);break;default:break;}
}//按学号从小到大插入该学生
void Insert(linklist &L) { int i, j, k;char ch;printf("\n");printf("插入的学生信息为:\n");printf("姓名:");fflush(stdin);// 清空输入缓冲区,得到正确的输入数据gets(stud.name);printf("学号:");scanf("%d", &stud.num);printf("房号:");scanf("%d", &stud.room);if (L.length == 0) {strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;}for (i = 0; i<L.length; i++) {if (stud.num<L.elem[i].num) {k = i;for (j = L.length; j>k; j--)L.elem[j] = L.elem[j - 1];strcpy(L.elem[k].name, stud.name);L.elem[k].num = stud.num;L.elem[k].room = stud.room;break;} else {strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;}}L.length++;fflush(stdin);printf("\n");printf("是否继续插入?<y/n>:");scanf("%c", &ch);if (ch == 'y') Insert(L);else system("cls");
}//按学号删除该学生
void Delete(linklist &L) { int i, j, k = -1;char ch;printf("\n");printf("\n");printf("请输入要删除学生的学号:");scanf("%d", &stud.num);for (i = 0; i<L.length; i++) {if (stud.num == L.elem[i].num) {printf("该学生的信息为:\n");printf("姓名:%s \n学号:%d \n房号:%d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);k = i;for (j = k; j<L.length - 1; j++)L.elem[j] = L.elem[j + 1];printf("已成功删除\n");break;}}if (i >= L.length) printf("该学生不存在\n");if (k >= 0)L.length--;fflush(stdin);printf("\n");printf("是否继续删除操作?<y/n>:");scanf("%c", &ch);system("cls");if (ch == 'y') Delete(L);else system("cls");
}//主函数
int main() {  linklist L;    //定义线性表 LInit(L);Menu();        //调用主菜单函数while (choice != 0) {system("cls");switch (choice) {case 1:Create(L);    //调用线性表创建函数Menu();break;case 2:Sort(L);break;//调用排序函数case 3:Search(L);break;//调用查找函数进行(二分)查找case 4:sort2(L);      //调用学号排序函数Insert(L);        //按学号序列插入system("cls");printf("插入后的学生信息:\n");Display(L);Ret();Menu();break;case 5:Delete(L);    //调用删除函数if (L.length == 0) {printf("\n");printf("学生记录已被删除完!\n");Ret();Menu();} else {printf("显示删除后的学生信息:\n");Display(L);Ret();Menu();}break;}}
}

数据结构课程设计之学生宿舍信息管理系统相关推荐

  1. 数据结构课程设计实验一:图书信息管理系统的设计与实现

    目录 (一)实验内容 (二)实验目的 (三)实验主要数据类型定义 (四)系统功能概述 (五)实验代码 (六)实验内容展示 (一)实验内容 设计并实现一个图书信息管理系统.根据实验要求设计该系统的菜单和 ...

  2. 数据库课程设计——学生宿舍信息管理系统

    数据库课程设计--学生宿舍信息管理系统 目录 1.设计目的... 2 2.任务与要求... 2 3.学生宿舍管理系统课程设计... 2 3.1 引言... 2 3.2需求分析... 2 3.2.1. ...

  3. 数据结构课程设计论文--学生信息管理系统

    数据结构课程设计论文--学生信息管理系统 1.学生成绩分析问题 (1)问题描述.录入并保存一个班级学生多门课程的成绩,并对成绩进行分析. (2)基本要求.a)通过键盘输入各学生的多门课程的成绩,建立相 ...

  4. 湖北汽车工业学院c语言程序设计 汽车零部件采购管理程序,湖北汽车工业学院c语言课程设计实验报告(采购信息管理系统).docx...

    湖北汽车工业学院c语言课程设计实验报告(采购信息管理系统) C语言课程设计 商品销售信息管理系统 #include #include #include #include structproduct// ...

  5. c语言程序设计超市会员卡管理系统,C语言程序设计课程设计报告超市水果信息管理系统...

    <C语言程序设计课程设计报告超市水果信息管理系统>由会员分享,可在线阅读,更多相关<C语言程序设计课程设计报告超市水果信息管理系统(28页珍藏版)>请在人人文库网上搜索. 1. ...

  6. PHP进销存系统的数据结构,数据结构课程设计-仓库进销存管理系统.doc

    数据结构课程设计-仓库进销存管理系统.doc 题 目: 仓库进销存管理系统 学 院: 计算机与控制工程学院 专业班级: 软件101 学生姓名: 王海川 指导教师: 王一萍 2012 年06 月2 9日 ...

  7. 水果超市c语言程序设计,C语言程序设计课程设计报告-超市水果信息管理系统_精品.doc...

    C语言程序设计课程设计报告-超市水果信息管理系统_精品 西 安 邮 电 大 学 (计算机学院) 高级语言课程设计报告 题 目: 超市水果信息管理系统 专业名称: XXXX 班 级: XXXX 学生姓名 ...

  8. java-php-python-ssm学生宿舍信息管理系统计算机毕业设计

    java-php-python-ssm学生宿舍信息管理系统计算机毕业设计 java-php-python-ssm学生宿舍信息管理系统计算机毕业设计 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  9. c语言程序设计课程设计水果,C语言程序设计课程设计报告超市水果信息管理系统...

    C语言程序设计课程设计报告超市水果信息管理系统 西 安 邮 电 大 学(计算机学院)高级语言课程设计报告题 目: 超市水果信息管理系统专业名称: XXXX班 级: XXXX学生姓名: XXXX学号(8 ...

  10. 学生搭配问题数据结构报告c语言,数据结构课程设计_学生搭配问题.doc

    数据结构课程设计_学生搭配问题 数据结构课程设计 题 目: 学生搭配问题 学 院: 班 级: 学 生 姓 名: 学 生 学 号: 指 导 教 师: 2012 年 12 月 3 日 课程设计任务书 姓名 ...

最新文章

  1. 【SICP练习】110 练习3.23
  2. 如何以编程方式退出WPF应用程序?
  3. Linux安装/卸载软件教程
  4. iPhone SE 3共有三款:或将提供全面屏版本
  5. 【django】数据库初始化写入信息
  6. linux C 总结篇(线程)下
  7. Rewrite HTTP to HTTPS in Nginx
  8. Python人脸识别项目-基础代码
  9. 取消一个项目git版本控制
  10. 极域电子教室2016破解版
  11. thermal系列(6)-thermal-engine守护进程
  12. 计算机网络进入特权模式在哪里,计算机四级考试网络工程师考点一
  13. 计算机截图工具无法运行,重装win7系统后打开截图工具显示“截图工具当前未在计算机上运行”如何解决...
  14. python atm银行取款系统_python ATM机 案例代码
  15. Java毕设项目-医药信息管理系统
  16. remote: Repository not found. fatal: repository ‘xxxxxxx‘ not found
  17. Web安全:跨站点攻击csrf
  18. 《软件方法(上)业务建模和需求》第2版 勘误(2022年10月24日更新)
  19. springBoot中使用定时任务
  20. 在SCDM中使用了共享在fluent mesh中仍然会报错错误的共享

热门文章

  1. 一招教你如何使用.Net Core 3.0正式版创建Winform程序
  2. wifi显示但是没有网络连接到服务器是怎么回事,wifi连接后显示网络连接不可用怎么办?...
  3. Spring AOP教程(作者原创)
  4. 5G LTE窄带物联网(NB-IoT) 10
  5. Go程序设计语言读书笔记-1
  6. Unity基础UI框架
  7. spring定时器时间表达式
  8. android系统证书管理,抓包Android 7.0+将ca证书导入到系统(设置为系统证书)
  9. 推荐一款好用的加密软件 filepackage 文件加密 U盘加密 移动硬盘加密
  10. LTE调制方式和编码速率