數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——宿舍管理查詢(xún)軟件要點(diǎn)
秦皇島分校
NorthEastern University At QinHuangDao
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
宿舍管理查詢(xún)軟件
班級(jí)學(xué)號(hào)
班
學(xué)生姓名
提交日期
2015年7月24日
成 績(jī)
計(jì)算機(jī)與通信工程學(xué)院
一、需求分析
1、程序設(shè)計(jì)任務(wù)
為宿舍管理人員編寫(xiě)一個(gè)宿舍管理查詢(xún)軟件。
①程序設(shè)計(jì)要求:
A.采用交互工作方式
B.建立數(shù)據(jù)文件,數(shù)據(jù)文件按關(guān)鍵字(姓名、學(xué)號(hào)、房號(hào))進(jìn)行排序 (冒泡、選擇、插入
排序等任選一種) ②查詢(xún)菜單:(用二分查找實(shí)現(xiàn)以下操作 )
A.按姓名查詢(xún)
B.按學(xué)號(hào)查詢(xún)
C.按房號(hào)查詢(xún)
③打印任一查詢(xún)結(jié)果(可以連續(xù)操作)
2、功能
①要實(shí)現(xiàn)交互工作方式,各項(xiàng)操作結(jié)束后均應(yīng)返回主菜單;
②系統(tǒng)本無(wú)任何信息數(shù)據(jù), 要建立數(shù)據(jù)文件,需開(kāi)發(fā)一個(gè)信息錄入功能, 即首先創(chuàng)建一
個(gè)學(xué)員線(xiàn)性表,同時(shí)我們可以將數(shù)據(jù)暫時(shí)保存在內(nèi)存中,所以我們未開(kāi)發(fā)信息存盤(pán)功能;
③信息錄入后都保存在內(nèi)存中, 用戶(hù)看不到,需要設(shè)計(jì)一個(gè)信息顯示功能, 信息的顯示
應(yīng)該便于查閱,所以需具備按各種關(guān)鍵字顯示的功能;
④本系統(tǒng)按關(guān)鍵字(姓名、學(xué)號(hào)、房號(hào))進(jìn)行冒泡排序,采用二分查找方式分別實(shí)現(xiàn)按
關(guān)鍵字(姓名、學(xué)號(hào)、房號(hào))查詢(xún)功能;
⑤由于有些同學(xué)因?yàn)椴煌蚨x校,所以設(shè)計(jì)了刪除功能;
⑥由于有新同學(xué)入校,所以設(shè)計(jì)了插入功能;
⑦當(dāng)用戶(hù)操作完畢需要退出時(shí), 我們提供了退出選項(xiàng),便于使用者退出交互式工作系統(tǒng)。
3、功能模塊圖
4、流程圖
開(kāi)始
退出
輸入學(xué)牛信氫
?
l<=f^=8
▼ T T ?
HR
UA
5、輸入和輸出
①輸入的形式
1)開(kāi)始創(chuàng)建線(xiàn)性表:按先后順序輸入姓名 (20個(gè)字以?xún)?nèi)),學(xué)號(hào)(整型),房號(hào)(整型)。
2)根據(jù)用戶(hù)所選擇的操作鍵,然后再根據(jù)程序的相應(yīng)提示進(jìn)行輸入。
選擇操作鍵1 (按姓名排序):無(wú)輸入;
選擇操作鍵2 (按學(xué)號(hào)排序):無(wú)輸入;
選擇操作鍵3 (按房號(hào)排序):無(wú)輸入;
選擇操作鍵4 (按姓名查找):輸入要查找的姓名;
選擇操作鍵 選擇操作鍵 選擇操作鍵 選擇操作鍵
(按學(xué)號(hào)查找)
(按房號(hào)查找)
(按學(xué)號(hào)插入)
(按學(xué)號(hào)刪除)
輸入要查找的學(xué)號(hào);
輸入要查找的房號(hào);
按照提示順序輸入要插入的學(xué)生姓名,學(xué)號(hào),房號(hào);
輸入要?jiǎng)h除學(xué)生的學(xué)號(hào)。
②輸出的形式及范圍
根據(jù)用戶(hù)選擇的不同,會(huì)有不同的輸出。
選擇操作鍵 選擇操作鍵 選擇操作鍵 選擇操作鍵 出該學(xué)生不存在;
選擇操作鍵 出該學(xué)生不存在;
選擇操作鍵 出該學(xué)生不存在。
選擇操作鍵
選擇操作鍵 的所有學(xué)生信息。
(按姓名排序) (按學(xué)號(hào)排序) (按房號(hào)排序 (按姓名查找)
(按學(xué)號(hào)查找)
(按房號(hào)查找)
(按學(xué)號(hào)插入)
(按學(xué)號(hào)刪除)
:輸出以姓名首字母排序的所有學(xué)生信息;
:輸出按學(xué)號(hào)從小到大排列的所有學(xué)生信息;
):輸出按房號(hào)從小到大排列的所有學(xué)生信息;
:若查找成功,則輸出相應(yīng)學(xué)生信息,
:若查找成功,則輸出相應(yīng)學(xué)生信息,
:若查找成功,則輸出相應(yīng)學(xué)生信息,
若不成功,則輸
若不成功,則輸
若不成功,則輸
:輸出插入后的所有學(xué)生信息;
:輸出所需刪除的學(xué)生信息,確認(rèn)刪除后,輸出刪除后
開(kāi)始錄入的數(shù)據(jù):姓名
學(xué)號(hào)
房號(hào)
劉備
1
102
孫權(quán)
6
231
周瑜
3
124
6
6、測(cè)試數(shù)據(jù)
正確輸入:查找的數(shù)據(jù):
正確輸出:孫權(quán)
二、 詳細(xì)設(shè)計(jì)
(按學(xué)號(hào))
231
1、數(shù)據(jù)結(jié)構(gòu)
typedef struct // {
char name[20];
int num;
int room;
}stu;
stu stud;
typedef struct
{
定義結(jié)構(gòu)體成員
//
學(xué)號(hào)和房號(hào)都為整型
int length;
stu *elem;
int listsize;
}linklist;
2、數(shù)據(jù)
int f ;
//
//
//
當(dāng)前長(zhǎng)度
存儲(chǔ)空間基址
當(dāng)前分配的存儲(chǔ)容量
f 為全局變量,指選擇的操作鍵數(shù)
char name[20] ;
name 為姓名 int num ; num 為學(xué)號(hào)
int room ; room 為房號(hào) int length; length 為線(xiàn)性表的當(dāng)前長(zhǎng)度 stu *elem; elem 指示線(xiàn)性表的基地址 int listsize;
listsize 為當(dāng)前分配的存儲(chǔ)容量 char c ; c 為進(jìn)入主界面的任意鍵
char ch;
ch 為判斷字符 y 或 n
int i,j;
在冒泡排序中, i 為外層循環(huán)次數(shù), j 為內(nèi)層循環(huán)次數(shù)
int i ;
在打印學(xué)生信息時(shí), i 作為循環(huán)變量
int m;
int n;
int a;
m,n,a 在二分查找中分別代表房號(hào),學(xué)號(hào),姓名
int i,j,k;
i,j,k 在按學(xué)號(hào)插入中作為循環(huán)變量
int i,j,k=-1;
i,j,k 在按學(xué)號(hào)刪除中作為循環(huán)變量
3、函數(shù)調(diào)用
具體函數(shù)如下:
void init(linklist &l)
void create(linklist &l)
void sort3(linklist &l)
void sort2(linklist &l)
void sort1(linklist &l)
void chazhao3(linklist
void chazhao2(linklist
void chazhao1(linklist
void print1(linklist &l)
void print2(linklist &l,int mid) 數(shù)實(shí)現(xiàn)。
:用于線(xiàn)性表初始化,通過(guò)調(diào)用 C語(yǔ)言文件操作函數(shù)來(lái)實(shí)現(xiàn)。
:用于創(chuàng)建學(xué)生信息表,通過(guò)線(xiàn)性表來(lái)實(shí)現(xiàn)。
:用于按房號(hào)排序,通過(guò)采用冒泡排序的算法來(lái)實(shí)現(xiàn)。
:用于按學(xué)號(hào)排序,通過(guò)采用冒泡排序的算法來(lái)實(shí)現(xiàn)。
:用于按姓名排序,通過(guò)采用冒泡排序的算法來(lái)實(shí)現(xiàn)。
&l)
&l)
&l)
用于按房號(hào)從小到大查找, 用于按學(xué)號(hào)從小到大查找, 用于按姓名從小到大查找,
通過(guò)采用二分查找的算法來(lái)實(shí)現(xiàn)。
通過(guò)采用二分查找的算法來(lái)實(shí)現(xiàn)。
通過(guò)采用二分查找的算法來(lái)實(shí)現(xiàn)。
:用于打印學(xué)生信息,通過(guò)調(diào)用文件操作函數(shù)實(shí)現(xiàn)。
:用于打印查找到的學(xué)生信息,通過(guò)調(diào)用文件查找函
int panduan2(char ch) :用于如果學(xué)生不存在 , 判斷是否繼續(xù)查找,通過(guò) if 語(yǔ)句,文件操
作函數(shù)實(shí)現(xiàn)
void panduan3() :用于如果已無(wú)學(xué)生記錄則返回主界面,通過(guò)調(diào)用其他函數(shù)和文件操作函
數(shù)實(shí)現(xiàn)。
void disp() :用于返回主界面,通過(guò)調(diào)用 menu() 函數(shù)實(shí)現(xiàn)。
void menu(): 用于列出操作菜單,通過(guò)輸入輸出語(yǔ)句實(shí)現(xiàn)。
void main() :程序操作的入口,是程序的主函數(shù),可以按照已定義的函數(shù)調(diào)用子函數(shù)。
4、主程序:
int main() // 主函數(shù)
{
linklist l; // 定義線(xiàn)性表 l
init(l); // 調(diào)用初始化函數(shù)
char ch;
system("color a"); printf("\n");
printf("
*************************
歡迎進(jìn)入宿舍管理查詢(xún)系統(tǒng)
************************
*\n");
printf("\n");
printf(" 請(qǐng)按任意鍵開(kāi)始操作 :");
scanf("%c",&ch);
system("cls");// 將屏幕先前顯示的內(nèi)容清理掉
create(l); // 調(diào)用線(xiàn)性表創(chuàng)建函數(shù)
system("cls");
t=1;
menu(); // 調(diào)用主菜單函數(shù)
while(f!=0)
{
system("cls");
switch(f)
{
case 1: sort1(l); // 調(diào)用按姓名排序函數(shù)
printf("\n");
if(l.length==0)
{
printf(" 已無(wú)學(xué)生記錄 \n");
printf("\n");
disp();
menu();
}
else
{
printf(" 按姓名排序 :\n");
print1(l);
disp(); // 調(diào)用返回主界面
menu();
}
break;
case 2: sort2(l); // 調(diào)用按學(xué)號(hào)排序函數(shù) printf("\n");
if(l.length==0)
{
printf(" 已無(wú)學(xué)生記錄 \n");
printf("\n");
disp();
menu();
}
else
{
printf(" 按學(xué)號(hào)排序 :\n");
print1(l);
disp();
menu();
}break;
case 3: sort3(l); // 調(diào)用按房號(hào)排序函數(shù)
printf("\n");
if(l.length==0)
{
printf(" 已無(wú)學(xué)生記錄 \n");
printf("\n");
disp();
menu();
}
else
{
printf(" 按房號(hào)排序 :\n");
print1(l);
disp();
menu();
先調(diào)用按姓名排序函數(shù)進(jìn)行排序
再調(diào)用按姓名查找函數(shù)進(jìn)行(二分)查找
先調(diào)用按學(xué)號(hào)排序函數(shù)進(jìn)行排序
再調(diào)用按學(xué)號(hào)查找函數(shù)進(jìn)行(二分)查找
先調(diào)用按房號(hào)排序函數(shù)進(jìn)行排序 再調(diào)用按房號(hào)查找函數(shù)進(jìn)行(二分)查找
}break;
case 4:sort1(l); //
chazhao1(l); // break;
case 5: sort2(l); // chazhao2(l); // break;
case 6: sort3(l); // chazhao3(l); // break;
case 7: sort2(l); // 調(diào)用插入函數(shù) insert(l);
system("cls");
printf(" 顯示插入后的學(xué)生信息 :\n");print1(l);
disp();
menu();
break;
case 8: Delete(l); // 調(diào)用刪除函數(shù)
if(l.length==0)
{
printf("\n");
printf(" 學(xué)生記錄已被刪除完 \n");
printf("\n");
disp();
menu();
} else
{
printf(" 顯示刪除后的學(xué)生信息 :\n");
print1(l);
disp();
menu(); }
break;
}
}
}
三、調(diào)試分析
①為了避免繁瑣、 改進(jìn)算法, 在一些函數(shù)中調(diào)用了其它的函數(shù)。 如: 在按 (姓名、 學(xué)號(hào)、
房號(hào))查找中都調(diào)用了 panduan1(ch) 和 panduan2(ch) 函數(shù)。
②在插入和刪除模塊中,顯示學(xué)生的信息的下面總是有主界面,經(jīng)過(guò)調(diào)試,運(yùn)用
system("cls") 函數(shù)清屏后,顯示的只有學(xué)生的信息了,再按鍵即可返回主界面。
③本程序多次運(yùn)用了 disp() 、 menu() 、 system("cls") 、 fflush(stdin) 等函數(shù),經(jīng)過(guò)
多次調(diào)試,已經(jīng)很好的控制了顯示的學(xué)生信息與主界面的轉(zhuǎn)換。
④通過(guò)本次課程設(shè)計(jì),對(duì)線(xiàn)性表、冒泡排序、二分查找的應(yīng)用有了更深入的了解。 四、用戶(hù)手冊(cè)
首先, 運(yùn)行程序進(jìn)入 “歡迎進(jìn)入宿舍管理查詢(xún)系統(tǒng)” 界面, 然后進(jìn)入線(xiàn)性表創(chuàng)建界面中,
輸入學(xué)生的信息,創(chuàng)建好學(xué)生信息以后單擊任意鍵則進(jìn)入操作界面(主界面) ,然后可按鍵
進(jìn)行操作。
單擊數(shù)字鍵“ 1”,則為按姓名排序 單擊數(shù)字鍵“ 3”,則為按房號(hào)排序 單擊數(shù)字鍵“ 5”,則為按學(xué)號(hào)查找 單擊數(shù)字鍵“ 7”,則為按學(xué)號(hào)插入 系統(tǒng)中有如下關(guān)鍵詞:
單擊數(shù)字鍵“ 2”,則為按學(xué)號(hào)排序 單擊數(shù)字鍵“ 4”,則為按姓名查找 單擊數(shù)字鍵“ 6”,則為按學(xué)號(hào)查找 單擊數(shù)字鍵“ 8”,則為按學(xué)號(hào)刪除
提示:當(dāng)輸入的數(shù)字鍵為 。時(shí),退出操作;
請(qǐng)輸入數(shù)字鍵(1~8為操作鍵);
請(qǐng)按任意鍵進(jìn)入主界面。
五、測(cè)試結(jié)果
(1)歡迎界面
I "。丸我的塞科庫(kù)VDoCurnents'CFrwVFEE pkhengjaj.ticc-'
IHHHfIWHHHHHWHHHHHHHttHHWHHf歡迎進(jìn)入 盾舌管理查詢(xún) 系g充■ = «蕾?『有M■產(chǎn)餐有??修????¥?? 請(qǐng)按任意鍵開(kāi)始操作n
(2)按任意鍵進(jìn)入線(xiàn)性表的創(chuàng)建界面,并輸入數(shù)據(jù),開(kāi)始創(chuàng)建
*****1**************1******?^ 始創(chuàng) 建線(xiàn)’性表例修苴 * “防百例片有詞 * MiWX * MMX MME Bi Mi
生#
學(xué)瀏:1:10 S名口于手 第普看 為入AJ
n
否批紙怖大
(3)按操作鍵選擇操作
? " 生若南 DocnmBnfs'i 匚-FKee\Tennp\c heng 想白法”
*************** 請(qǐng)技鍵途擇操作 *****»«?»■»*»*■»■***■
1按姓名排序
3按信號(hào)排序
5技學(xué)號(hào)查找
7按學(xué)號(hào)插入
Z按學(xué)號(hào)排序
4按姓名查找
6按房號(hào)查找
6按學(xué)號(hào)刪除
退出操作
半.
(4)按姓名排序
匕,找的黃科1軍'LAocuEEntsTL -卜『亡七* I rmpXchengxu.EKe
按姓名排序;
姓名
學(xué)號(hào)
房號(hào)
1
102
孫叔
6
231
周瑜
3
124
上按任意鍵進(jìn)入主界面:
(5)按學(xué)號(hào)排序
B .口 科我更懂 Af?\Uccu rrrenta^'lhrMXl EmpVcJiengxu.eKe''
技學(xué)號(hào)排序;
姓名 學(xué)號(hào) 房號(hào)
劃章 1 102
同趟 3 124
a枚 6 231
請(qǐng)按任意鍵進(jìn)入主界面:
(6)按房號(hào)排序
U: \UOCU menT5\L-rreeyi em p-\cnengxu.exe
按房號(hào)排序:
姓名 學(xué)號(hào) 房號(hào)
劉備 1 182
周瑜 2 謔4
他權(quán) G g1
請(qǐng)按任意摧進(jìn)入主界面:
(7)按姓名查找
■ "D:\fi^S^I&.DD£:ijrnent5,,LC-Free\TenipliLcherigxLisexefe
按姓名查找一一-〉請(qǐng)輸入要查找的姓名:劉備
查找成功——> 謾學(xué)生信息為■
隹名 孚號(hào) 房號(hào)
包董 1 102
是否雛續(xù)查找?:
(8)按學(xué)號(hào)查找
■ 廊\Uocument、\L -卜「ee\ I emp\crergxui.exe,
,學(xué)號(hào)查找請(qǐng)輸入要查找的學(xué)號(hào):6 始找成功一一一'談學(xué)生信息為:
區(qū)名 孚號(hào) 慮號(hào)
忸卜權(quán) 6 231
是苦繼續(xù)查找?3nx
(9)按房號(hào)查找
技房號(hào)查找一一-〉請(qǐng)輸入要查找的房號(hào):124
找成一翳生抽
周瑜 3 124
是否繼續(xù)查找"¥公〉二
(10)按學(xué)號(hào)插入
■ 5 e?%uuku「T*ii -n evh i cinp ua m ig 用
人名曾可 標(biāo)姓"L十房
(11)按學(xué)號(hào)刪除
懶嬲料T
劉備 1 102
是否健續(xù)刪除?<iXy
六、附錄
源程序:
〃采用順序線(xiàn)性表解決宿舍管理問(wèn)題 (C語(yǔ)言)
#include<stdio.h> #include<stdlib.h> #include<string.h>
#define N 40 //線(xiàn)性表存儲(chǔ)空間的初始分配量
#define increase 10 //線(xiàn)性表存儲(chǔ)空間的分配量增量
int f,t=0; 〃定義全局變量
typedef struct
{
char name[20];
int num; 〃學(xué)號(hào)和房號(hào)都為整型
int room;
}stu;
stu stud;
typedef struct
{
int length; //當(dāng)前長(zhǎng)度
stu *elem; 〃存儲(chǔ)空間基址
int listsize; 〃當(dāng)前分配的存儲(chǔ)容量
}linklist;
void init(linklist &l)// 線(xiàn)性表初始化
{
l.length=0;
l.elem=(stu *)malloc(N*sizeof(stu));
l.listsize=N;
}
void menu()〃操作菜單
printf("\n"); printf("
***************
請(qǐng)按鍵選擇操作
***************
*\n");
2按學(xué)號(hào)排序\n");
printf("\n");printf("\n");
printf(" 1按姓名排序
printf("\n");
printf("
3按房號(hào)排序
4按姓名查找\n");
printf("\n");
printf(" 5 按學(xué)號(hào)查找 6 按房號(hào)查找 \n");
printf("\n");
printf(" 7 按學(xué)號(hào)插入 8 按學(xué)號(hào)刪除 \n");
printf("\n"); printf("\n"); printf("\n"); printf("\n");
printf(" 提示 :當(dāng)輸入的數(shù)字鍵為 0 時(shí),退出操作 \n");
if(t==1)
{
printf(" 請(qǐng)輸入數(shù)字鍵 (1~8 為操作鍵 ):");//1~8 為有效數(shù)字操作鍵
scanf("%d",&f);
if(f<0||f>9)
{
system("cls");
printf("\n");
printf(" 輸入數(shù)字不對(duì) ,請(qǐng)?jiān)谠幹剌?!\n"); printf("\n");
menu();
}
}
}
void disp() //返回主界面
{
char c;
fflush(stdin);
printf("\n");
printf(" 請(qǐng)按任意鍵進(jìn)入主界面 :");
scanf("%c",&c);
system("cls");
}
void panduan3() //如果已無(wú)學(xué)生記錄則返回主界面
{
printf("\n");
printf(" 已無(wú)學(xué)生記錄 \n");
printf("\n");
disp();
menu();
}
void shuru(linklist l) //輸入學(xué)生的信息
{
printf(" 請(qǐng)輸入姓名 :");
fflush(stdin); // 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù)
gets(stud.name); //輸入一行字符串(姓名)
printf(" 請(qǐng)輸入學(xué)號(hào) :");
scanf("%d",&stud.num);
printf(" 請(qǐng)輸入房號(hào) :");
scanf("%d",&stud.room);
}
void create(linklist &l)// 創(chuàng)建學(xué)生信息表
{
if(l.length>=l.listsize) //判斷學(xué)生的人數(shù)是否超過(guò)初值,如果超過(guò),則重新分配
{
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("
**************************
開(kāi)始創(chuàng)建線(xiàn)性表
*************************
**\n");printf("\n");
printf(" 請(qǐng)輸入第 1 個(gè)學(xué)生的信息 \n");
shuru(l); //調(diào)用輸入函數(shù)
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");printf("\n");
while(ch=='y')
{
printf(" 請(qǐng)輸入第 %d 個(gè)學(xué)生的信息 \n",i);
shuru(l);
strcpy(l.elem[l.length].name,stud.name);
l.elem[l.length].num=stud.num;
l.elem[l.length].room=stud.room;
l.length++;
i++;
ch=getchar(); printf("\n");
printf(" 是否繼續(xù)輸入 ?<y/n>:");
scanf("%c",&ch);
printf("\n");printf("\n");
}
if(ch=='n') system("cls");
}
void sort3(linklist &l)// 按房號(hào)排序(采用冒泡排序)
{
int i,j;
stu temp;
for(i=0;i<l.length-1;i++)
for(j=i+1;j<l.length;j++)
if(l.elem[i].room>l.elem[j].room)
{
temp=l.elem[i];
l.elem[i]=l.elem[j];
l.elem[j]=temp;
}
}
void sort2(linklist &l)// 按學(xué)號(hào)排序(采用冒泡排序)
{
int i,j;
stu temp;
for(i=0;i<l.length-1;i++)
for(j=i+1;j<l.length;j++)
if(l.elem[i].num>l.elem[j].num)
{
temp=l.elem[i];
l.elem[i]=l.elem[j];
l.elem[j]=temp;
}
}
void sort1(linklist &l)// 按姓名排序(采用冒泡排序)
{
int i,j;
stu temp;
for(i=0;i<l.length-1;i++)
for(j=i+1;j<l.length;j++)
if(strcmp(l.elem[i].name,l.elem[j].name)>0)
{
temp=l.elem[i]; l.elem[i]=l.elem[j];
l.elem[j]=temp;
}
}
void print1(linklist &l)// 打印學(xué)生信息
{
int i;
printf("\n");
printf(" 姓名 學(xué)號(hào) 房號(hào) \n");printf("\n");
for(i=0;i<l.length;i++)
printf("%-15s %-3d %5d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room);
}
void print2(linklist &l,int mid) //打印查找到的學(xué)生信息
{
printf(" 查找成功 > 該學(xué)生信息為 :\n");
printf(" 姓名 學(xué)號(hào) 房號(hào) \n");printf("\n");
printf("%-15s %-5d %-5d\n",l.elem[mid].name,l.elem[mid].num,l.elem[mid].room);
}
int panduan1(char ch) //判斷是否繼續(xù)查找
{
scanf("%c",&ch);
printf(" 是否繼續(xù)查找 ?<y/n>:");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y')
{
system("cls");
return(1);
}
else
return 0;
}
int panduan2(char ch) //如果學(xué)生不存在 ,判斷是否繼續(xù)查找
{
scanf("%c",&ch);
printf(" 該學(xué)生不存在 ,是否繼續(xù)查找 ?<y/n>:");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y')
system("cls");
return(1);
}
else return 0;
}
void chazhao3(linklist &l)// 按房號(hào)從小到大查找(采用二分查找)
{
if(l.length==0) panduan3(); //此函數(shù)功能為:返回主界面
else
{
int low=0,high=l.length,mid,flag=0;//flag 作為標(biāo)志符, 為 1 則表示查找成功, 否則沒(méi) 有所要查找的學(xué)生
int m;
char ch;
printf("\n");printf("\n");
printf(" 按房號(hào)查找 > 請(qǐng)輸入要查找的房號(hào) :");
scanf("%d",&m);
printf("\n"); 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;
else high=mid-1;
} if(flag==1)
{
print2(l,mid);
if(panduan1(ch)) // 調(diào)用判斷函數(shù) 1
chazhao3(l);
else {
system("cls");
menu();
}
else
{
if(panduan2(ch)) //調(diào)用判斷函數(shù) 2
chazhao3(l); else
{ system("cls"); menu();
}
}
}
}
void chazhao2(linklist &l)// 按學(xué)號(hào)從小到大查找(采用二分查找)
{
if(l.length==0) panduan3();
else
{
int low=0,high=l.length,mid,flag=0;
int n;
char ch;
printf("\n");printf("\n");
printf(" 按學(xué)號(hào)查找 > 請(qǐng)輸入要查找的學(xué)號(hào) :");
scanf("%d",&n);
printf("\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;
else
high=mid-1;
}
if(flag==1)
{
print2(l,mid);
if(panduan1(ch))
chazhao2(l);
else
{ system("cls"); menu();
}
}
else
{ if(panduan2(ch)) chazhao2(l);
else
{ system("cls"); menu();
}
}
}
}
void chazhao1(linklist &l)// 按姓名從小到大查找(采用二分查找)
{
if(l.length==0) panduan3();
else
{
int low=0,high=l.length,mid,flag=0;
printf("\n");printf("\n");
printf(" 按姓名查找 > 請(qǐng)輸入要查找的姓名 :");
char a[15],ch;
scanf("%s",a);
printf("\n");
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;
else
high=mid-1;
}
if(flag==1)
{
print2(l,mid); //打印查找到的學(xué)生的信息 if(panduan1(ch)) chazhao1(l); else {
system("cls"); menu();
}
}
else
{ if(panduan2(ch)) chazhao1(l); else
{ system("cls");
menu();
}
}
}
}
void insert(linklist &l)// 按學(xué)號(hào)從小到大插入該學(xué)生
{
int i,j,k;
char ch;
printf("\n");
printf(" 插入的學(xué)生信息為 :\n");
printf(" 姓名 :");
fflush(stdin);// 清空輸入緩沖區(qū),得到正確的輸入數(shù)據(jù) gets(stud.name);
printf(" 學(xué)號(hào) :"); scanf("%d",&stud.num);
printf(" 房號(hào) :"); 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");
}
void Delete(linklist &l)// 按學(xué)號(hào)刪除該學(xué)生 {
int i,j,k=-1;
char ch;
printf("\n");printf("\n");
printf(" 請(qǐng)輸入要?jiǎng)h除學(xué)生的學(xué)號(hào) :");
scanf("%d",&stud.num);
for(i=0;i<l.length;i++) {
if(stud.num==l.elem[i].num)
{
printf(" 該學(xué)生的信息為 :\n");printf("\n");
printf("%-15s %-3d %7d\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");
}
int main() //主函數(shù)
{
linklist l; //定義線(xiàn)性表 l
init(l); //調(diào)用初始化函數(shù)
char ch;
system("color a");
printf("\n");
printf("
*************************
歡迎進(jìn)入宿舍管理查詢(xún)系統(tǒng)
************************
*\n");
printf("\n");
printf(" 請(qǐng)按任意鍵開(kāi)始操作 :");
scanf("%c",&ch);
system("cls");// 將屏幕先前顯示的內(nèi)容清理掉
create(l); // 調(diào)用線(xiàn)性表創(chuàng)建函數(shù)
system("cls");
t=1;
menu(); //調(diào)用主菜單函數(shù)
while(f!=0)
{
system("cls");
switch(f)
{
case 1: sort1(l); // 調(diào)用按姓名排序函數(shù)
printf("\n");
if(l.length==0)
{
printf(" 已無(wú)學(xué)生記錄 \n");
printf("\n");
disp();
menu();
} else
{
printf(" 按姓名排序 :\n");
print1(l);
disp(); //調(diào)用返回主界面
menu();
} break;
case 2: sort2(l); // 調(diào)用按學(xué)號(hào)排序函數(shù) printf("\n");
if(l.length==0)
{
printf(" 已無(wú)學(xué)生記錄 \n");
printf("\n");
disp(); menu();
}
else
{
printf(" 按學(xué)號(hào)排序 :\n");
print1(l);
disp();
menu();
}break;
case 3: sort3(l); //調(diào)用按房號(hào)排序函數(shù)
printf("\n");
if(l.length==0)
{
printf(" 已無(wú)學(xué)生記錄 \n");
printf("\n");
disp();
menu();
}
else
{
printf(" 按房號(hào)排序 :\n");
print1(l);
disp();
menu();
}break;
case 4:sort1(l); //先調(diào)用按姓名排序函數(shù)進(jìn)行排序
chazhao1(l); //再調(diào)用按姓名查找函數(shù)進(jìn)行二分)查找 break;
case 5: sort2(l); //先調(diào)用按學(xué)號(hào)排序函數(shù)進(jìn)行排序
chazhao2(l); //再調(diào)用按學(xué)號(hào)查找函數(shù)進(jìn)行二分)查找
break; case 6: sort3(l); // 先調(diào)用按房號(hào)排序函數(shù)進(jìn)行排序 chazhao3(l); //再調(diào)用按房號(hào)查找函數(shù)進(jìn)行二分)查找
break;
case 7: sort2(l); // 調(diào)用插入函數(shù)
insert(l);
system("cls");
printf(" 顯示插入后的學(xué)生信息 :\n");print1(l);
disp();
menu();
break;
case 8: Delete(l); //調(diào)用刪除函數(shù)
if(l.length==0)
{
printf("\n");
printf(" 學(xué)生記錄已被刪除完 \n");
printf("\n");
disp();
menu();
} else
{
printf(" 顯示刪除后的學(xué)生信息 :\n");
print1(l);
disp();
menu();
} break;
}
}
}
七、參考文獻(xiàn)
1、《C++程序設(shè)計(jì)(第2版)》,譚浩強(qiáng)編著,清華大學(xué)出版社, 2013年11月。
2、《數(shù)據(jù)結(jié)構(gòu) C 語(yǔ)言版) 》 ,嚴(yán)蔚敏、吳偉民編著,清華大學(xué)出版社, 2013 年 4 月。