C語言實現(xiàn)簡單通訊錄
更新時間:2020年05月25日 09:24:48 作者:陽可不犯迷糊
這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易通訊錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C語言實現(xiàn)簡易通訊錄的具體代碼,供大家參考,具體內(nèi)容如下
一、概述
通訊錄的實現(xiàn)其中包括了指針、結(jié)構(gòu)體、動態(tài)內(nèi)存管理、文件的讀寫操作等知識點,是對這些知識點應(yīng)用鞏固的非常好的例子;
通訊錄功能如下:
- 添加聯(lián)系人
- 刪除聯(lián)系人
- 查找聯(lián)系人
- 修改聯(lián)系人
- 顯示所有聯(lián)系人
- 加載聯(lián)系人
- 保存聯(lián)系人
- 聯(lián)系人排序
二、代碼如下
contact.h
#ifndef CONTACT_H
#define CONTACT_H
#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 20
#define MEMBER_MAX 1
typedef struct info
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TEL_MAX];
char addr[ADDR_MAX];
}info;
typedef struct contact
{
info *data;
int size;
int capacity;
}contact, *pcontact;
//初始化通訊錄
void InitContact(pcontact list);
//添加聯(lián)系人
void AddContact(pcontact list);
//刪除聯(lián)系人
void DellContact(pcontact list);
//查找聯(lián)系人
void FindContact(pcontact list);
//修改聯(lián)系人
void ModContact(pcontact list);
//顯示所有聯(lián)系人
void ShowContact(pcontact list);
//聯(lián)系人排序(選擇法)
void SortContact(pcontact list);
//檢查容量
int CheckSize(pcontact list);
//查找聯(lián)系人在數(shù)組data第幾個位置
int FindContactAddr(pcontact list);
//從文件中加載聯(lián)系人到內(nèi)存
void LoadContact(pcontact list);
//將聯(lián)系人從內(nèi)從中保存到文件
void SaveContact(pcontact list);
#endif
contact.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "contact.h"
//初始化通訊錄
void InitContact(pcontact list)
{
list->data = (info *)malloc(sizeof(info)* MEMBER_MAX);
list->size = 0;
list->capacity = MEMBER_MAX;
//每次初始化是加載一遍文件,防止最新錄入的在保存在文件時覆蓋上次
//打開程序時保存的信息
LoadContact(list);
}
//添加聯(lián)系人
void AddContact(pcontact list)
{
info tmp_member;
if (CheckCapacity(list) == 0)
{
printf("成員已滿,添加失??!");
return;
}
printf("請輸入姓名:");
scanf("%s", tmp_member.name);
printf("請輸入性別:");
scanf("%s", tmp_member.sex);
printf("請輸入年齡:");
scanf("%d", &tmp_member.age);
printf("請輸入電話:");
scanf("%s", tmp_member.tele);
printf("請輸入地址:");
scanf("%s", tmp_member.addr);
list->data[list->size] = tmp_member;
printf("添加成功!\n");
list->size++;
}
//刪除聯(lián)系人
void DellContact(pcontact list)
{
char tmp_name[NAME_MAX] = { 0 };
int ret = 0;
printf("請輸入姓名:");
scanf("%s", tmp_name);
ret = FindContactAddr(list, tmp_name);
if (ret == -1)
{
printf("無此聯(lián)系人!\n");
return;
}
for (ret; ret < list->size - 1; ret++)
{
list->data[ret] = list->data[ret + 1];
}
printf("刪除成功!\n");
list->size--;
}
//查找聯(lián)系人
void FindContact(pcontact list)
{
char tmp_name[NAME_MAX] = { 0 };
printf("請輸入姓名:");
scanf("%s", tmp_name);
for (int i = 0; i < list->size; i++)
{
if (strcmp(tmp_name, list->data[i].name) == 0)
{
printf("===============================\n");
printf("姓名:%s\n", list->data[i].name);
printf("性別:%s\n", list->data[i].sex);
printf("年齡:%d\n", list->data[i].age);
printf("電話:%s\n", list->data[i].tele);
printf("地址:%s\n", list->data[i].addr);
printf("===============================\n");
return;
}
}
printf("無此聯(lián)系人!\n");
}
//查找聯(lián)系人在數(shù)組data第幾個位置
int FindContactAddr(pcontact list, char *tmp_name)
{
for (int i = 0; i < list->size; i++)
{
if (strcmp(tmp_name, list->data[i].name) == 0)
return i;
}
return -1;
}
//修改聯(lián)系人
void ModContact(pcontact list)
{
info tmp_member;
int ret = 0;
printf("請輸入姓名:");
scanf("%s", tmp_member.name);
ret = FindContactAddr(list, tmp_member.name);
if (ret == -1)
{
printf("無此聯(lián)系人!\n");
return;
}
printf("請輸入性別:");
scanf("%s", tmp_member.sex);
printf("請輸入年齡:");
scanf("%s", &tmp_member.age);
printf("請輸入電話:");
scanf("%s", tmp_member.tele);
printf("請輸入地址:");
scanf("%s", tmp_member.addr);
list->data[ret] = tmp_member;
printf("修改成功!\n");
}
//聯(lián)系人排序(選擇法)
void SortContact(pcontact list)
{
info tmp_member;
for (int i = 0; i < list->size - 2; i++)
{
for (int j = 1; j < list->size - 1; j++)
{
if (strcmp(list->data[i].name, list->data[j].name) > 0)
{
tmp_member = list->data[i];
list->data[i] = list->data[j];
list->data[j] = tmp_member;
}
}
}
}
//檢查上次動態(tài)開辟的空間是否夠用,不夠時繼續(xù)開辟
int CheckCapacity(pcontact list)
{
if (list->size == list->capacity)
{
info *tmp = (info *)malloc(sizeof(info)* (list->capacity + 10));
if (tmp == NULL)
return 0;
memcpy(tmp, list->data, sizeof(info) * list->size);
free(list->data);
list->data = tmp;
list->capacity += 10;
}
return 1;
}
//顯示所有聯(lián)系人
void ShowContact(pcontact list)
{
for (int i = 0; i < list->size; i++)
{
printf("============第%d位==============\n", i + 1);
printf("姓名:%s\n", list->data[i].name);
printf("性別:%s\n", list->data[i].sex);
printf("年齡:%d\n", list->data[i].age);
printf("電話:%s\n", list->data[i].tele);
printf("地址:%s\n", list->data[i].addr);
printf("===============================\n");
}
}
//從文件中加載聯(lián)系人到內(nèi)存
void LoadContact(pcontact list)
{
info tmp_member;
FILE *pf = NULL;
pf = fopen("./contatc.dat", "rb");
if (pf == NULL)
perror("fopen error");
//按照內(nèi)存塊讀取,一次讀1塊,1塊大小是sizeof(info)
while (fread(&tmp_member, sizeof(info), 1, pf))
{
if (CheckCapacity(list))
{
list->data[list->size] = tmp_member;
list->size++;
}
}
if (pf != NULL)
{
fclose(pf);
pf = NULL;
printf("加載成功!\n");
}
}
//將聯(lián)系人從內(nèi)從中保存到文件
void SaveContact(pcontact list)
{
FILE *pf = NULL;
pf = fopen("./contatc.dat", "wb");
if (pf == NULL)
perror("fopen error");
for (int i = 0; i < list->size; i++)
{
//按照內(nèi)存塊寫入,一次寫1塊,1塊大小是sizeof(info)
fwrite(list->data + i, sizeof(info), 1, pf);
}
if (pf != NULL)
{
fclose(pf);
pf = NULL;
printf("保存成功!\n");
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include "contact.h"
enum opt
{
Exit,
Add,
Dell,
Find,
Mod,
Show,
Load,
Save,
Sort,
};
void menu(void)
{
printf("/*========================通訊錄======================*/\n");
printf("/*= 0.退出通訊錄 1.添加聯(lián)系人 =*/\n");
printf("/*= 2.刪除聯(lián)系人 3.查找聯(lián)系人 =*/\n");
printf("/*= 4.修改聯(lián)系人 5.顯示所有聯(lián)系人 =*/\n");
printf("/*= 6.加載聯(lián)系人 7.保存聯(lián)系人 =*/\n");
printf("/*= 8.聯(lián)系人排序 =*/\n");
printf("/*====================================================*/\n");
}
void TestContact(void)
{
contact pc;
InitContact(&pc);
int opt = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d", &opt);
switch (opt)
{
case Exit:
printf("退出系統(tǒng)...\n");
break;
case Add:
AddContact(&pc);
break;
case Dell:
DellContact(&pc);
break;
case Find:
FindContact(&pc);
break;
case Mod:
ModContact(&pc);
break;
case Show:
ShowContact(&pc);
break;
case Load:
LoadContact(&pc);
break;
case Save:
SaveContact(&pc);
break;
case Sort:
SortContact(&pc);
break;
default:
printf("輸入選項有誤,重新輸入!\n");
break;
}
} while (opt);
}
int main(void)
{
TestContact();
printf("\n");
system("pause");
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點)
這篇文章主要介紹了C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

