【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;}


原创粉丝点击