這次的設計用到C語言的單向鏈表實現。
包括的C語言重點知識有
1.typedef的使用
2.自定義宏的使用
3.單向鏈表的實現和操作
1.1 設計題目
本課程設計的目的是學習建立鏈表,使用鏈表存儲結構信息,增加鏈表結點及刪除鏈表結點等基本操作。實際設計時,可增加數據信息及檢索等功能。
1.2 設計要求
1.2.1 功能設計要求
本設計要求實現如下功能:
(1)本設計將重點放在整體設計上,信息只選成員代號和電話。
(2)如果已經有記錄,只能在其後追加。
(3)顯示整個記錄的內容(含新追加的新記錄)。
(4)使代號可由6位字符和數字的混合編碼組成,如:A201,34011D等。
(5)使電話號碼可由18位字符和數字組成,如(86)-551-34443535,1396786678等。
(6)可以刪除全部記錄,可以隨時增加新記錄。
(7)可以使用菜單實現增加、刪除和顯示等功能的選擇。
(8)使用宏定義動態申請存儲空間。
1.2.2 總體設計
本設計對模塊設計的要求如下:
(1)要求使用多文件方式實現鏈表設計。
(2)要求將它們分成3個模塊編制。一個模塊負責輸入;一個模塊負責顯示記錄的內容;一個模塊含有主程序,主程序負責菜單選擇和命令處理。
2.設計代碼
2.1main.c
#include <stdio.h> #include "record.h" int menu_select(void); void hand_menu(int cmd, ADDR *list_head); int main(int argc, char *argv[]) { int cmd = 0; ADDR *list_head; ASK(list_head); list_head->next = NULL; while(1){ cmd = menu_select(); if(cmd == '0') return 0; hand_menu(cmd, list_head); } } int menu_select(void) { int select; printf(" <------通信薄-------->\n"); printf("1:添加聯繫人 2:刪除聯繫人\n"); printf("3:顯示所有聯繫人 0:退出\n"); printf("請輸入:\n"); select = getch(); while(select < '0'|| select>'3') { printf("輸入錯誤,請重新輸入:\n"); select = getch(); } return select; } void hand_menu(int cmd, ADDR *list_head) { switch(cmd){ case '1': add_person(list_head); break; case '2': list_head = del_person(list_head); break; case '3': dis_person(list_head); break; default: break; } }
2.2 record.h
#ifndef _RECORD_H_ #define _RECORD_H_ typedef struct{ char name[8]; char tel[20]; }DATA; typedef struct node{ DATA data; struct node *next; }ADDR; #define ASK(p) do{\ p = (ADDR *)malloc(sizeof(ADDR));\ if(p==NULL){printf("malloc memory failed!");exit(-1);}\ }while(0) #endif
2.3 opre.c
#include <stdio.h> #include "record.h" void add_person(ADDR *node) { ADDR *new_p; ASK(new_p); new_p->next = NULL; printf("請輸入姓名:"); scanf("%s", new_p->data.name); printf("請輸入電話號碼:"); scanf("%s", new_p->data.tel); while(node->next) node=node->next; node->next = new_p; } void del_person(ADDR *node) { char name[8]; ADDR *pre = NULL; printf("請輸入要刪除的名字:"); scanf("%s", name); while(node){ if(!strcmp(node->data.name, name)){ pre->next = node->next; free(node); printf("成功刪除!\n"); return; } pre = node; node = node->next; } printf("沒有找到該名字!\n"); } void dis_person(ADDR *node) { if(!node) return ; node = node->next; dis_person(node); if(node) printf("姓名:%s號碼:%s\n", node->data.name, node->data.tel); }