数据结构课程设计-通讯录管理系统(C语言版)
##數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-通訊錄管理系統(tǒng)
一,前言
自從上次C語(yǔ)言課設(shè)寫(xiě)完后,這次數(shù)據(jù)結(jié)構(gòu)課設(shè)就寫(xiě)的游刃有余了,很快啊,不足三天就寫(xiě)完了它(年輕人不講武德),如果你認(rèn)真看過(guò)我之前寫(xiě)的C語(yǔ)言課程設(shè)計(jì)-球隊(duì)管理系統(tǒng),你就不難發(fā)現(xiàn),這次數(shù)據(jù)結(jié)構(gòu)的課設(shè)完全就是那篇直接改過(guò)來(lái)的,也就存儲(chǔ)結(jié)構(gòu)變了一下。
C語(yǔ)言課設(shè)在這里-----球隊(duì)管理系統(tǒng)(C語(yǔ)言版)
廢話先不多說(shuō),直接上完整代碼:
二,直接上代碼
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> typedef int ElemType; typedef struct person{char num[10];//編號(hào) char name[10];//姓名 char sex[10];//性別 char phone[10];//電話 }personal;/*={};測(cè)試*/ typedef struct node {person data;//數(shù)據(jù)域 struct node * next;//指針域 }ListNode,* LinkList; LinkList InitList(); LinkList Create(LinkList head); void List(LinkList head);//顯示所有記錄 void save(LinkList head);//保存到文件 void Find(LinkList head);//按要求查找 int GetLength(LinkList head);//總記錄條數(shù) void Add(LinkList head);//增加新的記錄 void Alter(LinkList head);//修改 void Delete(LinkList head); //刪除 void Statis_sex(LinkList head);//性別個(gè)數(shù) void Quit();//退出選單 void Menu(LinkList head);//選單 //Creat模塊已通過(guò)讀取文件信息實(shí)現(xiàn) LinkList InitList() {LinkList head=(LinkList)malloc(sizeof(ListNode));//創(chuàng)立頭結(jié)點(diǎn)if(head==NULL){printf("空間分配無(wú)效!"); exit(-1);//退出程序}head->next=NULL;return head; } LinkList Create(LinkList head) {person LM;//接受文件數(shù)據(jù) LinkList rear;rear=head;FILE *fp= fopen("file.txt","r");if(fp==NULL){printf("打開(kāi)文件失敗!");return NULL; }while(fscanf(fp,"%s%s%s%s",LM.num,LM.name,LM.sex,LM.phone)!=EOF)//處理到文件尾 { LinkList s=(LinkList)malloc(sizeof(ListNode));s->data=LM;s->next=NULL;rear->next=s;rear=s;}fclose(fp);return head; } void List(LinkList head) {LinkList p;p = head->next;if (!p) //如果head指針為空說(shuō)明鏈表為空{printf("\n鏈表為空!\n\n");}else{printf("\n通信錄:\n\n");printf("編號(hào) 姓名 性別 電話 \n");while (p) //循環(huán)將各個(gè)節(jié)點(diǎn)值輸出{ printf("%s\t%s\t%s\t%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone);//打印p = p->next;//此句放在打印后面,防止產(chǎn)生野指針 }Statis_sex(head);printf("\n返回主菜單\n");system("pause");//頁(yè)面停留Menu(head);} } void save(LinkList head) {LinkList rear;person LM;rear=head->next;//跳過(guò)頭節(jié)點(diǎn) FILE *fp;int i;if((fp=fopen("file.txt","wb"))==NULL)/*只打開(kāi)或建立一個(gè)二進(jìn)制文件,只允許寫(xiě)數(shù)據(jù)*/{printf("\n文件不存在!\n");}while(rear)//處理到文件尾 { LM=rear->data;fprintf(fp,"%s\t%s\t%s\t%s\n",LM.num,LM.name,LM.sex,LM.phone);rear=rear->next;}fclose(fp); } void Find(LinkList head) {int Loop=0;char name[10];printf("請(qǐng)輸入要查詢聯(lián)系人的姓名[ ]\b\b\b\b\b\b");scanf("%s",name);LinkList rear=head->next; while(rear){if (strcmp(rear->data.name,name)==0) {printf("編號(hào) 姓名 性別 電話 \n");printf("%s\t%s\t%s\t%s\n",rear->data.num,rear->data.name,rear->data.sex,rear->data.phone);Loop=1;}rear=rear->next;}if(Loop==1){printf("\n查詢聯(lián)系人成功!返回菜單\n");system("pause");Menu(head); } else{int n;printf("無(wú)此聯(lián)系人!!!\n\n返回菜單(1) or 重新輸入(2)[ ]\b\b\b");scanf("%d",&n);printf("\n");switch(n){case 1:system("cls");Menu(head);break;case 2:system("cls");Find(head);break;}} } int GetLength(LinkList head) {LinkList p=head->next;int i=0;while(p){i++;p=p->next;}return i; }//獲取鏈表長(zhǎng)度 void Add(LinkList head) { char c;person LM;LinkList p=head;printf("請(qǐng)輸入新建聯(lián)系人的信息\n\n編號(hào) /姓名 /性別 /電話號(hào)碼:\n");do{scanf("%s",LM.num);scanf("%s",LM.name);scanf("%s",LM.sex);scanf("%s",LM.phone);LinkList s=(LinkList)malloc(sizeof(ListNode));s->data=LM;s->next=NULL;while(p->next){p=p->next;}p->next=s;save(head);printf("是否繼續(xù)添加 y/n\n");scanf(" %c",&c);}while(c=='y'||c=='Y');printf("\n返回主菜單\n");system("pause");Menu(head); } void Alter(LinkList head) {int loop=0;int n;char name[10];printf("請(qǐng)輸入要查詢聯(lián)系人的姓名 [ ]\b\b\b\b\b\b");scanf("%s",name);printf("\n");LinkList rear=head->next; while(rear){if (strcmp(rear->data.name,name)==0){printf("請(qǐng)輸入要修改的內(nèi)容:(1)編號(hào) (2)姓名 (3)性別 (4)電話號(hào)碼 (5)全部信息 [ ]\b\b");//printf("%s\t%s\t%s\t%s\n",rear->data.num,rear->data.name,rear->data.sex,rear->data.phone);scanf("%d",&n);printf("\n");switch(n){case 1: printf("請(qǐng)輸入修改后的編號(hào):");scanf("%s",rear->data.num);break;case 2: printf("請(qǐng)輸入修改后的姓名:");scanf("%s",rear->data.name);break;case 3: printf("請(qǐng)輸入修改后的性別:");scanf("%s",rear->data.sex);break;case 4: printf("請(qǐng)輸入修改后的電話號(hào)碼");scanf("%s",rear->data.phone);break;case 5: printf("請(qǐng)輸入要修改聯(lián)系人的信息: \n\n編號(hào) 姓名 性別 電話號(hào)碼:\n");scanf("%s",rear->data.num);scanf("%s",rear->data.name);scanf("%s",rear->data.sex);scanf("%s",rear->data.phone);break;}system("cls");loop=1;} rear=rear->next;}if(loop==0){printf("無(wú)此聯(lián)系人!!!\n\n返回菜單(1) or 重新輸入(2)[ ]\b\b\b");scanf("%d",&n);printf("\n");switch(n){case 1:system("cls");Menu(head);break;case 2:system("cls");Alter(head);break;}}save(head);printf("\n修改成功!返回菜單\n");system("pause");Menu(head); } void Delete(LinkList head) {LinkList rear=head;//用來(lái)找要?jiǎng)h除節(jié)點(diǎn)的前一節(jié)點(diǎn) LinkList p=rear->next;//用來(lái)找要?jiǎng)h除節(jié)點(diǎn)char name[10];int Loop=0,n;printf("請(qǐng)輸入要?jiǎng)h除聯(lián)系人的姓名:[ ]\b\b\b\b\b");scanf("%s",name);printf("\n");while(p){if(strcmp(p->data.name,name)==0){rear->next=p->next;free(p);save(head); Loop=1;}rear=p;p=p->next;}if(Loop==1){printf("\n刪除聯(lián)系人成功!返回菜單\n");system("pause");Menu(head); } else{printf("無(wú)此聯(lián)系人!!!\n\n返回菜單(1) or 重新輸入(2)[ ]\b\b\b");scanf("%d",&n);printf("\n");switch(n){case 1:system("cls");Menu(head);break;case 2:system("cls");Delete(head);break;}} } void Statis_sex(LinkList head) {int i=0;//記錄男性數(shù)目 int j=GetLength(head);//獲取總記錄數(shù) LinkList rear=head->next;char sex[10]="man";while(rear){if(strcmp(rear->data.sex,sex)==0)i++;rear=rear->next; } printf("\n通信錄中男性有 %d 人,有女性 %d 人。\n",i,j-i); } void Quit() {printf("\n\t ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★\n\n");puts("\n");puts("\t ┃ ┃");puts("\t ┃ ┃");puts("\t ┃ 感謝訪問(wèn)通信錄管理系統(tǒng)!歡迎下次再來(lái)! ┃");puts("\t ┃ ┃");puts("\t ┃ ┃");puts("\t ┃ 制作人:追足夢(mèng)幻 ┃");puts("\t ┃ 2020.7.3 ┃ ");puts("\n ");} void Menu(LinkList head) {int n;int choice=0;do{system("cls");printf("\n");printf(" ---通訊錄管理系統(tǒng)---\n");puts("\n");printf(" 1/按姓名查詢聯(lián)系人信息\n");puts("\n");printf(" 2/ 新建聯(lián)系人\n");puts("\n");printf(" 3/修改聯(lián)系人信息\n");puts("\n");printf(" 4/ 刪除聯(lián)系人信息\n");puts("\n");printf(" 5/顯示所有聯(lián)系人信息\n");puts("\n");printf(" 6/ 退出\n");puts("\n");printf(" 請(qǐng)選擇服務(wù)種類(1-6) : [ ]\b\b");scanf("%d",&n);if(n<1||n>6){system("cls");printf("選擇錯(cuò)誤! 請(qǐng)重新選擇!\n");system("pause");choice=1;}else{break;}}while(choice==1);switch(n){ case 1:system("cls");Find(head);break;//Find函數(shù)查詢 case 2:system("cls");Add(head);break;//Add函數(shù)新建聯(lián)系人 case 3:system("cls");Alter(head);break;//Alter修改聯(lián)系人信息 case 4:system("cls");Delete(head);break;//Delete刪除聯(lián)系人信息 case 5:system("cls");List(head);break;//List顯示所有信息 case 6:system("cls");Quit();break;//退出 } } int main() {LinkList head=InitList();head=Create(head);printf("\n信息錄入成功!");system("pause"); Menu(head); }三,設(shè)計(jì)報(bào)告
接下來(lái)是我課設(shè)報(bào)告中的設(shè)計(jì)部分內(nèi)容
一、 引言(簡(jiǎn)要說(shuō)明設(shè)計(jì)題目的目的、意義、內(nèi)容、主要任務(wù)等)
目的:構(gòu)建通訊錄管理系統(tǒng)
意義:對(duì)于一個(gè)通信錄來(lái)說(shuō),要管理聯(lián)系人的信息,包括編號(hào),姓名,性別,電話。開(kāi)發(fā)其系統(tǒng)主要為了幫助用戶提高通訊錄有管理效率,節(jié)約資源,提高信息的精確度。
內(nèi)容:九大模塊((主函數(shù)main(),菜單函數(shù)Menu(),退出選單函數(shù)Quit(),創(chuàng)建數(shù)據(jù)函數(shù)Create(),增減數(shù)據(jù)函數(shù)Add(),查找函數(shù)Find(),修改函數(shù)Alter(),刪除函數(shù)Delete(),顯示所有記錄函數(shù)List())加上四個(gè)輔助功能函數(shù)(初始化鏈表函數(shù)InitList(),保存函數(shù)save(),獲取鏈表長(zhǎng)度函數(shù)GetLength(),統(tǒng)計(jì)性別函數(shù)Statis_sex())。
主要任務(wù):
1,打開(kāi)文件讀取通信錄信息
2,通過(guò)鏈?zhǔn)酱鎯?chǔ)接受文件儲(chǔ)存信息
3,對(duì)文件信息進(jìn)行修改
4,保存修改并將信息寫(xiě)回文件
二、 正文(課程設(shè)計(jì)的主要內(nèi)容,包括實(shí)驗(yàn)與觀測(cè)方法和結(jié)果、儀器設(shè)備、計(jì)算方法、編程原理、數(shù)據(jù)處理、設(shè)計(jì)說(shuō)明與依據(jù)、加工整理和圖表、形成的論點(diǎn)和導(dǎo)出的結(jié)論等。正文內(nèi)容必須實(shí)事求是、客觀真切、準(zhǔn)確完備、合乎邏輯、層次分明、語(yǔ)言流暢、結(jié)構(gòu)嚴(yán)謹(jǐn),符合各學(xué)科、專業(yè)的有關(guān)要求。)
主要內(nèi)容:首先定義結(jié)構(gòu)體,定義主函數(shù),定義鏈表初始化函數(shù),用主函數(shù)調(diào)用鏈表初始化函數(shù)構(gòu)建鏈表 head,接下來(lái)的所有操作基于鏈表head,調(diào)用Create()函數(shù)以將文件里面的數(shù)據(jù)寫(xiě)出并賦給鏈表,鏈表里面每個(gè)結(jié)點(diǎn)的屬性為定義的結(jié)構(gòu)體類型,然后調(diào)用Menu()函數(shù)以顯示歡迎界面和菜單。
Menu函數(shù)通過(guò)switch條件語(yǔ)句調(diào)用各功能函數(shù),選擇1時(shí),
1, 可按姓名查詢聯(lián)系人;
2, 新建聯(lián)系人并保存到文件;
3, 可以修改聯(lián)系人信息并保存,修改聯(lián)系人信息有包括了對(duì)聯(lián)系人編號(hào),姓名,性別,電話號(hào)碼的分別修改,也可以同時(shí)對(duì)編號(hào),姓名,性別,電話號(hào)碼修改;
4, 修改聯(lián)系人信息;
5, 顯示所有聯(lián)系人信息并停機(jī)男女個(gè)數(shù);
6, 可以調(diào)用fail函數(shù)以顯示退出系統(tǒng)頁(yè)面。
總流程圖
每模塊都需有每個(gè)函數(shù)功能介紹,截圖,關(guān)鍵代碼等
1, 定義結(jié)構(gòu)體
typedef struct person{char num[10];//編號(hào) char name[10];//姓名 char sex[10];//性別 char phone[10];//電話 }personal;typedef struct node {person data;//數(shù)據(jù)域 struct node * next;//指針域 }ListNode,* LinkList;2, 鏈表初始化
LinkList InitList() {LinkList head=(LinkList)malloc(sizeof(ListNode));//創(chuàng)立頭結(jié)點(diǎn)if(head==NULL){printf("空間分配無(wú)效!"); exit(-1);//退出程序}head->next=NULL;return head; } 3,主函數(shù) int main() {LinkList head=InitList();head=Create(head);printf("\n信息錄入成功!");system("pause"); Menu(head); }首先初始化鏈表 head,然后或讀取文件file.txt中的數(shù)據(jù)掛靠到鏈表 head=Create()
4, 讀取文件數(shù)據(jù)到鏈表Create()
打開(kāi)文件 file.txt FILE *fp= fopen(“file.txt”,“r”); 然后從頭到尾處理文件將每一個(gè)聯(lián)系人的數(shù)據(jù)寫(xiě)入結(jié)構(gòu)體變量,并掛靠到鏈表中
fclose(fp); 記得一定要關(guān)閉文件
return head; 此時(shí)返回的鏈表就是一個(gè)滿載數(shù)據(jù)的鏈表了,以后的操作都基于這條鏈表
5,菜單函數(shù)Menu()
關(guān)鍵代碼: switch() 選擇語(yǔ)句
6,按姓名查找 Find()
遍歷鏈表知道找到要查詢聯(lián)系人姓名為止
關(guān)鍵代碼:
7,新增加新的記錄Add()
定義結(jié)構(gòu)體變量LM person LM;
將要新建的聯(lián)系人信息賦給 LM;
再用尾插法將LM添加到鏈表head
關(guān)鍵代碼:
8,保存函數(shù)save
打開(kāi)文件只允許寫(xiě)數(shù)據(jù),文件從頭處理到位,并將鏈表中的數(shù)據(jù)寫(xiě)入文件
關(guān)鍵代碼:
9,修改信息函數(shù)Alter()
遍歷鏈表數(shù)據(jù),查找輸入的關(guān)鍵字(姓名),找到后鎖定這一結(jié)點(diǎn)并通過(guò)一個(gè)switch語(yǔ)句選擇要修改的信息(編號(hào),姓名,性別,電話號(hào)碼,全部信息),選擇好后對(duì)應(yīng)結(jié)點(diǎn)數(shù)據(jù)相應(yīng)位置覆蓋修改即可。
關(guān)鍵代碼:
修改完save()保存
10,刪除聯(lián)系人信息函數(shù)Delete()
刪除節(jié)點(diǎn)圖解:
遍歷鏈表,尋找關(guān)鍵字(姓名),分別用兩個(gè)指針(rear,p)指向關(guān)鍵字這一結(jié)點(diǎn)和它前一結(jié)點(diǎn),
關(guān)鍵代碼:
11,顯示所有信息List()
從頭到尾遍歷鏈表,打印除頭結(jié)點(diǎn)的數(shù)據(jù)域的數(shù)據(jù)即可。
關(guān)鍵代碼:
12,統(tǒng)計(jì)性別人數(shù)Statis_sex()
先計(jì)算出鏈表總長(zhǎng)度 j,再以某一性別作為關(guān)鍵字遍歷鏈表并計(jì)數(shù)統(tǒng)計(jì)這一性別的人數(shù)i,用j-i即是另一性別的人數(shù)。
關(guān)鍵代碼;
13, 獲取鏈表長(zhǎng)度GetLength()
從頭到尾遍歷鏈表并計(jì)數(shù)
關(guān)鍵代碼:
關(guān)鍵步驟運(yùn)行截圖
三、結(jié)論(應(yīng)當(dāng)準(zhǔn)確、完整、明確精練;也可以在結(jié)論或討論中提出建議、設(shè)想、尚待解決問(wèn)題等。
1、課程設(shè)計(jì)的特點(diǎn)
根據(jù)問(wèn)題描述可知,需要解決問(wèn)題并不復(fù)雜,整個(gè)問(wèn)題只需要實(shí)現(xiàn)一個(gè)通訊錄管理系統(tǒng)功能,那就是在這個(gè)系統(tǒng)中實(shí)現(xiàn)對(duì)通信錄信息的插入、刪除、查詢、修改以及保存。但是,為了實(shí)現(xiàn)該功能,卻需要優(yōu)秀的算法和數(shù)據(jù)結(jié)構(gòu)以保證實(shí)現(xiàn)的時(shí)間和空間效率。把聯(lián)系人信息存儲(chǔ)在一個(gè)單鏈表中,利用指針實(shí)現(xiàn)對(duì)聯(lián)系人信息的各項(xiàng)基本操作。
2、存在的不足
雖然設(shè)計(jì)的程序完成了題目描述所需要實(shí)現(xiàn)的功能,但是仍然存在不盡人意的地方。那就是可以再排序上面多設(shè)計(jì)幾個(gè)算法。實(shí)現(xiàn)多角度排序。
3、心得體會(huì)
經(jīng)過(guò)這次數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì),我們不僅及時(shí)鞏固的了數(shù)據(jù)結(jié)構(gòu)、算法、以及軟件工程的知識(shí),并對(duì)數(shù)據(jù)結(jié)構(gòu)和算法的配合對(duì)于程序時(shí)間和空間性能的影響以及軟件工程提供的開(kāi)發(fā)流程和工具對(duì)于實(shí)現(xiàn)特定功能程序的重要意義。
當(dāng)我們面對(duì)一個(gè)實(shí)際問(wèn)題,應(yīng)該迅速根據(jù)問(wèn)題性質(zhì)和特點(diǎn)抽象成特定的數(shù)據(jù)結(jié)構(gòu),當(dāng)然每個(gè)問(wèn)題都有可能能夠抽象成多種數(shù)據(jù)結(jié)構(gòu),每種數(shù)據(jù)結(jié)構(gòu)適應(yīng)于不同的算法,例如,馬踏棋盤(pán)問(wèn)題就可以采用廣度優(yōu)先搜索或深度優(yōu)先搜索來(lái)解決。因此此時(shí)就應(yīng)該綜合考慮這樣的數(shù)據(jù)結(jié)構(gòu)、算法以及它們的空間和時(shí)間效率,然后從中選擇一個(gè)作為實(shí)現(xiàn)程序的基礎(chǔ)。
此外,對(duì)程序的測(cè)試應(yīng)該要仔細(xì),根據(jù)模塊的特點(diǎn)和測(cè)試階段,采用各種軟件測(cè)試方法對(duì)程序進(jìn)行測(cè)試,確保各個(gè)模塊的正確性和完整性,最后集成起來(lái)測(cè)試其是否正確和完整地實(shí)現(xiàn)了問(wèn)題描述中要求的功能。
4、程序經(jīng)驗(yàn)教訓(xùn)總結(jié):
通過(guò)這個(gè)程序設(shè)計(jì),我不僅提高了動(dòng)手操作能力,對(duì) C語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)有了更深的認(rèn)識(shí), 能夠更好地運(yùn)用 C語(yǔ)言進(jìn)行編程設(shè)計(jì),同時(shí)在思維、看待問(wèn)題的全面性等方面也有了很大的提高。不過(guò)由于時(shí)間、經(jīng)驗(yàn)不夠、對(duì)語(yǔ)言的掌握程度不深等問(wèn)題,在這個(gè)系統(tǒng)設(shè)計(jì)還存在一些問(wèn)題,比如內(nèi)存設(shè)計(jì)還不夠完善,整個(gè)系統(tǒng)的流暢性等,希望可以在今后的設(shè)計(jì)上能夠解決這些問(wèn)題,做的更好。
四、參考文獻(xiàn)
[1] 嚴(yán)蔚敏,吳偉民編著.《數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)》.北京:清華大學(xué)出版社,1997.4. 18-39
[2] 菜鳥(niǎo)教程 網(wǎng)站https://www.runoob.com/
[3] CSDN 網(wǎng)站 https://www.csdn.net/
總結(jié)
以上是生活随笔為你收集整理的数据结构课程设计-通讯录管理系统(C语言版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工作164:对父和混入的理解
- 下一篇: 学习笔记之深入浅出MFC 第5章 Win