ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于链表实现的通讯录

基于链表实现的通讯录 基于结构体的链表思想struct person { char name[NAME_LENGTH]; char phone[PHONE_LENGTH]; struct person *next; struct person *prev; }; struct contacts { struct person *people; int count; };把第一个结构体抽象为一个方块方块内有数据和指针。第二个结构体抽象为方块的集合箭头代表指针.这样很好理解。分层思想自下而上1、宏定义实现链表的插入和删除。#define LIST_INSERT(item, list) do { \ item-prev NULL; \ item-next list; \ if ((list) ! NULL) (list)-prev item; \ (list) item; \ } while(0) #define LIST_REMOVE(item, list) do { \ if (item-prev ! NULL) item-prev-next item-next; \ if (item-next ! NULL) item-next-prev item-prev; \ if (list item) list item-next; \ item-prev item-next NULL; \ } while(0)2、接口定义实现通讯录成员的插入、删除、查找、遍历、文件保存、文件加载。int person_insert(struct person **ppeople, struct person *ps); int person_delete(struct person **ppeople, struct person *ps); struct person* person_search(struct person *people, const char *name); int person_traversal(struct person *people); int save_file(struct person *people, const char *filename); int load_file(struct person **ppeople, int *count, const char *filename);3、业务逻辑实现实现命令行交互式通讯录成员的插入、删除、查找、遍历、文件保存、文件加载。最后采用while和switch实现通讯录功能选择。int insert_entry(struct contacts *cts) { struct person *p (struct person*)malloc(sizeof(struct person)); memset(p, 0, sizeof(struct person)); scanf(%s, p-name); scanf(%s, p-phone); person_insert(cts-people, p) cts-count ; return 0; } int print_entry(struct contacts *cts) { person_traversal(cts-people); return 0; } int delete_entry(struct contacts *cts) { char name[NAME_LENGTH] {0}; scanf(%s, name); struct person *ps person_search(cts-people, name); person_delete(cts-people, ps); free(ps); return 0; } int search_entry(struct contacts *cts) { char name[NAME_LENGTH] {0}; scanf(%s, name); struct person *ps person_search(cts-people, name); INFO(name: %s,phone: %s\n, ps-name, ps-phone); return 0; } int save_entry(struct contacts *cts) { char filename[NAME_LENGTH] {0}; scanf(%s, filename); save_file(cts-people, filename); return 0; } int load_entry(struct contacts *cts) { char filename[NAME_LENGTH] {0}; scanf(%s, filename); load_file(cts-people, cts-count, filename); return 0; } int main() { struct contacts *cts (struct contacts *)malloc(sizeof(struct contacts)); if (cts NULL) return -1; memset(cts, 0, sizeof(struct contacts)); while (1) { menu_info(); int select 0; scanf(%d, select); switch (select) { case OPER_INSERT: insert_entry(cts); break; case OPER_PRINT: print_entry(cts); break; case OPER_DELETE: delete_entry(cts); break; case OPER_SEARCH: search_entry(cts); break; case OPER_SAVE: save_entry(cts); break; case OPER_LOAD: load_entry(cts); break; default: goto exit; } } exit: free(cts); return 0; }
返回列表