菜鸟修炼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

  1. <pre name="code" class="cpp">#include <stdio.h> 
  2. #include "record.h" 
  3.  
  4. int menu_select(void); 
  5. void hand_menu(int cmd, ADDR *list_head); 
  6.  
  7. int main(int argc, char *argv[]) 
  8.     int cmd = 0
  9.     ADDR *list_head; 
  10.     ASK(list_head); 
  11.     list_head->next = NULL
  12.      
  13.     while(1){ 
  14.         cmd = menu_select(); 
  15.         if(cmd == '0') 
  16.             return 0; 
  17.              
  18.         hand_menu(cmd, list_head); 
  19.     } 
  20.  
  21. int menu_select(void) 
  22.     int select; 
  23.      
  24.     printf("    <------通信薄-------->\n"); 
  25.     printf("1:添加联系人     2:删除联系人\n"); 
  26.     printf("3:显示所有联系人   0:退出\n"); 
  27.     printf("请输入:\n"); 
  28.      
  29.     select = getch(); 
  30.     while(select  < '0'|| select>'3') { 
  31.         printf("输入错误,请重新输入:\n"); 
  32.         select = getch(); 
  33.     } 
  34.     return select; 
  35.  
  36. void hand_menu(int cmd, ADDR *list_head) 
  37.     switch(cmd){ 
  38.         case '1': 
  39.             add_person(list_head); 
  40.             break; 
  41.         case '2': 
  42.             list_head = del_person(list_head); 
  43.             break; 
  44.         case '3': 
  45.             dis_person(list_head); 
  46.             break; 
  47.         default: 
  48.             break; 
  49.     } 


 
 
2.2 record.h 

  1. <pre name="code" class="cpp">#ifndef _RECORD_H_ 
  2. #define _RECORD_H_ 
  3. typedef struct{ 
  4.     char name[8]; 
  5.     char tel[20]; 
  6. }DATA; 
  7.  
  8. typedef struct node{ 
  9.     DATA data; 
  10.     struct node *next; 
  11. }ADDR; 
  12.  
  13. #define ASK(p) do{\ 
  14.     p = (ADDR *)malloc(sizeof(ADDR));\ 
  15.     if(p==NULL){printf("malloc memory failed!");exit(-1);}\ 
  16. }while(0) 
  17.  
  18. #endif 

 
 
2.3 opre.c 

  1. <pre name="code" class="cpp">#include <stdio.h> 
  2. #include "record.h" 
  3.  
  4. void add_person(ADDR *node) 
  5.     ADDR *new_p; 
  6.     ASK(new_p); 
  7.     new_p->next = NULL
  8.      
  9.     printf("请输入姓名:"); 
  10.     scanf("%s", new_p->data.name); 
  11.     printf("请输入电话号码:"); 
  12.     scanf("%s", new_p->data.tel); 
  13.      
  14.     while(node->next) 
  15.         nodenode=node->next; 
  16.          
  17.     node->next = new_p
  18.  
  19. void del_person(ADDR *node) 
  20.     char name[8]; 
  21.     ADDR *pre = NULL
  22.      
  23.     printf("请输入要删除的名字:"); 
  24.     scanf("%s", name); 
  25.     while(node){ 
  26.         if(!strcmp(node->data.name, name)){ 
  27.             pre->next = node->next; 
  28.             free(node); 
  29.             printf("成功删除!\n"); 
  30.             return; 
  31.         } 
  32.         pre = node
  33.         nodenode = node->next; 
  34.     } 
  35.     printf("没有找到该名字!\n"); 
  36.  
  37. void dis_person(ADDR *node) 
  38.     if(!node) 
  39.         return ; 
  40.          
  41.     nodenode = node->next;    
  42.     dis_person(node); 
  43.     if(node) 
  44.         printf("姓名:%s号码:%s\n", node->data.name, node->data.tel);       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值