数据结构课程设计之学生宿舍信息管理系统
生活随笔
收集整理的這篇文章主要介紹了
数据结构课程设计之学生宿舍信息管理系统
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、問題陳述
宿舍對于大學(xué)生在校生活來說相當(dāng)于家的存在,而宿舍管理又是學(xué)校后勤管理的重要環(huán)節(jié),如何直觀的了解宿舍的入住情況和每位同學(xué)的住宿位置是提高工作效率的重要課題,根據(jù)我們所學(xué)的C語言和數(shù)據(jù)結(jié)構(gòu)課程中有關(guān)鏈表的內(nèi)容,為宿舍管理人員編寫宿舍管理查詢軟件,就可以輕松滿足實(shí)現(xiàn)上述需求。
任務(wù):
- 采用交互工作方式
- 可按關(guān)鍵字(姓名、學(xué)號、房號)進(jìn)行排序
- 按姓名查詢
- 按學(xué)號查詢
- 按房號查詢
二、概要設(shè)計(jì)
2.1 概要簡述
根據(jù)系統(tǒng)要求,即本系統(tǒng)具有信息的錄入,顯示,排序顯示、查找,插入、刪除、結(jié)束程序等功能,先設(shè)計(jì)出詳細(xì)的系統(tǒng)流程圖,然后將源代碼輸入程序,進(jìn)行編譯調(diào)試即可。
程序總體分10個(gè)項(xiàng)目:輸入記錄、顯示記錄、按姓名排序并顯示、按房間號排序并顯示 、按學(xué)號排序并顯示 、按姓名查找并顯示 、按房間號查找并顯示 、按學(xué)號查找并顯示、插入一條記錄按學(xué)號排序并顯示以及結(jié)束程序。
2.2 線性表存儲結(jié)構(gòu)表示
typedef struct {char name[20];int num; //學(xué)號和房號都為整型int room; } stu;typedef struct {int length; //當(dāng)前長度stu *elem; //存儲空間基址int listsize; //當(dāng)前分配的存儲容量 } linklist;2.3 詳細(xì)設(shè)計(jì)
2.3.1 系統(tǒng)流程圖
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 折半插入排序(按學(xué)號排序)
//按學(xué)號排序(采用折半插入排序) 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("已無學(xué)生記錄!\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("查找成功-->該學(xué)生信息為:\n");printf("姓名 學(xué)號 房號\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("該學(xué)生不存在!");if (Select()) search1(L);else {system("cls");Menu();}}} }三、測試與運(yùn)行
3.1 系統(tǒng)界面
3.2 新建宿舍名單
3.3 排序(以姓名排序?yàn)槔?#xff09;
3.4 查詢(以學(xué)號查詢?yōu)槔?#xff09;
3.5 插入學(xué)生信息
3.6 刪除學(xué)生信息
四、代碼實(shí)現(xiàn)
#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; //學(xué)號和房號都為整型int room; } stu; stu stud; typedef struct {int length; //當(dāng)前長度stu *elem; //存儲空間基址int listsize; //當(dāng)前分配的存儲容量 } linklist;//線性表初始化 void Init(linklist &L) { L.length = 0;L.elem = (stu *)malloc(N * sizeof(stu));L.listsize = N; }//操作菜單 void Menu() { printf( "**************************************\n" );printf( "*** 歡迎進(jìn)入宿舍管理系統(tǒng) ***\n" );printf( "**************************************\n" );printf( "* 1. 新建宿舍名單 *\n" );printf( "* 2. 排序宿舍信息 *\n" );printf( "* 3. 查詢宿舍信息 *\n" );printf( "* 4. 插入宿舍信息 *\n" );printf( "* 5. 刪除宿舍信息 *\n" );printf( "* 0. 退出系統(tǒng) *\n" );printf( "**************************************\n" );printf("請輸入菜單(0-5):");scanf("%d", &choice);if (choice<0 || choice>5) {system("cls");printf("輸入數(shù)字不對,請重新!\n");printf("\n");Menu();}}//打印學(xué)生信息 void Display(linklist &L) { int i;printf("姓名 學(xué)號 房號\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("請按任意鍵進(jìn)入主界面:");scanf("%c", &c);system("cls"); }//創(chuàng)建學(xué)生信息表 void Create(linklist &L) { if (L.length >= L.listsize) { //判斷學(xué)生的人數(shù)是否超過初值,如果超過,則重新分配stu *newbase;newbase = (stu*)realloc(L.elem, (N + increase) * sizeof(stu));L.elem = newbase;L.listsize += increase;}int i = 2;char ch;printf("********開始創(chuàng)建學(xué)生信息**********\n");printf("\n");printf("請輸入第1個(gè)學(xué)生的信息\n");printf("請輸入姓名:");fflush(stdin); // 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù)gets(stud.name); //輸入一行字符串(姓名)printf("請輸入學(xué)號:");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("是否繼續(xù)輸入?<y/n>:");scanf("%c", &ch);printf("\n");while (ch == 'y') {printf("請輸入第%d個(gè)學(xué)生的信息\n", i);printf("請輸入姓名:");fflush(stdin); // 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù)gets(stud.name); //輸入一行字符串(姓名)printf("請輸入學(xué)號:");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("是否繼續(xù)輸入?<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;} }//按學(xué)號排序(采用折半插入排序) 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;}} } //排序函數(shù) void Sort(linklist &L) { int c;printf("請輸入排序的方式(1:按名字排序,2:按學(xué)號排序,3:按房號排序):");scanf("%d", &c);switch (c) {case 1:sort1(L);if (L.length == 0) {printf("已無學(xué)生記錄!\n");Ret();Menu();} else {printf("按姓名排序:\n");Display(L);Ret(); //調(diào)用返回主界面Menu();}break;case 2:sort2(L);if (L.length == 0) {printf("已無學(xué)生記錄!\n");Ret();Menu();} else {printf("按學(xué)號排序:\n");Display(L);Ret(); //調(diào)用返回主界面Menu();}break;case 3:sort3(L);if (L.length == 0) {printf("已無學(xué)生記錄!\n");Ret();Menu();} else {printf("按房號排序:\n");Display(L);Ret(); //調(diào)用返回主界面Menu();}break;default:break;} }//選擇是否繼續(xù)查找 int Select() { char ch;scanf("%c", &ch);printf("是否繼續(xù)查找?<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("已無學(xué)生記錄!\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("查找成功-->該學(xué)生信息為:\n");printf("姓名 學(xué)號 房號\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("該學(xué)生不存在!");if (Select()) search1(L);else {system("cls");Menu();}}} }//按學(xué)號從小到大查找(采用二分查找) void search2(linklist &L) { if (L.length == 0) {printf("\n");printf("已無學(xué)生記錄!\n");Ret();Menu();} else {int low = 0, high = L.length, mid, flag = 0;int n;char ch;printf("\n");printf("按學(xué)號查找-->請輸入要查找的學(xué)號:");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("查找成功----->該學(xué)生信息為:\n");printf("姓名 學(xué)號 房號\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("該學(xué)生不存在!");if (Select())search2(L);else {system("cls");Menu();}}} }//按房號從小到大查找(采用二分查找) void search3(linklist &L) { if (L.length == 0) { //此函數(shù)功能為:返回主界面printf("\n");printf("已無學(xué)生記錄!\n");Ret();Menu();} else {int low = 0, high = L.length, mid, flag = 0;//flag作為標(biāo)志符,為1則表示查找成功,否則沒有所要查找的學(xué)生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("查找成功-->該學(xué)生信息為:\n");printf("姓名 學(xué)號 房號\n");printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select()) //調(diào)用判斷函數(shù)1search3(L);else {system("cls");Menu();}} else {printf("該學(xué)生不存在!");if (Select()) //調(diào)用判斷函數(shù)2search3(L);else {system("cls");Menu();}}} }//查找函數(shù) void Search(linklist &L) { int c;printf("請輸入查找的方式(1:按名字查找,2:按學(xué)號查找,3:按房號查找):");scanf("%d", &c);switch (c) {case 1:sort1(L);search1(L);break;//先進(jìn)行二分查找排序case 2:sort2(L);search2(L);break;case 3:sort3(L);search3(L);break;default:break;} }//按學(xué)號從小到大插入該學(xué)生 void Insert(linklist &L) { int i, j, k;char ch;printf("\n");printf("插入的學(xué)生信息為:\n");printf("姓名:");fflush(stdin);// 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù)gets(stud.name);printf("學(xué)號:");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("是否繼續(xù)插入?<y/n>:");scanf("%c", &ch);if (ch == 'y') Insert(L);else system("cls"); }//按學(xué)號刪除該學(xué)生 void Delete(linklist &L) { int i, j, k = -1;char ch;printf("\n");printf("\n");printf("請輸入要刪除學(xué)生的學(xué)號:");scanf("%d", &stud.num);for (i = 0; i<L.length; i++) {if (stud.num == L.elem[i].num) {printf("該學(xué)生的信息為:\n");printf("姓名:%s \n學(xué)號:%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("該學(xué)生不存在\n");if (k >= 0)L.length--;fflush(stdin);printf("\n");printf("是否繼續(xù)刪除操作?<y/n>:");scanf("%c", &ch);system("cls");if (ch == 'y') Delete(L);else system("cls"); }//主函數(shù) int main() { linklist L; //定義線性表 LInit(L);Menu(); //調(diào)用主菜單函數(shù)while (choice != 0) {system("cls");switch (choice) {case 1:Create(L); //調(diào)用線性表創(chuàng)建函數(shù)Menu();break;case 2:Sort(L);break;//調(diào)用排序函數(shù)case 3:Search(L);break;//調(diào)用查找函數(shù)進(jìn)行(二分)查找case 4:sort2(L); //調(diào)用學(xué)號排序函數(shù)Insert(L); //按學(xué)號序列插入system("cls");printf("插入后的學(xué)生信息:\n");Display(L);Ret();Menu();break;case 5:Delete(L); //調(diào)用刪除函數(shù)if (L.length == 0) {printf("\n");printf("學(xué)生記錄已被刪除完!\n");Ret();Menu();} else {printf("顯示刪除后的學(xué)生信息:\n");Display(L);Ret();Menu();}break;}} }總結(jié)
以上是生活随笔為你收集整理的数据结构课程设计之学生宿舍信息管理系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2606):vue简单叙述
- 下一篇: 三、实战小例程 基于STM32F103C