通讯录小项目(C语言动态版本)
来源:互联网 发布:图像处理算法 编辑:程序博客网 时间:2024/05/18 01:23
项目要求:
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 (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; } } }}
说明:
动态版本与上一篇静态版本格式基本相同,仅有代码方面不同,望读者在阅读两篇文章时,切记要擦亮眼睛:)。
阅读全文
0 0
- 通讯录小项目(C语言动态版本)
- 通讯录--C语言小项目
- c语言实现动态版本通讯录
- C语言编写—通讯录(小项目)
- 通讯录小项目(C语言静态版)
- C语言小项目制作之---通讯录
- 【c语言小项目】通讯录-文件版
- 【C语言】通讯录:动态开辟内存版和文件版本
- c语言通讯录项目
- c语言通讯录的简单实现文件版本(动态开辟内存)
- 通讯录(动态版本)
- 项目:通讯录(C语言的实现)
- c语言实现动态通讯录
- 【C语言】C语言实现动态通讯录
- C语言项目总结-通讯录
- C语言实现通讯录项目
- 通讯录——(C语言文件版本)
- 通讯录(C语言)
- js预解析
- LeetCode 150. Evaluate Reverse Polish Notation
- java集合框架
- React-Native中的flexbox布局的使用
- Java中的基础----堆与栈的介绍、区别
- 通讯录小项目(C语言动态版本)
- java注解
- 定位详解
- Java实现PDF打印的解决方案
- Android自定义可标记日历
- 用python中的itchat框架 筛选出 指定某个微信群中 是否还有你自己的好友 并列出来
- Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(一)-项目简述
- JavaScript并发模型
- 一次艰难的优化Codeforces contest/810/problem/C