c语言实现动态通讯录
1、实现动态开辟内存
2、实现简单的增删查改、清空、保存等功能
contact.h文件
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _CONTACT__H_
#define _CONTACT__H_
#define name_MAX 20
#define Sex_MAX 10
#define Tele_MAX 12
#define Addr_MAX 20
#define member_MAX 2
#define DEFAULT_ADD 2
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
typedef struct Stu
{
char name[name_MAX];
int age;
char Sex[Sex_MAX];
char Tele[Tele_MAX];
char Addr[Addr_MAX];
}Stu,*pStu;
typedef struct Contact
{
pStu con;
int count;
int capacity;
}Contact,*pContact;
void InitContact( pContact pcon );
void ADD_contact(pContact pcon);
void DEL_contact(pContact pcon);
void SHOW_contact(pContact pcon);
void EMPTY_contact(pContact pcon);
void SEARCH_contact(pContact pcon);
void MODIFY_contact(pContact pcon);
void SORT_contact(pContact pcon);
void EXIT_Contact(pContact pcon);
void cheickCapacity(pContact pcon);
void Read_Contact(pContact pcon);
void Save_Contact(pContact pcon);
#endif
contact.c文件
#include "contact.h"
void cheickCapacity(pContact pcon)
{
if(pcon->count == pcon->capacity)
{
pStu pre = (pStu)realloc(pcon->con,(pcon->capacity+DEFAULT_ADD)*sizeof(Stu));
if(pre!=NULL)
{
pcon->con = pre;
pcon->capacity = pcon->capacity + DEFAULT_ADD;
}
printf("增容成功\n");
}
}
void Read_Contact(pContact pcon)
{
Stu temp;
int i = 0;
FILE * pfread = fopen("test.txt","r");
if(pfread == NULL)
{
perror("fopen");
return ;
}
while(1)
{
fread(&temp,sizeof(Stu),1,pfread);
if(feof(pfread)!=0)//feof检测文件是否结束,文件结束返回非0值,否则返回0
{
break;
}
cheickCapacity(pcon);
pcon->con[pcon->count++] = temp;
}
fclose(pfread);
}
void InitContact(pContact pcon)
{
pcon->con = (pStu)malloc(member_MAX*sizeof(Stu));
if(pcon->con==NULL)
{
printf("out of memery");
exit(EXIT_FAILURE);
}
pcon->count = 0;
pcon->capacity = member_MAX;
memset(pcon->con,0,member_MAX*sizeof(Stu));
Read_Contact(pcon);
}
void ADD_contact(pContact pcon)
{
cheickCapacity(pcon);
printf("请输入姓名:>");
scanf("%s",(pcon->con+pcon->count)->name);
printf("请输入年龄:>");
scanf("%d",&(pcon->con+pcon->count)->age);
printf("请输入性别:>");
scanf("%s",(pcon->con+pcon->count)->Sex);
printf("请输入电话:>");
scanf("%s",(pcon->con+pcon->count)->Tele);
printf("请输入地址:>");
scanf("%s",(pcon->con+pcon->count)->Addr);
pcon->count++;
system("cls");
}
static int Find_member(pContact pcon,char name[name_MAX])
{
int i = 0;
for(i=0;i<pcon->count;i++)
{
if(strcmp((pcon->con+i)->name,name) == 0)
{
return i;
}
}
return -1;
}
void DEL_contact(pContact pcon)
{
char name[name_MAX] = {0};
int temp = 0;
int i = 0;
printf("请输入您要删除的姓名:>");
scanf("%s",name);
temp = Find_member(pcon,name);
if(temp!=-1)
{
for(i=temp;i<pcon->count;i++)
{
pcon->con[i] = pcon->con[i+1];
pcon->count--;
}
printf("删除成功!");
}
else
{
printf("您所删除的人不存在!\n");
}
system("cls");
}
void SHOW_contact(pContact pcon)
{
int i = 0;
printf("姓名\t年龄\t性别\t电话\t\t住址\n");
for(i=0;i<pcon->count;i++)
{
printf("%s\t%d\t%s\t%s\t\t%s\n",(pcon->con+i)->name,
(pcon->con+i)->age,
(pcon->con+i)->Sex,
(pcon->con+i)->Tele,
(pcon->con+i)->Addr );
}
}
void EMPTY_contact(pContact pcon)
{
pcon->count = 0;
}
void SEARCH_contact(pContact pcon)
{
char name[name_MAX] = {0};
int temp = 0;
printf("请输入您要查找的姓名:>");
scanf("%s",name);
temp = Find_member(pcon,name);
if(temp != -1)
{
printf("%12s\t%3d\t%5s\t%12s\t%10s\n",(pcon->con+temp)->name,
(pcon->con+temp)->age,
(pcon->con+temp)->Sex,
(pcon->con+temp)->Tele,
(pcon->con+temp)->Addr );
}
else
{
printf("您所查找的人不存在。\n");
}
system("cls");
}
void MODIFY_contact(pContact pcon)
{
char name[name_MAX] = {0};
int temp = 0;
printf("请输入您所要更改信息的姓名:>");
scanf("%s",name);
temp = Find_member(pcon,name);
if(temp != -1)
{
printf("请输入要更改的姓名:>");
scanf("%s",(pcon->con+temp)->name );
printf("请输入要更改的年龄:>");
scanf("%d",&(pcon->con+temp)->age);
printf("请输入要更改的性别:>");
scanf("%s",(pcon->con+temp)->Sex);
printf("请输入要更改的电话:>");
scanf("%s",(pcon->con+temp)->Tele);
printf("请输入要更改的地址:>");
scanf("%s",(pcon->con+temp)->Addr);
printf("更改成功!");
}
else
{
printf("您要更改的人不存在。\n");
}
system("cls");
}
void SORT_contact(pContact pcon)
{
Stu str;
int i = 0;
int j = 0;
for(i=0;i<pcon->count-1;i++)
{
for(j=0;j<pcon->count-1;j++)
{
if(strcmp(pcon->con[j].name,pcon->con[j+1].name)>0)
{
str = pcon->con[j];
pcon->con[j] = pcon->con[j+1];
pcon->con[j+1] = str;
}
}
}
system("cls");
}
void Save_Contact(pContact pcon)
{
FILE* pfwrite = fopen("test.txt","w");
int i = 0;
if(pfwrite == NULL)
{
perror("Save");
return;
}
for(i=0;i<pcon->count;i++)
{
fwrite(pcon->con+i,sizeof(Stu),1,pfwrite);
}
fclose(pfwrite);
}
void EXIT_Contact(pContact pcon)
{
Save_Contact(pcon);
free(pcon->con);
pcon->con = NULL;
pcon->capacity = 0;
pcon->count = 0;
}
test.c文件
#include "contact.h"
#include <conio.h>
#include <windows.h>
void mnue()
{
printf("**************************************\n");
printf("** 1.增加 **\n");
printf("** 2.删除 **\n");
printf("** 3.查找 **\n");
printf("** 4.更改 **\n");
printf("** 5.显示 **\n");
printf("** 6.排序 **\n");
printf("** 7.清空 **\n");
printf("** 0.退出 **\n");
printf("**************************************\n");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
EMPTY,
};
void test()
{
int input = 0;
Contact my_con;
InitContact(&my_con);
do
{
mnue();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case ADD:
ADD_contact(&my_con);
break;
case DEL:
DEL_contact(&my_con);
break;
case SEARCH:
SEARCH_contact(&my_con);
break;
case MODIFY:
MODIFY_contact(&my_con);
break;
case SHOW:
SHOW_contact(&my_con);
break;
case SORT:
SORT_contact(&my_con);
break;
case EMPTY :
EMPTY_contact(&my_con);
break;
case EXIT:
EXIT_Contact(&my_con);
break;
default:
printf("输入错误!请重新输入:>\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}