c语言实现动态通讯录

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;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值