資料結構——用單鏈表實現通訊錄
阿新 • • 發佈:2018-12-18
1、功能要求
製作一個電子通訊錄,通過該通訊錄能存入好友 ID 號、姓名(英文)、手機號碼、家庭住址、公司電話。
I、 主介面:主要顯示軟體功能
A) 新增好友資訊。
B) 列表好友資訊。(包含排序功能)
C) 搜尋好友
D) 刪除好友
II、新增好友:
使用者輸入 “1” 命令後,讓使用者輸入好友資訊。新增成功或失敗都需要提示
使用者
III、 列表好友:
使用者輸入 “2” 命令後,好友資訊升序排列。
IV、搜尋好友:
使用者輸入 “3” 命令後,讓使用者輸入將要搜尋好友姓名查詢。如果未搜尋到
請友好提示。如果搜尋到,顯示出該好友資訊。
V、刪除好友:
使用者輸入 “4” 命令後,讓用輸入將要刪除好友姓名刪除,如果存在同名的多個好友,則列表出,所有同名的好友資訊,讓使用者通過輸入ID 號刪除。提示用
戶刪除成功。
2、程式檔案
I、
在電子通訊錄/src目錄下分別建立main.c、LinkList.c檔案
//main.c
#include <stdio.h>
#include "LinkList.h"
int main()
{
//建立連結串列
List *ls = CreateList();
if (NULL == ls)
{
printf ("建立失敗\n");
}
//printf ("建立成功\n");
//顯示主選單
Menu(ls);
Destory(ls);
return 0;
}
// LinkList.c #include <stdio.h> //包含malloc()、system("clear") #include <stdlib.h> //包含strcmp() #include <string.h> #include "LinkList.h" //建立連結串列 List *CreateList(void) { List *ls = (List*)malloc(sizeof(List)/sizeof(char)); if (NULL == ls) { //資料型別是指標型別,那我們一般成功的時候返回相應的地址, //失敗的時候返回NULL/用NULL‘清零’ return NULL; } ls->head = (Node*)malloc(sizeof(Node)/sizeof(char)); if (NULL == ls->head) { free(ls); return NULL; } ls->head->next = NULL; return ls; } //主介面的顯示 BOOL Menu(List *ls) { if (NULL == ls) { return ERROR; } system ("clear"); BYTE_1 buf[10]; //search_flag = 1時,搜尋不成功! BYTE_4 search_flag = 1; //delete_flag = 1時,刪除不成功! BYTE_4 delete_flag = 1; while (1) { printf ("------------------\n"); printf ("| 0.退出 |\n"); printf ("| 1.新增好友資訊 |\n"); printf ("| 2.列表好友資訊 |\n"); printf ("| 3. 搜尋好友 |\n"); printf ("| 4. 刪除好友 |\n"); printf ("------------------\n"); printf("請輸入指令:"); //fgets(buf, 10, stdin); ==>改用這條指令有問題,暫未解決 scanf ("%s", buf); //退出、增、顯、查、刪 switch (buf[0]) { case ADD: Add_Contact(ls); break; case DISPLAY: Display_Contact(ls); break; case SEARCH: //search_flag = 1時,搜尋不成功! //搜尋成功,返回0 while (1 == search_flag) { search_flag = Search_Contact(ls); } search_flag = 1; break; case DELETE: //delete_flag = 1時,不成功! //刪除成功,返回0 while (1 == delete_flag) { delete_flag = Delete_Contact(ls); } delete_flag = 1; break; case QUIT: // 清屏 system("clear"); return; default: system("clear"); printf ("輸入指令有誤,請重新輸入!\n"); break; } } } //新增好友資訊、尾插 BOOL Add_Contact(List *ls) { if (NULL == ls) { return ERROR; } // 清屏 system("clear"); Node *node = (Node *)malloc(sizeof(Node)/sizeof(BYTE_1)); if (NULL == node) { return ERROR; } //flag = 1 新增成功 flag = 0 新增失敗 BYTE_4 flag = 0; printf ("請輸入好友ID號:"); scanf ("%d", &node->id); printf ("請輸入好友姓名:"); scanf ("%s", node->name); printf ("請輸入好友手機號碼:"); scanf ("%lld", &node->mobilephone); printf ("請輸入好友家庭住址:"); scanf ("%s", node->homeaddress); printf ("請輸入好友公司電話:"); scanf ("%lld", &node->businessnumber); node->next = NULL; //頭結點 Node *tmp = ls->head; //作表示式時,取指標變數中存放的地址值 while (tmp->next) { tmp = tmp->next; } tmp->next = node; flag = 1; // 清屏 system("clear"); if (1 == flag) { printf ("好友資訊新增成功!\n"); // 程式睡眠1秒 sleep(1); system("clear"); } else { printf ("好友資訊新增失敗!\n"); } return TRUE; } //列表好友資訊 BOOL Display_Contact(List *ls) { if (NULL == ls) { return ERROR; } // 清屏 system("clear"); //氣泡排序:按ID從小到大 Sort(ls); printf("ID號\t姓名\t手機號碼\t\t家庭住址\t\t公司電話\n"); Node *tmp = ls->head->next; while (tmp) { printf ("%-4d\t", tmp->id); printf ("%-4s\t", tmp->name); printf ("%-13lld\t\t", tmp->mobilephone); printf ("%-10s\t\t", tmp->homeaddress); printf ("%-13lld\n", tmp->businessnumber); tmp = tmp->next; } } //氣泡排序 BOOL Sort(List *ls) { if((ls->head -> next == NULL) || (ls->head->next->next == NULL)) { return ERROR; } Node *pre, *cur, *next, *end, *temp; Node *tmp = ls->head; end = NULL; //從連結串列頭開始將較大值往後沉 while(tmp->next != end) { for(pre = tmp, cur = pre->next, next = cur->next; next != end; pre = pre->next, cur = cur->next, next = next->next) { //相鄰的節點,按id進行比較 if(cur->id > next->id) { cur->next = next->next; pre->next = next; next->next = cur; temp = next; next = cur; cur = temp; } } end = cur; } } //搜尋好友:按姓名 BYTE_4 Search_Contact(List *ls) { if (NULL == ls) { return -1; } //若搜尋的人不存在,flag = 1 int flag = 0; // 清屏 system("clear"); BYTE_1 Name[10]; printf ("請輸入您想查詢的好友的姓名:"); scanf ("%s", Name); //tmp相當於頭結點 Node *tmp = ls->head; while (tmp->next) { if (0 == strcmp(tmp->next->name, Name)) { system("clear"); printf ("您所搜尋的好友的資訊如下:\n"); printf ("ID號:%d\n", tmp->next->id); printf ("姓名:%s\n", tmp->next->name); printf ("手機號碼:%lld\n", tmp->next->mobilephone); printf ("家庭住址:%s\n", tmp->next->homeaddress); printf ("公司電話:%lld\n", tmp->next->businessnumber); return 0; } tmp = tmp->next; } system("clear"); printf ("您所搜尋的姓名為 %s 的好友不存在!\n", Name); printf ("請再次輸入您想查詢的好友的姓名!\n"); // 程式睡眠1秒 sleep(1); return 1; } //刪除好友:按姓名 //姓名相同,再按ID刪除 BYTE_4 Delete_Contact(List *ls) { if (NULL == ls) { return -1; } //統計姓名相同的人數 BYTE_4 count = 0; BYTE_4 Id; BYTE_1 Name[10]; system("clear"); printf ("請輸入您想刪除的好友的姓名:"); scanf ("%s", Name); //system("clear"); Node *tmp = ls->head; //初始:頭結點中存的地址值 while (tmp->next) { if (0 == strcmp(tmp->next->name, Name)) { count++; } tmp = tmp->next; } //tmp回位 tmp = ls->head; if (0 == count) { system("clear"); printf ("您所刪除的姓名為 %s 的好友不存在!\n", Name); printf ("請再次輸入您想刪除的好友的姓名!\n"); sleep(1); return 1; } //姓名不重複時,直接刪除! while (1 == count) { while (tmp->next) { if (0 == strcmp(tmp->next->name, Name)) { Node *p = tmp->next; tmp->next = p->next; free(p); printf ("刪除成功!\n"); return 0; } tmp = tmp->next; } } //姓名重複時,按ID刪除 while(count > 1) { printf ("姓名為 %s 的好友共有 %d 人,其資訊如下:\n", Name, count); printf("ID號\t姓名\t手機號碼\t\t家庭住址\t\t公司電話\n"); while (tmp->next) { if (0 == strcmp(tmp->next->name, Name)) { printf ("%-4d\t", tmp->next->id); printf ("%-4s\t", tmp->next->name); printf ("%-13lld\t\t", tmp->next->mobilephone); printf ("%-10s\t\t", tmp->next->homeaddress); printf ("%-13lld\n", tmp->next->businessnumber); } tmp = tmp->next; } //tmp回位 tmp = ls->head; printf ("請輸入您想刪除的好友的ID:"); scanf ("%d", &Id); while (tmp->next) { if (tmp->next->id == Id) { Node *p = tmp->next; tmp->next = p->next; free(p); printf ("刪除成功!\n"); return 0; } tmp = tmp->next; } } return FALSE; } //銷燬 void Destory(List *ls) { if (NULL == ls) { return; } Node *tmp = ls->head; while (tmp->next) { Node *p = tmp->next; tmp->next = p->next; free(p); } free(ls->head); free(ls); }
II、
在電子通訊錄/seq/include目錄下建立LinkList.h檔案
//LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ //退出、增、顯、查、刪 enum {QUIT, ADD, DISPLAY, SEARCH, DELETE}; typedef enum {TRUE, FALSE, ERROR} BOOL; typedef char BYTE_1; typedef int BYTE_4; typedef long long BYTE_8; //每一個結點中應包含一個指標變數,用它來存放下一結點的地址 typedef struct _node { //資料域 BYTE_4 id;//ID號 BYTE_1 name[10];//姓名 BYTE_8 mobilephone;//手機號碼 BYTE_1 homeaddress[20];//家庭住址 BYTE_8 businessnumber;//公司電話 //指標域 struct _node *next; }Node; typedef struct _list { //頭節點 Node *head; }List; //建立連結串列 List *CreateList(void); //主介面的顯示 BOOL Menu(List *ls); //新增好友資訊、尾插 BOOL Add_Contact(List *ls); //列表好友資訊 BOOL Display_Contact(List *ls); //氣泡排序 BOOL Sort(List *ls); //搜尋好友:按姓名 BYTE_4 Search_Contact(List *ls); //刪除好友:按姓名 BOOL Delete_Contact(List *ls); //銷燬 void Destory(List *ls); #endif //_LINKLIST_H
III、
在“電子通訊錄”目錄下建立Makefile檔案
src1 = $(wildcard ./src/*.c)
obj1 = $(patsubst ./src/%.c, ./obj/%.o, $(src1))
target = ./bin/a.out
all:$(target)
$(target):$(obj1)
gcc $(^) -o $(@)
$(obj1):./obj/%.o:./src/%.c
gcc -c $(^) -I ./include -o $(@) -g
.PHONY:clean all
clean:
-rm -rf $(target) $(obj1)
3、測試結果
略