数据结构(C语言)——电话号码查询系统实现
報告內容開始
一、數據結構課程設計目標
《數據結構》是計算機專業一門重要的專業技術基礎課程,是一門關鍵性核心課程?!稊祿Y構》課程的目標是使學生學會分析研究計算機加工對象的特性,選擇合適的數據結構和存儲表示,以及編制相應的實現算法,培養和提高學生程序設計的能力?!稊祿Y構》課程也是一門實踐性較強的課程,設置實踐環節是十分重要的。本課程設計的目標就是要達到理論與實際應用相結合,提高學生組織數據及編寫大型程序的能力,并培養基本的、良好的程序設計技能以及合作能力。
二、問題描述
人們在日常生活中經常需要查找某個人或某個單位的電話號碼,本實驗將實現一個簡單的個人電話號碼查詢系統,根據用戶輸入的信息(例如姓名等)進行快速查詢。
三、需求分析
1. 需求
人們在日常生活中經常需要查找某個人或某個單位的電話號碼,通過紙質記錄或是電子文檔記錄會顯得雜亂,并且難于管理維護。因此設計一個電話號碼查詢系統。
電話號碼查詢系統需要做到:
2. 對需求進行算法分析
電話號碼查詢系統程序運行結束會釋放內存,導致插入信息丟失。如果要在程序運行結束后仍然保存電話號碼信息,就需要將電話號碼信息采用文件的形式存放到外存中。在系統運行時,需要將電話號碼信息從文件調入內存來進行查找等操作就需要創建一個結構體接收文件數據。完成對電話號碼的插入刪除等操作使用對單鏈表的增刪改查算法實現。利用起泡排序法對電話號碼信息進行排序。
四、概要設計
如果要建立電話號碼查詢系統需要輸入多個類型信息,例如姓名,電話號,郵箱等。所要求定義的數據類型不同,所以定義一個結構體封裝各類型數據。將各個功能函數定義在一個類中。需要完成的功能有:插入,排序,刪除,查找,修改,保存。要顯示這些功能結果還需要有顯示功能。
因為電話號碼查詢系統需要記錄用戶信息,即對輸入的信息進行保存。所以在程序運行時應當有對外部數據處理的函數,即文件輸入輸出函數,需要在系統執行功能之前對外部內存進行檢索,查找是否有記錄信息的文件,如果有,則導入,如果沒有,在程序運行保存數據后,應當建立一個外部存儲文件用以存放用戶輸入信息,方便下次直接進行信息的讀入、檢索、閱覽。
對程序進行概括設計,建立函數模塊圖,以及程序流程圖。
函數模塊思維導圖如下:
程序流程圖如下:
五、詳細設計
1.結構體的定義
定義所需要的的結構變量,以及一些結構體函數,
具體算法實現及注釋信息如下:
2.建立單鏈表,讀取外部文件數據
使用頭插法建立單鏈表
頭插法是將新增結點插入到第一個結點之前,示意圖如下:
使用到iostream、fstream頭文件,定義讀寫操作
程序代碼及注釋如下:
TeleQuerySystem::TeleQuerySystem() {Head = new TeleNumber; // 頭插法建立單鏈表Head->Next = new TeleNumber;End = Head->Next;in.open("TeleNumber.txt"); // 打開外存文件,看是否有數據存在if (!in)cout << " 電話查詢系統中沒有任何信息,請輸入信息 " << endl;else{while (!in.eof()) // 如果有,則打開,并將數據讀取到程序{End->ReadFile(in);if (End->name[0] == '\0')break;End->Next = new TeleNumber;End = End->Next;}in.close();cout << " 讀取電話號碼查詢系統成功 !" << endl;}cout << " 輸入任意字符繼續 " << endl;cin >> a; } TeleQuerySystem::~TeleQuerySystem() // 釋放單鏈表 {TeleNumber* temp;while (Head->Next != End){temp = Head->Next;Head = Head->Next;delete temp;}delete Head, End; // 刪除頭尾指針 }3.主函數部分設計(查詢系統首頁菜單)
利用switch語句實現輸入代號調用函數
程序代碼及注釋信息如下:
4.子函數調用(各個功能的具體實現函數)
(1) 鏈表插入函數Insert()【實現新信息的添加】
調用結構體內封裝函數input實現鍵入信息插入鏈表結點
程序代碼以及注釋信息如下:
(2) 顯示函數Show()
調用結構體內封裝函數display實現鍵入信息插入鏈表結點
程序代碼及注釋信息如下:
(3) 排序函數BubbleSort()
排序函數我使用起泡排序法。通過比較電話號碼進行排序。排序方法是對一個結點A的電話號碼信息與下一個結點B電話號碼信息進行比較,若A>B,則進行信息交換。再與下一個結點C進行比較,如此往復比較n-1趟結束。
對信息交換,需要定義一個數據域交換函數進行兩個結點間的數據交換,我們使用函數 strcpy。
程序代碼及注釋信息如下:
void TeleQuerySystem::BubbleSort() // 起泡排序主體 {TeleNumber* p = NULL, * q = NULL;int exchange = j - 1;int bound;int i;while (exchange){bound = exchange;exchange = 0;for (p = Head->Next, i = 1; i < bound; i++, p = p->Next)if (p->mobileNumber > p->Next->mobileNumber){Swap(p, p->Next); // 調用交換函數exchange = p->s;}}Show();//調用顯示函數顯示結果 } void TeleQuerySystem::Swap(TeleNumber* p1, TeleNumber* p2) // 兩個類對象數據域進行交換 {TeleNumber* temp = new TeleNumber;strcpy_s(temp->name, p1->name);temp->mobileNumber = p1->mobileNumber;temp->phoneNumber = p1->phoneNumber;strcpy_s(temp->email, p1->email);temp->s = p1->s;strcpy_s(p1->name, p2->name);p1->mobileNumber = p2->mobileNumber;p1->phoneNumber = p2->phoneNumber;strcpy_s(p1->email, p2->email);p1->s = p2->s;strcpy_s(p2->name, temp->name);p2->mobileNumber = temp->mobileNumber;p2->phoneNumber = temp->phoneNumber;strcpy_s(p2->email, temp->email);p2->s = temp->s; }(4) 信息查詢函數Search()
信息查詢函數是對姓名進行查詢,對單鏈表所有結點,從頭結點開始進行遍歷。用strcmp字符串比較函數對名字這個字符數組進行比較,若相等,則調用display輸出該結點p對應的信息。不存在則輸出“查無此人”。
程序代碼及注釋信息如下:
TeleNumber* TeleQuerySystem::Search(char* name) {for (TeleNumber* p = Head->Next; p != End; p = p->Next)if (!strcmp(p->name, name)){if (x == 4){p->display();return p;}elsereturn p;}if (x == 4)cout << " 查無此人 " << endl;return 0;}(5) 刪除函數Delete()
刪除函數使用單鏈表刪除操作完成。思想:為找出要刪除的結點p(2結點),將前驅結點pre(1結點)的下一結點指向所要刪除的結點p的下一結點temp(3結點)。
示意圖如下:
程序代碼及注釋信息如下:
void TeleQuerySystem::Delete() // 刪除 {char name[20];TeleNumber* p = new TeleNumber, * temp = NULL;cout << " 請輸入要刪除人的姓名 :" << endl;cin >> name;p->Next = Search(name); // 先進行查找,找到所要刪除的結點if (Search(name)){temp = p->Next;p->Next = p->Next->Next; // 摘鏈delete temp;cout << "\t\t 刪除成功 !" << endl;}else{cout << "\t\t 沒有找到 !" << endl;} }(6) 修改函數Change()
修改信息的函數是使用查詢函數對需要修改的姓名進行查詢,查詢到的鏈表結點(姓名所對應信息)調用input函數重新輸入信息。
程序代碼及注釋信息如下:
void TeleQuerySystem::Change() // 修改信息 {char name[20];cout << " 請輸入要修改的人的姓名 :";cin >> name;if (Search(name)){cout << "\t\t 已找到個人的信息,請輸入新的信息 !" << endl;Search(name)->input();cout << " 修改成功! " << endl;}else{cout << "\t\t 沒有找到 !" << endl;} }(7) 文件保存函數FileSave()
文件保存函數即利用iostream和fstream頭文件將鏈表信息值循環依次導入到外部存儲文件中。
程序代碼及注釋信息如下:
六、軟件說明書(給出軟件如何使用,使用時的注意事項)
軟件使用過程: 使用集成編譯軟件運行TeleQuerySystem.cpp文件 程序運行成功后首頁顯示
-
初次運行該程序會顯示如下字段:
-
對電話號信息進行保存后再次運行程序會顯示如下:
-
出現“輸入任意字符繼續”后隨意輸入一個字符跳轉到主頁菜單欄
主頁菜單欄的使用
主頁菜單欄顯示如下:
添加信息請按1顯示信息請按2排序信息請按3查找信息請按4刪除信息請按5修改信息請按6保存信息請按7輸入代號:- 使用主頁菜單欄需要根據所需要使用的功能,鍵入對應的數字。
例如:我們需要插入信息,就使用鍵盤鍵入1,進入信息添加模塊,根據提示輸入信息即可,信息輸入完成后鍵入回車(Enter鍵)完成插入信息操作。操作過程圖如下: - 在顯示插入信息成功,顯示“輸入任意字符返回”字段后鍵入一個字符后返回主頁菜單欄。
其他功能實現同理。 - 最后鍵入7,以文件形式保存數據至外存中,文件名為“TeleNumber.txt”。
注意事項
- 這里我使用的是Visual Stdio
2019,使用VC6.0需要將代碼第146、149、151、154、156、159行的strcpy_s改為strcpy。這是因為在VC++2005和VS2013版本后引入了函數后綴” _s ” 使得原函數更加安全,老版本編譯器沒有引入該后綴會導致編譯出錯。 - 在顯示“輸入任意字符繼續”字段時切忌輸入大于單個字符的字符串,否則會出現異常
- 在對數據信息進行增刪改查后如果沒有保存信息而關閉程序,會導致本次信息修改數據丟失
七、測試報告
八、心得體會
參考文獻:《數據結構(C語言版)清華大學出版社.嚴蔚敏》
報告內容結束
本文章作為本人云筆記順便分享給大家,吸納一下大家建議。
代碼部分參照了老師給的實驗報告以及網上大神的代碼(排序數據域互換代碼不是本人所寫,然而這段代碼沒有做到成功互換鏈表數據,哭了)。如有問題希望給出建議
第一次寫博客,有問題望見諒。[別客氣,問題隨便提]
因為疫情原因,所以課程設計原本時限一周壓縮至一天。很多功能實現有欠缺??梢赃m量更改一下。例如:
- 電話號碼可以定義為字符數組類型,這樣對排序功能實現會很方便。至今我排序功能實現都有問題,原因不明,只怪自己學藝不精,不過你們幫我提出來我也不會介意,哎嘿…
- 在插入信息時,需要重復退回主頁菜單欄,重新選擇插入功能再進行插入,每插入一條數據都要重復進行此操作,刪除操作亦是如此。操作過于繁雜。
- 在插入信息時,需要重復退回主頁菜單欄,重新選擇插入功能再進行插入,每插入一條數據都要重復進行此操作,刪除操作亦是如此。操作過于繁雜。
- 當進行信息刪除時,依然只能刪除多個同名結點的最靠前結點的數據。
- 當信息出現重復時,沒有良好的查重算法進行約束。
參考的幾篇文章找不到了,有同學見到累死文章評論區推一下鏈接
學藝不精,輕噴…
總結
以上是生活随笔為你收集整理的数据结构(C语言)——电话号码查询系统实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输出四位完全平方数_完全平方数中的规律
- 下一篇: 百度网盘下载提速,推荐3种亲测有效的方法