通讯录的动态版本

contact.h
#ifndef _CONTACT_H__
#define _CONTACT_H__

#include<stdio.h>
#include <stdlib.h>
#define INC 2 //每次开辟的内存大小
#define SZ 3 //默认大小
#define MAX 1000
#define NAME 10
#define SEX 5
#define TELE 20
#define ADDR 30
typedef struct PerInfo{    //个人信息结构体 
char name[NAME]; 
int age; 
char sex[SEX]; 
char tele[TELE]; 
char addr[ADDR];
}PerInfo;
typedef struct Contact{      //通讯录信息结构体
PerInfo contact[MAX];       
PerInfo *contact;            
int sz;                    
int capacity;
}Contact, *pContact;
void InitContact(pContact pcon);
void AddContact (pContact pcon);
void ShowContact(const pContact pcon);
void DelContact(pContact pcon);
int CheckCapacity(pContact pcon);
#endif //_CONTACT_H__

contact.c
#include "contact.h"
void InitContact(pContact pcon){
    pcon->sz = 0;
    pcon->contact = (PerInfo *)malloc(SZ*sizeof(PerInfo));
    if (NULL == pcon->contact){
        perror("InitContact :: malloc");
        exit(EXIT_FAILURE);
    }
    memset(pcon->contact, 0, SZ *sizeof(pcon->contact));
    pcon->capacity = SZ;
}

void DestoryContact(pContact pcon){
    free(pcon->contact);
    pcon->contact = NULL;
    pcon->sz = 0;
    pcon->capacity = 0;
}

int CheckCapacity(pContact pcon){
    if (pcon->sz == pcon->capacity){
        PerInfo *tmp = realloc(pcon->contact,(pcon->capacity + DEFAULT_INC) * sizeof(PeoInfo));
        if (tmp != NULL){
            pcon->contact = tmp;
            pcon->capacity += INC;
            printf("增容成功!\n");
            return 1;
        }
        else
            return 0;
    }
    return 1;
}

void AddContact(pContact pcon)
{
    if (pcon->sz == MAX){
      printf("通讯录已满!");
      return;
    }
    if (CheckCapacity(pcon) == 0){
        return;
    }
    printf("请输入名字:>");
    scanf("%s", pcon->contact[pcon->sz].name);
    printf("请输入年龄:>");
    scanf("%d", &(pcon->contact[pcon->sz].age)); 
    printf("请输入性别:>");
    scanf("%s", pcon->contact[pcon->sz].sex); 
    printf("请输入电话:>");
    scanf("%s", pcon->contact[pcon->sz].tele);
    printf("请输入地址:>");
    scanf("%s", pcon->contact[pcon->sz].addr);
    pcon->sz++;
    printf("添加成功!\n");
}

void ShowContact(const pContact pcon)
{
    int i = 0;
    printf("%12s\t%4s\t%5s\t%12s\t%12s\n", "name", "age", "sex", "tele", "addr");
    for (i = 0; i < pcon->sz; i++){
        printf("%12s\t%4d\t%5s\t%12s\t%12s\n",
            pcon->contact[i].name,
            pcon->contact[i].age,
            pcon->contact[i].sex,
            pcon->contact[i].tele,
            pcon->contact[i].addr);
    }
}

static int FindEntry(pContact pcon, char name[]){
    int i = 0;
    for (i = 0; i < pcon->sz; i++){
        if (strcmp(name, pcon->contact[i].name) == 0){
            return i;
        }
    }
    return -1;
}

void DelContact(pContact pcon){
    int pos = 0;
    char name[NAME] = { 0 };
    if (pcon->sz == 0){
        printf("通讯录已空\n");
        return;
    }
    printf("请输入您想要删除的记录\n");
    scanf("%s", &name);
    pos = FindEntry(pcon, name);
    if (pos == -1){
        printf("您想要删除的记录不存在!\n");
    }
    else{
        memmove(pcon->contact + pos, 
                pcon->contact + pos + 1, 
               (pcon->sz - pos - 1)*sizeof(PeoInfo));
        pcon->sz--;
        printf("删除成功!\n");
    }
}
test.c
#include "contact.h"
enum Op{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    EMPTY,
    SORT
};

void menu(){
    printf("*******************************************\n");
    printf("*******  1、add      2、  del     *********\n");
    printf("*******  3、search   4、  modify  *********\n");
    printf("*******  5、show     6、  empty   *********\n");
    printf("*******  7、sort     0、  exit    *********\n");
    printf("*******************************************\n");
}

test(){
    int input = 0;
    Contact my_con;
    InitContact(&my_con);
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input){
        case ADD:
            AddContact(&my_con);
            break;
        case DEL:
            DelContact(&my_con);
            break;
        case SEARCH:
            break;
        case MODIFY:
            break;
        case SHOW:
            ShowContact(&my_con);
            break;
        case EMPTY:
            break;
        case SORT:
            break;
        case EXIT:
            DestoryContact(&my_con);
            break;
         default:
             printf("选择错误,请重新输入!");
            break;
        }
    } while (input);
}
}             
int main()
{
    test();
    system("pause");
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值