通讯录小项目(C语言动态版本)
2017-05-24 02:16
441 查看
项目要求:
1、通讯录采用动态分配空间方式存储个人的信息,每个人的信息包括:`姓名、性别、年龄、电话、住址`。 2、通讯录基本要求如下: a、添加联系人信息 b、删除指定联系人信息 c、查找指定联系人信息 d、修改指定联系人信息 e、显示所有联系人信息 f、清空所有联系人 g、以名字排序所有联系人
思路框图:
test.c:
#include"address_list.h" struct list *address_list()//通讯录主函数 { ADDRESS con; int input = 0; init(&con); do { menu2(); printf("请选择:>"); scanf("%d", &input); switch (input) { case EXIT: break; case ADD: system("CLS"); add(&con); break; case DELE: system("CLS"); dele(&con); break; case SEARCH: system("CLS"); search(&con); break; case MODIFY: system("CLS"); modify(&con); break; case SHOW: system("CLS"); show(&con); break; case CLEAR: system("CLS"); clear(&con); break; case SORT: system("CLS"); sort(&con); break; default: printf("输入有误,请重新输入!\n"); break; } } while (input); return con.pcon;//返回动态开辟内存地址 } void menu1() { printf("***********************\n"); printf("**** 0.EXIT 1.OPEN ****\n"); printf("***********************\n"); } void test()//测试函数 { int input = 0; struct list *ret = NULL;//用来接收通讯录主函数返回的动态开辟内存地址 do { menu1(); printf("请选择:>"); scanf("%d", &input); switch e18a (input) { case 0: break; case 1: system("CLS"); ret = address_list();//通讯录主函数 break; default: printf("输入有误,请重新输入!\n"); break; } } while (input); free(ret);//释放通讯录主函数内部动态开辟的内存空间,当程序没有彻底退出时,第二次进入通讯录主函数时第一次的结果仍保留。 } int main() { test();//测试函数 return 0; }
address_list.h:
#ifndef __ADDRESS_LIST_H__ #define __ADDRESS_LIST_H__ #define _CRT_SECURE_NO_WARNINGS 1 // 功能函数: //1. 添加联系人信息 //2. 删除指定联系人信息 //3. 查找指定联系人信息 //4. 修改指定联系人信息 //5. 显示所有联系人信息 //6. 清空所有联系人 //7. 以名字排序所有联系人 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> #define NAME_MAX 13//最大姓名长度 #define SEX_MAX 6//最大性别长度 #define PHONE_MAX 12//最大电话位数长度 #define ADDRESS_MAX 12//最大地址长度 #define INCREASE 10//每次增加元素个数 struct list//每个联系人数据结构 { char name[NAME_MAX]; char sex[SEX_MAX]; int age; char phone[PHONE_MAX]; char address[ADDRESS_MAX]; }; typedef struct//整个通讯录结构 { struct list *pcon; int stock;// stock库存 int depot;// depot仓库 }ADDRESS,*PADDRESS; enum { EXIT, ADD, DELE, SEARCH, MODIFY, SHOW, CLEAR, SORT }; void menu2();//通讯录功能菜单函数 void init(PADDRESS plist);//初始化函数 void add(PADDRESS plist);//添加函数 void dele(PADDRESS plist);//删除函数 void search(PADDRESS plist);//查找函数 void modify(PADDRESS plist);//修改函数 void show(PADDRESS plist);//显示函数 void clear(PADDRESS plist);//清空函数 void sort(PADDRESS plist);//查找函数 #endif//__ADDRESS_LIST_H__
address_list.c:
#include"address_list.h" void menu2()//功能菜单函数实现 { printf("*********************************\n"); printf("**** 0.EXIT 1.ADD *****\n"); printf("**** 2.DELETE 3.SEARCH *****\n"); printf("**** 4.MODIFY 5.SHOW *****\n"); printf("**** 6.CLEAR 7.SORT *****\n"); printf("*********************************\n"); } void init(PADDRESS plist)//初始化函数实现 { plist->pcon = (struct list *)malloc(sizeof(struct list)*INCREASE); assert(plist->pcon != NULL); plist->stock = 0; plist->depot = INCREASE; } static int hunt(PADDRESS plist,const char *pname)//各功能函数公用搜索模块 { int i = 0; for (i = 0; i < plist->stock; i++) { if (strcmp((plist->pcon+i)->name,pname) == 0) { return i; } } return -1; } void add(PADDRESS plist)//添加函数实现 { if (plist->stock == plist->depot) { struct list *tmp = (struct list *)realloc(plist->pcon, (plist->depot + INCREASE)*sizeof(struct list)); if (tmp == NULL) { printf("Memory allot flunk!\n"); return; } else { plist->pcon = tmp; plist->depot += INCREASE; goto flag; } } else { flag: printf("请输入姓名:>"); scanf("%s", (plist->pcon + plist->stock)->name); printf("请输入性别:>"); scanf("%s", (plist->pcon + plist->stock)->sex); printf("请输入年龄:>"); scanf("%d", &((plist->pcon + plist->stock)->age)); printf("请输入电话:>"); scanf("%s", (plist->pcon + plist->stock)->phone); printf("请输入地址:>"); scanf("%s", (plist->pcon + plist->stock)->address); plist->stock++; printf("添加成功!\n"); } } void dele(PADDRESS plist)//删除函数实现 { char tmp[NAME_MAX] = { 0 }; int ret = 0; printf("请输入要删除联系人姓名:>"); scanf("%s", tmp); ret = hunt(plist, tmp); if (ret == -1) { printf("未找到所要删除联系人!\n"); } else { for (; ret < plist->stock-1; ret++) { *(plist->pcon + ret) = *(plist->pcon + ret + 1); } plist->stock--; printf("删除成功!\n"); } } void search(PADDRESS plist)//查找函数实现 { char tmp[NAME_MAX] = { 0 }; int ret = 0; printf("请输入要查找联系人姓名:>"); scanf("%s", tmp); ret = hunt(plist, tmp); if (ret == -1) { printf("Not find contact!\n"); } else { printf("Contact subscript is: %d\n", ret + 1); } } void modify(PADDRESS plist)//修改函数实现 { char tmp[NAME_MAX] = { 0 }; int ret = 0; printf("请输入要修改联系人姓名:>"); scanf("%s", tmp); ret = hunt(plist, tmp); if (ret == -1) { printf("未找到此联系人!\n"); } else { printf("请输入姓名:>"); scanf("%s", (plist->pcon + ret)->name); printf("请输入性别:>"); scanf("%s", (plist->pcon + ret)->sex); printf("请输入年龄:>"); scanf("%d", &((plist->pcon + ret)->age)); printf("请输入电话:>"); scanf("%s", (plist->pcon + ret)->phone); printf("请输入地址:>"); scanf("%s", (plist->pcon + ret)->address); printf("修改成功!\n"); } } void show(PADDRESS plist)//显示函数实现 { int i = 0; printf("%-13s %-6s %-3s %-12s %-12s\n", "NAME", "SEX", "AGE", "PHONE", "ADDRESS"); for (i = 0; i < plist->stock; i++) { printf("%-13s %-6s %-3d %-12s %-12s\n", (plist->pcon + i)->name, (plist->pcon + i)->sex, (plist->pcon + i)->age, (plist->pcon + i)->phone, (plist->pcon + i)->address); } } void clear(PADDRESS plist)//清空函数实现 { plist->pcon = NULL; plist->depot = 0; plist->stock = 0; } void sort(PADDRESS plist)//排序函数实现(冒泡排序) { struct list tmp = { 0 }; int i = 0; for (i = 0; i < plist->stock - 1; i++) { int j = 0; for (j = 0; j < plist->stock - 1 - i; j++) { if (strcmp((plist->pcon + j)->name, (plist->pcon + j + 1)->name) > 0) { tmp = *(plist->pcon + j); *(plist->pcon + j) = *(plist->pcon + j + 1); *(plist->pcon + j + 1) = tmp; } } } }
说明:
动态版本与上一篇静态版本格式基本相同,仅有代码方面不同,望读者在阅读两篇文章时,切记要擦亮眼睛:)。
相关文章推荐
- c语言实现动态版本通讯录
- C语言小项目:动态通讯录和静态通讯录的实现
- 【c语言】通讯录的简单实现文件版本(动态开辟内存)
- 【C语言】通讯录:动态开辟内存版和文件版本
- 用C语言实现通讯录文件存储的版本
- C语言编写—通讯录(小项目)
- 通讯录动态开辟版本
- C语言实现通讯录系统——容量自增,文件版本
- C语言通讯录,动态增长版,联系人增删查找,排序,显示,信息存入文件
- 通讯录c语言实现(动态内存开辟&文件存储)
- 将结构体实现的简易通讯录改成动态的版本
- 实现动态版本通讯录(在简易通讯录的基础上)
- c语言实现动态通讯录
- 【C语言小练习】约瑟夫环游戏的动态演示版本
- 【C语言】C语言实现动态通讯录
- 动态的文件版本的通讯录
- 通讯录(动态版本)
- C语言项目总结-通讯录
- Juno版本的Eclipse才支持将Maven的webapp项目转换成3.0版本的动态网页模板吗?
- JCVideoPlayer朋友圈动态多item视频播放以及使用compile 'fm.jiecao:jiecaovideoplayer:5.5.2'版本在项目中出现的各种异常处理