通讯录动态版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>enum operation
{EXIT, //退出ADD, //添加SEARCH, //查找DELETD, //刪除AMEND, //修改SHOW //顯示
};enum object
{X_NAME, //名字X_AGE, //年齡X_TELNUMBER,//電話號(hào)碼X_ADDRESS //住址
};#define max_name 10
#define max_telnumber 15
#define max_address 20
#define init_capacity 2typedef struct PeopleDate
{char name[max_name]; //名字short int age; //年齡char telnumber[max_telnumber]; //號(hào)碼char address[max_address]; //住址
}PeopleDate;typedef struct person
{PeopleDate* data; //定義聯(lián)系人相關(guān)信息的PeopleDate結(jié)構(gòu)體指針int sz; //當(dāng)前存儲(chǔ)的個(gè)數(shù)int capacity; //當(dāng)前容量
}person;void menu_operation(); //操作對(duì)象菜單
void menu_object(); //信息對(duì)象菜單
void init(person* con); //初始化
void f_add(person* con); //添加成員
void f_search(person* con); //查找成員
void f_delete(person* con); //刪除成員
void f_amend(person* con); //修改成員
void f_show(person* con); //顯示所有成員
int dilatation(person *pcon); //擴(kuò)充容量
void f_empty(person *pcon); //清空所有成員void menu_operation()
{printf("*****************************************\n");printf("*******0、退出 1、添加 *******\n");printf("*******2、查找 3、刪除 *******\n");printf("*******4、修改 5、顯示 *******\n");printf("*****************************************\n");
}void menu_object()
{printf("*****************************************\n");printf("*******0、姓名 1、年齡 *******\n");printf("*******2、號(hào)碼 3、地址 *******\n");printf("*****************************************\n");printf("請(qǐng)輸入需要修改的選項(xiàng):");
}void init(person *pcon)
{pcon->sz = 0;pcon->capacity = init_capacity;pcon->data = (PeopleDate*)malloc(pcon->capacity*sizeof(PeopleDate)); //實(shí)例化指針,給pcon->data分配內(nèi)存memset(pcon->data, 0, pcon->capacity*sizeof(PeopleDate)); //將pcon->data所指向的空間初始化為0
}int dilatation(person *pcon)
{PeopleDate* ptr = (PeopleDate*)realloc(pcon->data, (pcon->capacity + init_capacity)*sizeof(PeopleDate));//改變pcon->data所指向的空間大小if (ptr != NULL)//判斷擴(kuò)容是否成功,成功返回1,反之為0{pcon->data = ptr;pcon->capacity += init_capacity;//更新當(dāng)前實(shí)際容量大小return 1;}elsereturn 0;
}void f_empty(person *pcon)
{//釋放掉pcon->data所指向的空間free(pcon->data);pcon->data = NULL;pcon->sz = 0;pcon->capacity = 0;printf("內(nèi)容已銷毀\n");
}void f_add(person *pcon)
{if (pcon->sz == pcon->capacity)//判斷當(dāng)前聯(lián)系人個(gè)數(shù)是否滿了{int a = dilatation(pcon);switch (a){case 0: {printf("嘗試擴(kuò)容失敗\n");return;}break;case 1:{printf("嘗試擴(kuò)容成功\n");}break;default: printf("錯(cuò)誤\n"); break;}}//給新增加的聯(lián)系人添加信息printf("姓名:");scanf("%s", pcon->data[pcon->sz].name);printf("年齡:");scanf("%d", &(pcon->data[pcon->sz].age));printf("號(hào)碼:");scanf("%s", pcon->data[pcon->sz].telnumber);printf("地址:");scanf("%s", pcon->data[pcon->sz].address);printf("添加成功\n");pcon->sz++;//當(dāng)前聯(lián)系人個(gè)數(shù)+1
}void f_search(person *pcon)
{char nowname[max_name];int i = 0;printf("請(qǐng)輸入需要查找的姓名:");scanf("%s", nowname);for (i = 0; i < pcon->sz; i++){if (strcmp(pcon->data[i].name, nowname) == 0)//判斷當(dāng)前對(duì)象是否與要查找的人的姓名相同{printf("姓名:%s\n", pcon->data[i].name);printf("年齡:%d\n", pcon->data[i].age);printf("號(hào)碼:%s\n", pcon->data[i].telnumber);printf("地址:%s\n", pcon->data[i].address);break;}if (i == pcon->sz - 1) //如果查到最后一個(gè)人則說(shuō)明沒(méi)有該聯(lián)系人printf("無(wú)該聯(lián)系人\n");}
}void f_delete(person *pcon)
{char nowname[max_name];int i = 0, j = 0;printf("請(qǐng)輸入需要?jiǎng)h除人的姓名:");scanf("%s", nowname);for (i = 0; i < pcon->sz; i++){if (strcmp(pcon->data[i].name, nowname) == 0)//判斷當(dāng)前對(duì)象是否與要?jiǎng)h除的人的姓名相同{j = i;break;}}for (j = i; j < pcon->sz; j++) //依次向前覆蓋,把目標(biāo)聯(lián)系人刪除{pcon->data[j] = pcon->data[j + 1];}pcon->sz--; //聯(lián)系人個(gè)數(shù)-1printf("已刪除\n");
}void f_amend(person *pcon)
{char nowname[max_name];int i = 0, j = 0;printf("請(qǐng)輸入需要修改人的姓名:");scanf("%s", nowname);for (i = 0; i < pcon->sz; i++){if (strcmp(pcon->data[i].name, nowname) == 0){j = i;break;}}//按照菜單做出相應(yīng)的信息修改menu_object();scanf("%d", &i);switch (i){case X_NAME:{printf("請(qǐng)輸入姓名:");scanf("%s", pcon->data[j].name);printf("修改完成\n");}break;case X_AGE:{printf("請(qǐng)輸入年齡:");scanf("%d", &(pcon->data[j].age));printf("修改完成\n");}break;case X_TELNUMBER:{printf("請(qǐng)輸入號(hào)碼:");scanf("%s", pcon->data[j].telnumber);printf("修改完成\n");}break;case X_ADDRESS:{printf("請(qǐng)輸入地址:");scanf("%s", pcon->data[j].address);printf("修改完成\n");}break;default: printf("命令錯(cuò)誤\n"); break;}
}void f_show(person *pcon)
{int i = 0;printf("當(dāng)前有%d個(gè)聯(lián)系人\n", pcon->sz);for (i = 0; i < pcon->sz; i++){printf("\n");printf("姓名:%s\n", pcon->data[i].name);printf("年齡:%d\n", pcon->data[i].age);printf("號(hào)碼:%s\n", pcon->data[i].telnumber);printf("地址:%s\n", pcon->data[i].address);printf("\n");}
}int main()
{int input = 0;struct person con;init(&con);do{menu_operation();printf("請(qǐng)輸入指令:");scanf("%d", &input);switch (input){case EXIT: f_empty(&con); break;case ADD: f_add(&con); break;case SEARCH: f_search(&con); break;case DELETD: f_delete(&con); break;case AMEND: f_amend(&con); break;case SHOW: f_show(&con); break;default: printf("命令無(wú)效\n"); break;}} while (input);system("pause");return 0;
}
總結(jié)
- 上一篇: 第八章Transact-SQL程序设计
- 下一篇: Ubuntu下安装配置VIM/GVIM(