【C】动态内存开辟(2)——动态内存开辟实例!!!
来源:互联网 发布:如何看待网络暴力 编辑:程序博客网 时间:2024/06/05 19:04
//contact.h文件
#ifndef __CONTACT_H__ #define __CONTACT_H__ #include<stdio.h> #include <stdlib.h>#include <assert.h>#include <string.h>//#define MAX 1000 #define NAME_MAX 20 #define SEX_MAX 5 #define ADDR_MAX 30 #define TELE_MAX 12 #define CONTACT_ADD 2#define CONTACT_MAX 3#define FILE_NAME "contact.dat"typedef struct PeoInfo //定义一个通讯录结构体{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char addr[ADDR_MAX]; char tele[TELE_MAX]; }PeoInfo;typedef struct Contact //维护通讯录的结构体{ PeoInfo *data; int sz; //通讯录的上限int capacity; //每次增容的个数
}Contact, *pContact; static CheckCapacity(pContact pcon);void InitContact(pContact pcon); void AddContact(pContact pcon); void ShowContact(const pContact pcon); void DelContact(pContact pcon); void SearchContact(pContact pcon); void ModifyContact(pContact pcon); void SortContach(pContact pcon); void ClearContact(pContact pcon); void SaveContactData(pContact pcon);void LoadContactData(pContact pcon);#endif
//contact.c文件
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(pContact pcon) //增容函数{int i = 0;pcon->data = malloc(CONTACT_MAX*sizeof(PeoInfo));if (pcon->data == NULL){printf("error malloc:\n");exit(EXIT_FAILURE);}pcon->sz = 0;for (i=0;i<pcon->sz;i++){memset(&(pcon->data[i]),0,sizeof(pcon->data[i]));}pcon->capacity = CONTACT_MAX;LoadContactData(pcon);}static CheckCapacity(pContact pcon){if (pcon->sz == pcon->capacity){PeoInfo* ptr = realloc(pcon->data,(pcon->capacity+CONTACT_ADD)*sizeof(PeoInfo));if (ptr == NULL){printf("error realloc:\n");exit(EXIT_FAILURE);}else{pcon->data = ptr;pcon->capacity = pcon->capacity+CONTACT_ADD;printf("realloc success\n");}}}void AddContact(pContact pcon){CheckCapacity(pcon);printf("name:");scanf("%s",pcon->data[pcon->sz].name);printf("sex:"); scanf("%s",pcon->data[pcon->sz].sex);printf("addr:");scanf("%s",pcon->data[pcon->sz].addr);printf("age:");scanf("%d",&pcon->data[pcon->sz].age);printf("tele:");scanf("%s",pcon->data[pcon->sz].tele);printf("添加成功!!!\n");(pcon->sz)++;}void _Add(pContact pcon,PeoInfo *tmp){CheckCapacity(pcon);pcon->data[pcon->sz] = *tmp;pcon->sz++;}void LoadContactData(pContact pcon){FILE* pf = fopen(FILE_NAME, "r");PeoInfo tmp = {0};while(fread(&tmp, sizeof(PeoInfo), 1, pf)){_Add(pcon, &tmp);}}void SaveContactData(pContact pcon){int i = 0;FILE *fp = fopen(FILE_NAME,"w");if ((fp == NULL)){perror("Open file error!\n");exit(EXIT_FAILURE);}for (i=0;i<pcon->sz;i++){fwrite(pcon->data+i, sizeof(PeoInfo), 1, fp);}fclose(fp);}void ShowContact(const pContact pcon){int i = 0;for (i=0;i<pcon->sz;i++){printf("name:%s\n",pcon->data[i].name);printf("sex:%s\n",pcon->data[i].sex);printf("age:%d\n",pcon->data[i].age);printf("addr:%s\n",pcon->data[i].addr);printf("tele:%s\n",pcon->data[i].tele);}}void ModifyContact(pContact pcon){int i = 0;char name[20] = { 0 };printf("请输入要修改的姓名:");scanf("%s",name);for (i=0;i<=pcon->sz;i++){if (strcmp(name, pcon->data[i].name) == 0){printf("name:");scanf("%s", pcon->data[i].name);printf("sex:");scanf("%s", pcon->data[i].sex);printf("age:");scanf("%d", &pcon->data[i].age);printf("addr:");scanf("%s", pcon->data[i].addr);printf("tele:");scanf("%s", pcon->data[i].tele);printf("修改成功!\n");break;}}}void DelContact(pContact pcon){char name1[20] = { 0 };int i = 0;int j = 0;printf("请输入要删除的姓名:");scanf("%s",name1);for (i=0;i<pcon->sz;i++){if (strcmp(pcon->data[i].name,name1)==0){for (j = i; j<pcon->sz; j++){pcon->data[j] = pcon->data[j + 1];}pcon->sz--;printf("删除成功!!!");break;}else{printf("没有此联系人!!\n");break;}}}void SearchContact(pContact pcon){int i = 0;char name[20] = { 0 };printf("请输入要查找的姓名:");scanf("%s",name);for (i=0;i<pcon->sz;i++){if (strcmp(name, pcon->data[i].name) == 0){printf("%s\n", pcon->data[i].name);printf("%s\n", pcon->data[i].sex);printf("%s\n", pcon->data[i].addr);printf("%s\n", pcon->data[i].tele);printf("%d\n", pcon->data[i].age);break;}else{printf("没有找见!\n");break;}}}void SortContach(pContact pcon){int i = 0;int j = 0;char name[5] = {0};for (i=0;i<pcon->sz-1;i++){for (j=i;j<pcon->sz-i-1;j++){if(strcmp(pcon->data[j].name,pcon->data[j+1].name)>0){PeoInfo tmp = pcon->data[j];pcon->data[j] = pcon->data[j + 1];pcon->data[j + 1] = tmp;}}}printf("排序成功!!!");}void ClearContact(pContact pcon){int i = 0;pcon->sz = 0;for (i=0;i<pcon->sz;i++){memset(&(pcon->data[i]),0,sizeof(pcon->data[i]));}printf("清除成功!!!\n");}
//test.c文件
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu(){printf("***************************************************************\n");printf("******* 1.add 2.show **********\n");printf("******* 3.delete 4.search **********\n");printf("******* 5.modify 6.sort **********\n");printf("******* 7.clear 0.exit **********\n");printf("***************************************************************\n");}int main(){int input = 0;Contact con;InitContact(&con);do{menu();printf("输入序号:");scanf("%d",&input);switch (input){case 1:AddContact(&con);break;case 2:ShowContact(&con);break;case 3:DelContact(&con);break;case 4:SearchContact(&con);break;case 5:ModifyContact(&con);break;case 6:SortContach(&con);break;case 7:ClearContact(&con);break;default:SaveContactData(&con);exit(EXIT_SUCCESS);}} while (1);return 0;}
阅读全文
1 0
- 【C】动态内存开辟(2)——动态内存开辟实例!!!
- 动态内存开辟(c)
- c语言动态开辟内存
- c语言动态开辟内存
- c语言动态内存开辟
- 【C】简单动态内存开辟(1)!!
- (C语言)动态内存开辟
- 动态开辟内存总结
- 动态内存开辟
- 动态内存开辟
- 动态内存开辟
- c++动态内存开辟
- 动态内存开辟
- 通讯录动态版(动态内存开辟)
- c语言实现通讯录(动态内存开辟)
- 顺序表(动态开辟内存)
- 动态内存开辟(malloc calloc realloc)
- 二维数组动态开辟内存
- Ubuntu mirror source modify
- 使用列表渲染wx-for改写新闻列表
- C++之尽可能延后定义式的出现时间(26)---《Effective C++》
- 图片水平垂直居中对齐
- STL中vector/map/set实现原理
- 【C】动态内存开辟(2)——动态内存开辟实例!!!
- Ajax技术--多级联动下拉列表($.ajax())
- Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance(info)
- offer面试题-----链表反转
- shell趣味编程:case语句判断字符串内容
- hdu1048 The Hardest Problem Ever(C语言)
- 清除微信浏览器缓存
- JS 中关于this 执行环境的问题_part1
- java面向对象