2、通讯录管理系统
编程实现通讯录管理系统,要求该系统能够完成通讯信息的建立、查询、插入、删除等基本功能。程序运行后至少给出下面7个菜单项的选择并分别实现其功能:
0、 通讯录的建立 1、通讯录信息输出
2、 通讯者结点信息的删除 3、通讯者结点信息的查询
4、 通讯者结点信息的插入 5、通讯录信息更改
6、 退出通讯录管理系统
设计的任务要求,通讯录中每个学生的基本信息应包括姓名、地址、电话等基本信息,采用链表存储结构。(复习c语言结构体和链表知识)
PS D:\code\gongda\she\she_z_2> tree /f 卷 软件 的文件夹 PATH 列表 卷序列号为 0007-DC50 D:. │ .cproject │ .project │ Makefile │ ├─include │ person.h │ personList.h │ └─src Main.c person.c personList.c PS D:\code\gongda\she\she_z_2>
//人定义
/** @file person.h * 功能:通讯录 人定义 * 作者:小代码 * 时间:2015年1月8日18:45:00 * */ #ifndef INCLUDE_PERSON_H_ #define INCLUDE_PERSON_H_ /** @struct 人结构体定义 * */ struct _person{ /** @brief 姓名 */ char name[10]; /** @brief 地址 */ char address[50]; /** @brief 电话 */ char phone[15]; /** @brief 向后指针域 */ struct _person * next; /** @brief 向前指针域 */ struct _person * pre; }; typedef struct _person person; typedef struct _person * personPtr; /** @brief 创建一个人 * * @param name 名字 * @param address 地址 * @param phone 电话 * @return 所创建的人对象的指针 */ personPtr person_create( char name[10], char address[50], char phone[15]); /** @brief 输出一个人的信息 * * @param p 要输出信息的人 * * @pre p p 不为空 * * @retval 0 输出成功 * @retval 1 输出失败 */ int person_print( personPtr p ); /** @brief 修改信息 * * 将p的属性与相应参数不同的修改 * * @param p 要修改信息的人 * @param name 名字 * @param address 地址 * @param phone 电话 * * @pre p 存在 * * @retval 0 修改成功 * @retval -1 修改失败 */ int person_modiry(personPtr p, char name[10], char address[50], char phone[15]); #endif /* INCLUDE_PERSON_H_ */
//人操作实现
/* * person.c * * Created on: 2015年1月8日 * Author: laolang */ #include"../include/person.h" #include<stdio.h> #include<stdlib.h> #include<string.h> /** @brief 创建一个人 * * @param name 名字 * @param address 地址 * @param phone 电话 * @return 所创建的人对象的指针 */ personPtr person_create( char name[10], char address[50], char phone[15]){ personPtr p = (personPtr)malloc(sizeof(person)); if( NULL == p ){ puts("动态分配内存失败...person_create...p"); exit(-1); } strcpy(p->name,name); strcpy(p->address,address); strcpy(p->phone,phone); p->next = NULL; p->pre = NULL; return p; } /** @brief 输出一个人的信息 * * @param p 要输出信息的人 * * @pre p p 不为空 * * @retval 0 输出成功 * @retval 1 输出失败 */ int person_print( personPtr p ){ if( NULL == p ){ puts("空指针...person_print...p"); return 1; } printf("%s\t%s\t%s\t\n",p->name,p->address,p->phone); return 0; } /** @brief 修改信息 * * 将p的属性与相应参数不同的修改 * * @param p 要修改信息的人 * @param name 名字 * @param address 地址 * @param phone 电话 * * @pre p 存在 * * @retval 0 修改成功 * @retval -1 修改失败 */ int person_modiry(personPtr p, char name[10], char address[50], char phone[15]){ int result = 0; if( NULL == p ){ result = -1; return result; } if( strcmp(p->name,name)){ strcpy(p->name,name); puts("已更新名字!"); } if( strcmp(p->address,address)){ strcpy(p->address,address); puts("已更新地址!"); } if( strcmp(p->phone,phone)){ strcpy(p->phone,phone); puts("已更新电话!"); } return result; }
//链表定义
/** @file personList.h * 功能:通讯录链表定义 * 作者:小代码 * 时间:2015年1月8日19:06:35 * */ #ifndef INCLUDE_PERSONLIST_H_ #define INCLUDE_PERSONLIST_H_ #include"../include/person.h" #include<string.h> /** @struct 通讯录链表定义 * */ struct _personList { /** @brief 头结点 */ personPtr head; /** @brief 尾结点 */ personPtr last; /** @brief 链表长度 */ int len; }; typedef struct _personList plist; typedef struct _personList * plistPtr; /** @brief 创建链表 * * @return 所创建的链表 */ plistPtr plist_create(); /** @brief 向链表中添加元素 * * @param list 要添加元素的链表 * @param p 要添加的元素 * * @pre 链表 list 存在 p 不为空 * * @retval 0 添加成功 * @retval -1 添加失败 */ int plist_append(plistPtr list, personPtr p); /** @brief 判断链表是否为空 * * @param list 要判断的链表 * * @pre 链表 list 存在 * * @retval 1 为空 * @retval 0 不为空 * @retval -1 链表不存在 */ int plist_is_empty(plistPtr list); /** @brief 输出链表 * * @param list 要输出的链表 * * @pre 链表 list 存在 且不为空 * * @retval 0 输出成功 * @retval -1 输出失败 */ int plist_print(plistPtr list); /** @brief 根据名字在链表中查找,若存在,则返回指向其的指针 * * @param list 链表 * @param name 名字 * * @pre 链表 list 存在 且不为空 * * @return 所查找的元素的指针 * @retval NULL 查找失败 */ personPtr plist_search_name(plistPtr list, char name[10]); /** @brief 根据名字删除信息 * * @param list 链表 * @param name 名字 * * @pre 链表存在且不为空,name存在于链表中 * * @retval 0 删除成功 * @retval -1 链表中无姓名为 name 的人 * @retval -2 链表为空或不存在 */ int plist_delete_name( plistPtr list, char name[10]); #endif /* INCLUDE_PERSONLIST_H_ */
//链表操作实现
/* * personList.c * * Created on: 2015年1月8日 * Author: laolang */ #include"../include/personList.h" #include"../include/person.h" #include<stdlib.h> #include<stdio.h> /** @brief 创建链表 * * @return 所创建的链表 */ plistPtr plist_create() { plistPtr list = (plistPtr) malloc(sizeof(plist)); if ( NULL == list) { puts("动态分配内存失败...plist_create...list"); exit(-1); } list->head = person_create("", "", ""); list->last = person_create("", "", ""); list->head->pre = NULL; list->head->next = list->last; list->last->pre = list->head; list->last->next = NULL; list->len = 0; return list; } /** @brief 向链表中添加元素 * * @param list 要添加元素的链表 * @param p 要添加的元素 * * @pre 链表 list 存在 p 不为空 * * @retval 0 添加成功 * @retval -1 添加失败 */ int plist_append(plistPtr list, personPtr p) { if ( NULL == list || NULL == p) { return -1; } // p->pre = list->last->pre; // p->next = list->last; // list->last->next = p; // list->last->pre = p; list->last->pre->next = p; p->pre = list->last->pre; p->next = list->last; list->last->pre = p; list->len++; return 0; } /** @brief 判断链表是否为空 * * @param list 要判断的链表 * * @pre 链表 list 存在 * * @retval 1 为空 * @retval 0 不为空 * @retval -1 链表不存在 */ int plist_is_empty(plistPtr list) { int result = 0; if ( NULL == list) { result = -1; return result; } if ( list->last == list->head->next) { result = 1; return result; } return result; } /** @brief 输出链表 * * @param list 要输出的链表 * * @pre 链表 list 存在 且不为空 * * @retval 0 输出成功 * @retval -1 输出失败 */ int plist_print(plistPtr list) { // puts("开始输出"); int result = -1; if (plist_is_empty(list)) { return result; } personPtr t = list->head->next; while (t != list->last) { person_print(t); t = t->next; } result = 0; return result; } /** @brief 根据名字在链表中查找,若存在,则返回指向其的指针 * * @param list 链表 * @param name 名字 * * @pre 链表 list 存在 且不为空 * * @return 所查找的元素的指针 * @retval NULL 查找失败 */ personPtr plist_search_name(plistPtr list, char name[10]) { personPtr t = NULL; if (plist_is_empty(list)) { return t; } personPtr p = list->head->next; while (p != list->last) { if (!strcmp(p->name, name)) { t = p; break; } p = p->next; } return t; } /** @brief 根据名字删除信息 * * @param list 链表 * @param name 名字 * * @pre 链表存在且不为空,name存在于链表中 * * @retval 0 删除成功 * @retval -1 链表中无姓名为 name 的人 * @retval -2 链表为空或不存在 */ int plist_delete_name(plistPtr list, char name[10]) { int result = 0; personPtr p = NULL; if ( NULL == list || plist_is_empty(list)) { result = -2; return result; } if (!(p = plist_search_name(list, name))) { result = -1; return result; } p->pre->next = p->next; p->next->pre = p->pre; free(p); return result; }
//主文件
/* * Main.c * * Created on: 2015年1月8日 * Author: laolang */ #include"../include/person.h" #include"../include/personList.h" #include<stdio.h> #include<stdlib.h> int menu() { int select = 0; puts("\n0-建立通讯录\t\t\t1-通讯录信息输出"); puts("2-通讯者结点信息删除\t\t3-通讯者结点信息查询"); puts("4-通讯者结点信息插入\t\t5-通讯者信息更改"); puts("6-退出通讯录管理系统"); printf("输入选择:"); scanf("%d", &select); while (select < 0 || select > 6) { puts("请输入0-6的整数"); printf("输入选择:"); scanf("%d", &select); } return select; } int main(void) { int select = menu(); plistPtr list = NULL; while (1) { switch (select) { case 0: { if ((list = plist_create())) { puts("通讯录建立成功!"); } break; } case 1: { if (1 == plist_is_empty(list)) { puts("通讯录中没有任何信息!"); } else { plist_print(list); } break; } case 2: { char name[10]; printf("输入要删除的人的名字:"); scanf("%s", name); int result = plist_delete_name(list, name); if (!result) { puts("删除成功!"); } else if (-1 == result) { puts("通讯录中无此人信息"); } break; } case 3: { char name[10]; printf("输入要查询的人的名字:"); scanf("%s", name); personPtr p = plist_search_name(list, name); if (p) { person_print(p); } else { puts("查无此人!"); } break; } case 4: { char name[10]; char address[50]; char phone[15]; printf("输入名字:"); scanf("%s", name); printf("输入地址:"); scanf("%s", address); printf("输入电话:"); scanf("%s", phone); personPtr p = person_create(name, address, phone); if (!plist_append(list, p)) { puts("添加成功!"); } else { puts("添加失败!"); } break; } case 5: { char name[10]; char address[50]; char phone[15]; char ch = 0; // int ch = 0; printf("输入要更改信息的人的名字:"); scanf("%s", name); personPtr p = plist_search_name(list, name); if ( NULL == p) { puts("查无此人!"); } else { printf("是否修改名字[y/n]:"); getchar(); scanf("%c", &ch); // printf("ch = %c\n", ch); if ('y' == ch || 'Y' == ch) { printf("输入新的名字:"); scanf("%s", name); } printf("是否修改地址[y/n]:"); getchar(); ch = getchar(); // printf("ch = %c\n", ch); if ('y' == ch || 'Y' == ch) { printf("输入新的地址:"); scanf("%s", address); } printf("是否修改电话[y/n]:"); getchar(); ch = getchar(); // printf("ch = %c\n", ch); if ('y' == ch || 'Y' == ch) { printf("输入新的电话:"); scanf("%s", phone); } if (!person_modiry(p, name, address, phone)) { puts("修改成功!"); } else { puts("修改失败!"); } } break; } case 6: { puts("谢谢使用!!!"); puts("正在退出..."); puts("已退出"); exit(-1); break; } } select = menu(); } printf("\n\nHello World\n"); return 0; }
# 功能:工大通讯录 # # 作者:小代码 # # 时间:2015年1月8日18:56:54 # # # # program=test.exe CC=gcc CFLAGS=-Wall -I include RM=del vpath %.h include vpath %.c src DIR:=$(wildcard *.c ./src/*.c) SOURS:=$(notdir $(DIR)) OBJS:=$(patsubst %.c,%.o,$(SOURS)) all:$(program) $(program):$(OBJS) $(CC) -o $@ $^ Main.o:person.h personList.h person.o:person.h personList.o:personList.h .PHNOY:clean run list clean: -$(RM) $(program) $(OBJS) run: ./$(program) list: @echo $(DIR) @echo $(SOURS) @echo $(OBJS)