C語言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼
前言
大家好~今天是通訊錄的動(dòng)態(tài)版本實(shí)現(xiàn),希望對(duì)大家對(duì)知識(shí)的掌握有所提升!
contact.c
#include"contact.h"
//初始化通訊錄
void InitContact(Contact* pc)
{
assert(pc);
pc->sz = 0;
pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
if (NULL == pc->data)
{
printf("InitContact: :%s\n", strerror(errno));
return;
}
pc->capacity = DEFAULT_SZ;
}
static void CheckCapacity(Contact* pc)
{
if (pc->capacity == pc->sz)
{
PeoInfo* prt = (PeoInfo*)realloc(pc->data, (pc->capacity + INCREASE_SZ) * sizeof(PeoInfo));
if (NULL == prt)
{
printf("AddContact: :%s\n", strerror(errno));
return;
}
else
{
pc->data = prt;
pc->capacity += INCREASE_SZ;
printf("增容成功\n");
}
}
}
//增加聯(lián)系人信息
void AddContact(Contact* pc)
{
assert(pc);
CheckCapacity(pc);
printf("請(qǐng)輸入姓名:>");
scanf("%s", pc->data[pc->sz].name);
printf("請(qǐng)輸入性別:>");
scanf("%s", pc->data[pc->sz].sex);
printf("請(qǐng)輸入年齡:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("請(qǐng)輸入電話:>");
scanf("%s", pc->data[pc->sz].tele);
printf("請(qǐng)輸入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("增加聯(lián)系人信息成功\n");
}
void DestroyContact(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
}
//打印聯(lián)系人信息
void PrintContact(Contact* pc)
{
assert(pc);
if (0 == pc->sz)
{
printf("通訊錄為空\n");
return;
}
int i = 0;
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "姓名", "年齡", "性別", "電話", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[i].name,
pc->data[i].age, pc->data[i].sex,
pc->data[i].tele, pc->data[i].addr);
}
}
static int Find_By_NAME(const Contact* pc,char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//刪除聯(lián)系人信息
void DelContact(Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
if (pc->sz == 0)
{
printf("通訊錄為空,無法刪除信息\n");
return;
}
else
{
printf("請(qǐng)輸入要?jiǎng)h除聯(lián)系人的姓名:>");
scanf("%s", name);
int pos = Find_By_NAME(pc, name);
if (pos == -1)
{
printf("要?jiǎng)h除的聯(lián)系人不存在\n");
return;
}
int i = 0;
for (i = pos; i < (pc->sz - 1); i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除聯(lián)系人信息成功\n");
}
}
//查找聯(lián)系人信息
void SearchContact(const Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("請(qǐng)輸入要查找聯(lián)系人的姓名:>");
scanf("%s", name);
int pos = Find_By_NAME(pc, name);
if (pos == -1)
{
printf("要查找的聯(lián)系人不存在\n");
return;
}
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "姓名", "年齡", "性別", "電話", "地址");
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[pos].name,
pc->data[pos].age, pc->data[pos].sex,
pc->data[pos].tele, pc->data[pos].addr);
}
//修改聯(lián)系人信息
void ModifyContact(Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("請(qǐng)輸入要修改聯(lián)系人的姓名:>");
scanf("%s", name);
int pos = Find_By_NAME(pc, name);
if (pos == -1)
{
printf("要修改的聯(lián)系人不存在\n");
return;
}
else
{
printf("請(qǐng)輸入修改后人員的名字:>");
scanf("%s", pc->data[pos].name);
printf("請(qǐng)輸入修改后人員的年齡:>");
scanf("%d", &(pc->data[pos].age));
printf("請(qǐng)輸入修改后人員的性別:>");
scanf("%s", pc->data[pos].sex);
printf("請(qǐng)輸入修改后人員的地址:>");
scanf("%s", pc->data[pos].addr);
printf("請(qǐng)輸入修改后人員的電話:>");
scanf("%s", pc->data[pos].tele);
printf("修改聯(lián)系人員信息成功\n");
}
}
//排序聯(lián)系人信息
static int cmp_Per_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
assert(pc);
qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_Per_by_name);
PrintContact(pc);
}
//清空聯(lián)系人信息
void ClearContact(Contact* pc)
{
assert(pc);
InitContact(pc);
printf("清空成功\n");
}
contact.h
#pragma once
//頭文件的包含
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
//定義結(jié)構(gòu)體類型
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000
#define DEFAULT_SZ 3
#define INCREASE_SZ 2
//創(chuàng)建通訊錄
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}PeoInfo;
//動(dòng)態(tài)版本
typedef struct Contact
{
PeoInfo* data;//存放人的信息,維護(hù)通訊錄的指針
int sz;//記錄通訊錄中實(shí)際聯(lián)系人的個(gè)數(shù)
int capacity;//當(dāng)前通訊錄的容量
}Contact;
//初始化通訊錄
void InitContact(Contact* pc);
//增加聯(lián)系人信息
void AddContact(Contact* pc);
//打印聯(lián)系人信息
void PrintContact(Contact* pc);
//刪除聯(lián)系人信息
void DelContact(Contact* pc);
//查找聯(lián)系人信息
void SearchContact(const Contact* pc);
//修改聯(lián)系人信息
void ModifyContact(Contact* pc);
//排序聯(lián)系人信息
void SortContact(Contact* pc);
//清空聯(lián)系人信息
void ClearContact(Contact* pc);
//釋放通訊錄動(dòng)態(tài)內(nèi)存
void DestroyContact(Contact* pc);
test.c
#include"contact.h"
menu()
{
printf("********************************************\n");
printf("********* 1.add 2.del *********\n");
printf("********* 3.search 4.modify *********\n");
printf("********* 5.sort 6.print *********\n");
printf("********* 7.clear 0.exit *********\n");
printf("********************************************\n");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT,
CLEAR
};
int main()
{
int input = 0;
//創(chuàng)建通訊錄
Contact Con;
//初始化通訊錄
InitContact(&Con);
do
{
menu();
printf("請(qǐng)輸入你的選項(xiàng):>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&Con);
break;
case DEL:
DelContact(&Con);
break;
case SEARCH:
SearchContact(&Con);
break;
case MODIFY:
ModifyContact(&Con);
break;
case SORT:
SortContact(&Con);
break;
case PRINT:
PrintContact(&Con);
break;
case CLEAR:
ClearContact(&Con);
break;
case EXIT:
DestroyContact(&Con);
printf("退出通訊錄\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
break;
}
} while (input);
return 0;
}
以上就是C語言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語言動(dòng)態(tài)通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C語言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的代碼分享
- C語言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)
- C語言實(shí)現(xiàn)可保存的動(dòng)態(tài)通訊錄的示例代碼
- C語言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過程
- C語言與C++動(dòng)態(tài)通訊錄超詳細(xì)實(shí)現(xiàn)流程
- C語言動(dòng)態(tài)與靜態(tài)分別實(shí)現(xiàn)通訊錄詳細(xì)過程
- C語言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼
- C語言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程詳解
相關(guān)文章
Qt利用QDrag實(shí)現(xiàn)拖拽拼圖功能詳解
QDrag類為MIME-based拖拽數(shù)據(jù)轉(zhuǎn)換提供支持。本文為大家主要介紹如何利用QDrag類實(shí)現(xiàn)拖拽拼圖功能。左邊是打散的圖,拖動(dòng)到右邊進(jìn)行復(fù)現(xiàn),此外程序還支持手動(dòng)拖入原圖片,感興趣的可以了解一下2022-07-07
C++實(shí)現(xiàn)簡單的HTTP服務(wù)器
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單的HTTP服務(wù)器的相關(guān)資料,感興趣的朋友可以參考下2016-05-05
C語言深入探索動(dòng)態(tài)內(nèi)存分配的使用
給數(shù)組分配多大的空間?你是否和初學(xué)C時(shí)的我一樣,有過這樣的疑問。這一期就來聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解2022-04-04
C++實(shí)現(xiàn)leetcode(3.最長無重復(fù)字符的子串)
這篇文章主要介紹了C++實(shí)現(xiàn)leetcode(3.最長無重復(fù)字符的子串),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
c語言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例
這篇文章主要介紹了c語言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下2014-03-03
C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

