菜鳥修煉C語言小設計之——通訊錄(一)

這次的設計用到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);		
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章