广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言静态动态两版本通讯录实战源码
  • 388
分享到

C语言静态动态两版本通讯录实战源码

2024-04-02 19:04:59 388人浏览 薄情痞子
摘要

目录正片开始静态版本头文件( phonebook.h)接口(test.c)功能板块(phonebook.c)1. 初始化:2. 增添:3.查找4.删除5.修改6.排序7.全览静态版全

正片开始

这里为了方便对照,我搬出整个程序的前后修改版本,并分别作为静态和动态版本,实际差距并不大,提供出来只供君参考

动机

为什么要写一个通讯录?

1.当然是一部分原因是看了b站上的资源自己比较感兴趣

2.其次就是在C语言实际应用上可以深化和巩固,其实都看得出来我中间断更了好久的数据结构与算法的博客,主要想法还是想把C语言从里到外不遗余力的杀穿,又走了一遍底层原理,不过我相信费时是值得的

3.在学习数据结构算法这板块,需要C语言基础高度的掌握,所以这部分算对前边理论部分的一个实战项目,数据结构数据结构,无非就是数据的增删查改,这里我们提前热身一下也不错。

静态版本

头文件( phonebook.h)

我们这里依旧使用之前写扫雷的分装思想,将这个通讯录分为 头文件,接口,功能三个部分。

首先我们写出头文件,就是我们需要用到什么,给他整出来,我们简单粗暴给命名为“ phonebook.h ”,展示为下面三个部分:

#pragma once
# define _CRT_SECURE_NO_WARNINGS 
# include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define max 1000
#define x 30
#define y 30
#define z 20
typedef struct num
{
	char name[x];
	int age;
	char sex[y];
	char addr[y];
	char num[z];
}num;
typedef struct book
{
	num data[max];
	int count;
}book;
enum conmenu
{
	退出,
	增添,
	删减,
	查找,
	修改,
	排序,
	全览,
};
void start(book* p); //初始化通讯录
void add(book* p);//增添信息
void show(const book* p);//展示信息
void delete(book* p);//删除信息
int search(book* p,char name[]);//库中搜寻要查找信息
void find(book* p);//查找信息
void modify(book* p);//修改信息
void sort(book* p);//排序信息

整个一坨掰成三瓣就是为了方便理解,从上到下分别是菜单(展示必要),自定义类型变量(结构体,枚举类型),需要实现的功能函数名。

为什么结构体变量有两个

book结构体是我们整个通讯录的骨骼,包含count(成员数量)和data(成员数据),这里就相当于模拟了一个数组出来,更方便管理; num 结构体则是存放各个成员数据的细节成分(姓名,年龄,性别……)。

接口(test.c)

设置接口的目的就相当于是设置了一个大门,就是一个统揽全局的作用,我们把菜单,和功能模块在这里作展示作用,代码的实现我们会放在功能板块实现。

#include"phonebook.h"
void menu()
{
	printf("-----------------------------\n");
	printf("----    欢迎使用通讯录   ----\n");
	printf("-----------------------------\n");
	printf("----- 1.增添  |   2.删减-----\n");
	printf("----- 3.查找  |   4.修改-----\n");
	printf("----- 5.排序  |   6.全览-----\n");
	printf("-----       0.退出      -----\n");
	printf("-----------------------------\n");
}
int main()
{
	int input;
	book con;
	start(&con);
	do
	{	
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 增添:
			add(&con);
			break;
		case 删减:
			delete(&con);
			break;
		case 查找:
			find(&con);
			break;
		case 修改:
			modify(&con);
			break;
		case 排序:
			sort(&con);
			break;
		case 全览:
			show(&con);
			break;
		case 退出:
			break;
		default:
			printf("錯誤输入!\n");
			return 0;
		}
	} while (input);
	return 0;
}     

抛开菜单部分,do-while 语句就是对应了菜单给出的功能遥控器,需要什么点什么。

为什么我们需要一个枚举类型,其原因就是为了对应上面菜单中的功能(枚举类型成员在未赋值情况下,第一个成员默认值为 0 ,其下依次递增,从而实现一一对应),我们作为设计者,主要是为了方便我们自己写代码,switch-case 语句中,case 条件我们一眼瞄过去如果是 1,2,3 的数字,我们在完善时就可能云里雾里,还要去查目录,就很麻烦,所以我们用枚举类型来避免这种小尴尬。

功能板块(phonebook.c)

我们在通讯录中需要达到的目的有基本的增删查改,以及作为称得上完美通讯录的全览,排序和退出,下面我们 一 一 实现:

1. 初始化:

void start(book* p)
{
	assert(p);
	p->count = 0;
	memset(p->data, 0, sizeof(p->data));
}

初识化首先就要避免空指针和随机数,所以这里安排一手 assert 和 置0 就够了。

2. 增添:

void add(book* p)
{
	assert(p);
	if (p->count == max)
	{
		printf("已满,请先进行删除\n");
		return;
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", p->data[p->count].name);
		printf("请输入年龄:");
		scanf("%d", &(p->data[p->count].age));
		printf("请输入性别(F\\M):");
		scanf("%s", p->data[p->count].sex);
		printf("请输入地址:");
		scanf("%s", p->data[p->count].addr);
		printf("请输入电话:");
		scanf("%s", p->data[p->count].num);
		p->count++;
		printf("\n增添成功!\n");
	}
}

增添数据我们要对应好结构体中的类型,因为年龄比较特殊,它是 %d 的形式,输入类型不是字符串,所以我们要进行取地址操作

3.查找

void find(book* p)
{
	assert(p);
	if (p->count == 0)
		printf("\n目录为空!\n");
	else
	{
		char name[max] = { 0 };
		printf("请输入查找对象:\n");
		scanf("%s", &name);
		int i = search(p, name);
		if (i != -1)
		{
			printf("联系人存在,在第%d位\n", i + 1);
		}
		else
		{
			printf("联系人不存在!\n");
		}
	}
}

注意在开始要判断一下现在通讯录状态是否为空,空就无法查找,注意要在库中寻找我们的查找对象,我们还要需要一个对信息进行筛选比对的函数来找出该对象,因此我们引入 search 函数:

int search(book* p, char name[])
{
	for (int i = 0; i < p->count; i++)
	{
		if (strcmp(name , p->data[i].name)==0)
		{
			return i;
		}
		else
		{
			return -1;
		}
	}
}

4.删除

void delete(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("\n为空,无法删除!\n");
		return;
	}
	else
	{
		printf("请输入删除对象:\n");
		char name[max] = {0};
		scanf("%s", &name);
		int f = search(p,name);
		if (f == -1)
		{
			printf("该对象不存在!\n");
		}
		else
		{
			for (int j = f; j < p->count-1; j++)
			{
				p->data[j] = p->data[j + 1];
			}
			p->count--;
			printf("\n删除成功!\n");
		}
	}
}

注意在开始要判断一下现在通讯录状态是否为空,空就无法删除;确定不为空再找到删除对象,我们所谓的删除本质就是用后面的数据进行依次覆盖,最后让数组大小 count -1 即可。

5.修改

void modify(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("为空,无法删除!\n");
		return;
	}
	else
	{
		printf("请输入对象姓名:\n");
		char name[max] = { 0 };
		scanf("%s", &name);
		int i = search(p,name);
		if(i!=-1)
		{
			printf("该对象存在\n");
			printf("请输入修改内容:\n");
			printf("请输入姓名:\n");
			scanf("%s", p->data[i].name);
			printf("请输入年龄:\n");
			scanf("%d", &(p->data[p->count].age));
			printf("请输入性别(F\M):\n");
			scanf("%c", &(p->data[p->count].sex));
			printf("请输入地址:\n");
			scanf("%s", p->data[p->count].addr);
			printf("请输入电话:\n");
			scanf("%s", p->data[p->count].num);
			printf("\n修改成功!\n");
		}
		else
		{
			printf("该对象不存在!\n");
			return 0;
		}
	}
}

6.排序

int compare(const void* a, const void* b)
{
	return strcmp(((book*)a)->data->name , ((book*)b)->data->name);
}
int compare2(const void* a, const void* b)
{
	return strcmp(((book*)b)->data->name, ((book*)a)->data->name);
}

void sort(book* p)
{
	printf("请选择:\n");
	printf("-----------------------------\n");
	printf("----- 1.顺序  |   2.逆序-----\n");
	printf("-----------------------------\n");
	int in;
	scanf("%d", &in);
	switch (in)
	{
	case 1:
		qsort(p->data, p->count, sizeof(p->data[0]), compare);
	case 2:
		qsort(p->data, p->count, sizeof(p->data[0]), compare2);
	}
	printf("\n 排序完成!\n");
}

排序我细分为了顺序和逆序两种,基本思想就是 qsort 函数一步到胃,不再赘述。

7.全览

void show(book* p)
{
	assert(p);
	int i = 0;
	printf("%10s %5s %5s %10s %13s\n","姓名","年龄","性别","地址","电话");
	for (i = 0; i < p->count; i++)
	{
		printf("%10s %5d %5s %10s %13s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].addr, p->data[i].num);
	}
}

就是全部打印出来即可,注意信息之间的间隔调整,读者可自主更改其大小。

到这里我们所有功能就算实现完了,来康康实际效果如何(仅展示其中几个):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

静态版全部代码

为了方便读者查看与创作,我把三个部分的代码全部贴出来:

test.c(接口)

#include"phonebook.h"
void menu()
{
	printf("-----------------------------\n");
	printf("----    欢迎使用通讯录   ----\n");
	printf("-----------------------------\n");
	printf("----- 1.增添  |   2.删减-----\n");
	printf("----- 3.查找  |   4.修改-----\n");
	printf("----- 5.排序  |   6.全览-----\n");
	printf("-----       0.退出      -----\n");
	printf("-----------------------------\n");
}
int main()
{
	int input;
	book con;
	start(&con);
	do
	{	
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 增添:
			add(&con);
			break;
		case 删减:
			delete(&con);
			break;
		case 查找:
			find(&con);
			break;
		case 修改:
			fix(&con);
			break;
		case 排序:
			sort(&con);
			break;
		case 全览:
			show(&con);
			break;
		case 退出:
			break;
		default:
			printf("錯誤输入!\n");
			return 0;
		}
	} while (input);
	return 0;
}     

phonebook.h(头文件)

#pragma once
# define _CRT_SECURE_NO_WARNINGS 
# include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define max 1000
#define x 30
#define y 30
#define z 20
typedef struct num
{
	char name[x];
	int age;
	char sex[y];
	char addr[y];
	char num[z];
}num;
typedef struct book
{
	num data[max];
	int count;
	int capacity;
}book;
enum conmenu
{
	退出,
	增添,
	删减,
	查找,
	修改,
	排序,
	全览,
};
void start(book* p);
void add(book* p);
void show(const book* p);
void delete(book* p);
int search(book* p,char name[]);
void find(book* p);
void fix(book* p);
void sort(book* p);

phonebook.c(功能)

# define _CRT_SECURE_NO_WARNINGS 
#include"phonebook.h"

void start(book* p)
{
	assert(p);
	p->count = 0;
	memset(p->data, 0, sizeof(p->data));
}
void add(book* p)
{
	assert(p);
	if (p->count == max)
	{
		printf("已满,请先进行删除\n");
		return;
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", p->data[p->count].name);
		printf("请输入年龄:");
		scanf("%d", &(p->data[p->count].age));
		printf("请输入性别(F\\M):");
		scanf("%s", p->data[p->count].sex);
		printf("请输入地址:");
		scanf("%s", p->data[p->count].addr);
		printf("请输入电话:");
		scanf("%s", p->data[p->count].num);
		p->count++;
		printf("\n增添成功!\n");
	}
}
void show(book* p)
{
	assert(p);
	int i = 0;
	printf("%10s %5s %5s %10s %13s\n","姓名","年龄","性别","地址","电话");
	for (i = 0; i < p->count; i++)
	{
		printf("%10s %5d %5s %10s %13s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].addr, p->data[i].num);
	}
}
int search(book* p, char name[])
{
	for (int i = 0; i < p->count; i++)
	{
		if (strcmp(name , p->data[i].name)==0)
		{
			return i;
		}
		else
		{
			return -1;
		}

	}
}
void delete(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("\n为空,无法删除!\n");
		return;
	}
	else
	{
		printf("请输入删除对象:\n");
		char name[max] = {0};
		scanf("%s", &name);
		int f = search(p,name);
		if (f == -1)
		{
			printf("该对象不存在!\n");
		}
		else
		{
			for (int j = f; j < p->count-1; j++)
			{
				p->data[j] = p->data[j + 1];
			}
			p->count--;
			printf("\n删除成功!\n");
		}
	}
}
void find(book* p)
{
	assert(p);
	if (p->count == 0)
		printf("\n目录为空!\n");
	else
	{
		char name[max] = { 0 };
		printf("请输入查找对象:\n");
		scanf("%s", &name);
		int i = search(p, name);
		if (i != -1)
		{
			printf("联系人存在,在第%d位\n", i + 1);
		}
		else
		{
			printf("联系人不存在!\n");
		}
	}
}

void fix(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("为空,无法删除!\n");
		return;
	}
	else
	{
		printf("请输入对象姓名:\n");
		char name[max] = { 0 };
		scanf("%s", &name);
		int i = search(p,name);
		if(i!=-1)
		{
			printf("该对象存在\n");
			printf("请输入修改内容:\n");
			printf("请输入姓名:\n");
			scanf("%s", p->data[i].name);
			printf("请输入年龄:\n");
			scanf("%d", &(p->data[p->count].age));
			printf("请输入性别(F\M):\n");
			scanf("%c", &(p->data[p->count].sex));
			printf("请输入地址:\n");
			scanf("%s", p->data[p->count].addr);
			printf("请输入电话:\n");
			scanf("%s", p->data[p->count].num);
			printf("\n修改成功!\n");
		}
		else
		{
			printf("该对象不存在!\n");
			return 0;
		}
	}
}
int compare(const void* a, const void* b)
{
	return strcmp(((book*)a)->data->name , ((book*)b)->data->name);
}
int compare2(const void* a, const void* b)
{
	return strcmp(((book*)b)->data->name, ((book*)a)->data->name);
}

void sort(book* p)
{
	printf("请选择:\n");
	printf("-----------------------------\n");
	printf("----- 1.顺序  |   2.逆序-----\n");
	printf("-----------------------------\n");
	int in;
	scanf("%d", &in);
	switch (in)
	{
	case 1:
		qsort(p->data, p->count, sizeof(p->data[0]), compare);
	case 2:
		qsort(p->data, p->count, sizeof(p->data[0]), compare2);
	}
	printf("\n 排序完成!\n");
}

动态版

动态版的区别就在于他的内存是活的,按需索取,要多少拿多少,绝不少给也绝不浪费空间,在空间上做出了质的优化,原理就是动态内存分配。

typedef struct book
{
	num data[max];
	int count;
	int capacity;
}book;

首先我们在 book 定义的结构体中引入一个 capacity 变量,意为容量,它就相当于一个空间使用的指标变量。

动态初始化:

void start(book* p)
{
	assert(p);
	num* container = (num*)malloc(DEFAULT * sizeof(num));
	if (container != NULL)
	{
		p->data = container;
		p->count = 0;
		p->capacity = DEFAULT;
	}
	else
	{	
		printf("%s\n", strerror(errno));
		return;
	}
}

重点是这里不再使用死板的数组,改用 malloc 函数先开辟一块默认大小,这个大小我们随意设置但避免浪费我们要尽量往小了设置。注意空指针,我们后面设置一个查看错误类型方便排空(注意引<errno.h>头文件) 。

扩容函数

则扩容的关键就在于我们的 capa_city 函数:

void capa_city(book* p)
{
	num* container = (num*)realloc(p->data, sizeof(book) * (p->capacity + 2));
	if (container != NULL)
	{
		p->data = container;
		p->capacity += 2 ;
		printf("增容成功!\n");
	}
	else
	{
		printf("%s\n", strerror(errno));
		return;
	}
}

我们为了体现空间利用的得当,我们每次扩容控制在 +2 数据空间即可。

接下来不用变动即可实现动态版本了,我直接上代码:

动态版全部代码

test.c

#include"phonebook.h"
void menu()
{
	printf("-----------------------------\n");
	printf("----    欢迎使用通讯录   ----\n");
	printf("-----------------------------\n");
	printf("----- 1.增添  |   2.删减-----\n");
	printf("----- 3.查找  |   4.修改-----\n");
	printf("----- 5.排序  |   6.全览-----\n");
	printf("-----       0.退出      -----\n");
	printf("-----------------------------\n");
}
int main()
{
	int input;
	book con;
	start(&con);
	do
	{	
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 增添:
			add(&con);
			break;
		case 删减:
			delete(&con);
			break;
		case 查找:
			find(&con);
			break;
		case 修改:
			fix(&con);
			break;
		case 排序:
			sort(&con);
			break;
		case 全览:
			show(&con);
			break;
		case 退出:
			break;
		default:
			printf("錯誤输入!\n");
			return 0;
		}
	} while (input);
	return 0;
}  

phonebook.h

#pragma once
# define _CRT_SECURE_NO_WARNINGS 
# include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#define max 1000
#define x 30
#define DEFAULT 50
#define z 20
typedef struct num
{
	char name[x];
	int age;
	char sex[x];
	char addr[x];
	char num[z];
}num;
typedef struct book
{
	num* data;
	int count;
	int capacity;
}book;
enum conmenu
{
	退出,
	增添,
	删减,
	查找,
	修改,
	排序,
	全览,
};
void start(book* p);
void add(book* p);
void show(const book* p);
void delete(book* p);
int search(book* p,char name[]);
void find(book* p);
void fix(book* p);
void sort(book* p);
void capa_city(book* p);

phonebook.c

# define _CRT_SECURE_NO_WARNINGS 
#include"phonebook.h"
void capa_city(book* p)
{
	num* container = (num*)realloc(p->data, sizeof(book) * (p->capacity + 2));
	if (container != NULL)
	{
		p->data = container;
		p->capacity += 2 ;
		printf("增容成功!\n");
	}
	else
	{
		printf("%s\n", strerror(errno));
		return;
	}
}
void start(book* p)
{
	assert(p);
	num* container = (num*)malloc(DEFAULT * sizeof(num));
	if (container != NULL)
	{
		p->data = container;
		p->count = 0;
		p->capacity = DEFAULT;
	}
	else
	{	
		printf("%s\n", strerror(errno));
		return;
	}
}
void add(book* p)
{
	if (p->capacity == p->count)
	{
		capa_city(p);
	}
	assert(p);
	if (p->count == max)
	{
		printf("已满,请先进行删除\n");
		return;
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", p->data[p->count].name);
		printf("请输入年龄:");
		scanf("%d", &(p->data[p->count].age));
		printf("请输入性别(F\\M):");
		scanf("%s", p->data[p->count].sex);
		printf("请输入地址:");
		scanf("%s", p->data[p->count].addr);
		printf("请输入电话:");
		scanf("%s", p->data[p->count].num);
		p->count++;
		printf("\n增添成功!\n");
	}
}
void show(book* p)
{
	assert(p);
	if (p->capacity == p->count)
	{
		capa_city(p);
	}
	int i = 0;
	printf("%10s %5s %5s %10s %13s\n","姓名","年龄","性别","地址","电话");
	for (i = 0; i < p->count; i++)
	{
		printf("%10s %5d %5s %10s %13s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].addr, p->data[i].num);
	}
}
int search(book* p, char name[])
{
	for (int i = 0; i < p->count; i++)
	{
		if (strcmp(name , p->data[i].name)==0)
		{
			return i;
		}
		else
		{
			return -1;
		}

	}
}
void delete(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("\n为空,无法删除!\n");
		return;
	}
	else
	{
		printf("请输入删除对象:\n");
		char name[max] = {0};
		scanf("%s", &name);
		int f = search(p,name);
		if (f == -1)
		{
			printf("该对象不存在!\n");
		}
		else
		{
			for (int j = f; j < p->count-1; j++)
			{
				p->data[j] = p->data[j + 1];
			}
			p->count--;
			printf("\n删除成功!\n");
		}
	}
}
void find(book* p)
{
	assert(p);
	if (p->count == 0)
		printf("\n目录为空!\n");
	else
	{
		char name[max] = { 0 };
		printf("请输入查找对象:\n");
		scanf("%s", &name);
		int i = search(p, name);
		if (i != -1)
		{
			printf("联系人存在,在第%d位\n", i + 1);
		}
		else
		{
			printf("联系人不存在!\n");
		}
	}
}

void fix(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("为空,无法删除!\n");
		return;
	}
	else
	{
		printf("请输入对象姓名:\n");
		char name[max] = { 0 };
		scanf("%s", &name);
		int i = search(p,name);
		if(i!=-1)
		{
			printf("该对象存在\n");
			printf("请输入修改内容:\n");
			printf("请输入姓名:\n");
			scanf("%s", p->data[i].name);
			printf("请输入年龄:\n");
			scanf("%d", &(p->data[p->count].age));
			printf("请输入性别(F\M):\n");
			scanf("%c", &(p->data[p->count].sex));
			printf("请输入地址:\n");
			scanf("%s", p->data[p->count].addr);
			printf("请输入电话:\n");
			scanf("%s", p->data[p->count].num);
			printf("\n修改成功!\n");
		}
		else
		{
			printf("该对象不存在!\n");
			return 0;
		}
	}
}
int compare(const void* a, const void* b)
{
	return strcmp(((book*)a)->data->name , ((book*)b)->data->name);
}
int compare2(const void* a, const void* b)
{
	return strcmp(((book*)b)->data->name, ((book*)a)->data->name);
}

void sort(book* p)
{
	printf("请选择:\n");
	printf("-----------------------------\n");
	printf("----- 1.顺序  |   2.逆序-----\n");
	printf("-----------------------------\n");
	int in;
	scanf("%d", &in);
	switch (in)
	{
	case 1:
		qsort(p->data, p->count, sizeof(p->data[0]), compare);
	case 2:
		qsort(p->data, p->count, sizeof(p->data[0]), compare2);
	}
	printf("\n 排序完成!\n");
}

今天就到这里吧,摸了家人们。

以上就是C语言静态动态两版本通讯录实战源码的详细内容,更多关于C语言静态动态通讯录的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言静态动态两版本通讯录实战源码

本文链接: https://www.lsjlt.com/news/139036.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言静态动态两版本通讯录实战源码
    目录正片开始静态版本头文件( phonebook.h)接口(test.c)功能板块(phonebook.c)1. 初始化:2. 增添:3.查找4.删除5.修改6.排序7.全览静态版全...
    99+
    2022-11-13
  • C语言实现通讯录的方法(包括静态版本和动态版本)
    目录1.静态通讯录的实现实现的方法:2.动态通讯录的实现实现的方法:3.总结1.静态通讯录的实现 实现的方法: 我们采用的方法就是工程形势,实现将功能和定义以及测试分成三个文件,其中...
    99+
    2022-11-12
  • C语言实现静态版通讯录的代码分享
    目录前言通讯录设计的关键思想点分析 通讯录界面(meun)设计 增加信息功能实现代码删除信息功能实现代码查询信息功能实现代码修改信息功能实现代码按年龄升序排序信息...
    99+
    2023-01-12
    C语言静态通讯录 C语言通讯录
  • C语言实现简易通讯录(静态版本)的代码分享
    目录一、通讯录1.演示效果2.完整代码二、代码解析1.宏定义及结构体声明2.主菜单函数3.主函数4.查找函数5.初始化联系人信息6.添加联系人信息7.显示所有联系人信息8.删除指定联...
    99+
    2022-11-13
    C语言静态通讯录 C语言 通讯录
  • C语言示例讲解动态/文件/静态功能版本的通讯录实现
    目录一、代码展示test.ccontact.ccontact.h二、效果展示静态版本基本功能的实现动态版本扩容功能的实现文件版本保存本地功能实现一、代码展示 test.c ✅使用枚举...
    99+
    2022-11-13
  • C语言静态版通讯录的设计与实现
    目录1. 配置运行环境2. 通讯录的实现2.1 通讯录的功能目录2.2 增加信息功能代码的实现2.3 显示信息功能代码的实现2.4 删除信息功能代码的实现2.5 查询信息功能代码的实...
    99+
    2023-05-16
    C语言静态版通讯录 C语言通讯录实现
  • C语言实现动态版通讯录的代码分享
    目录前言初始化函数具体实现代码检查容量函数实现代码销毁通讯录函数实现代码动态版通讯录完整代码前言 哈喽各位友友们,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!我仅已...
    99+
    2023-01-12
    C语言动态版通讯录 C语言动态通讯录 C语言 通讯录
  • C语言动态与静态分别实现通讯录的方法
    这篇文章主要讲解了“C语言动态与静态分别实现通讯录的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言动态与静态分别实现通讯录的方法”吧!一.静态通讯录的实现1.环境的分工逻辑由于过程...
    99+
    2023-06-29
  • C语言静态与动态通讯录的实现流程详解
    目录静态通讯录contact.hcontact.ctest.c动态通讯录contact.hcontact.cqsort.ctest.c本次通讯录的代码已经放到我的Gitee仓库中,感...
    99+
    2022-11-12
  • C语言动态与静态分别实现通讯录详细过程
    目录前言:一.静态通讯录的实现1.环境的分工逻辑2.待实现的功能3.contact.h4.contact.c5.test.c6.实现效果二.通讯录动态的实现1.contact.h2....
    99+
    2022-11-13
  • C语言静态与动态通讯录的实现方法是什么
    这篇文章主要讲解了“C语言静态与动态通讯录的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言静态与动态通讯录的实现方法是什么”吧!静态通讯录在我们学习完C语言的结构体、指针...
    99+
    2023-06-25
  • 基于C语言怎么实现静态通讯录
    这篇文章主要介绍“基于C语言怎么实现静态通讯录”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于C语言怎么实现静态通讯录”文章能帮助大家解决问题。一、项目要求实现一个通讯录通讯录可以用来存储100个...
    99+
    2023-07-02
  • 基于C语言实现静态通讯录的示例代码
    目录一、项目要求二、Contact.h三、Contact.c1、静态函数2、初始化通讯录3、打印4、增加联系人信息5、通过名字查找6、删除联系人信息7、修改信息8、排序通讯录9、清空...
    99+
    2022-11-13
  • C语言实现静态存储通讯录的示例代码
    目录最初的构思与规划显示菜单以及main函数增加个人信息显示所有联系人的信息删除个人信息查找个人信息更改个人信息对联系人信息进行排序最后产品展示contart.h 头文件contar...
    99+
    2022-11-13
  • C语言模拟实现动态通讯录
    目录1.模拟实现通讯录总体架构一览图2.文件执行任务3.分模块实现 测试模块 test.c头文件 功能函数声明 contact.h功能函数逐一实现1.模拟实现通讯录总体架构...
    99+
    2022-11-12
  • C语言怎么模拟实现动态通讯录
    本篇内容主要讲解“C语言怎么模拟实现动态通讯录”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么模拟实现动态通讯录”吧!目录模拟实现通讯录总体架构一览图文件执行任务分模块实现 测...
    99+
    2023-06-20
  • C语言实现一个文件版动态通讯录流程详解
    目录通讯录思维导图一、Contact.h二、Contact.c1.初始化通讯录2.检查容量是否满3.添加联系人4.显示联系人5.查找联系人6.修改联系人7.通过名字来排序联系人8.保...
    99+
    2023-01-29
    C语言动态通讯录 C语言通讯录
  • C语言多功能动态通讯录实现示例
    目录前言一、预设置1,头文件的包含2,联系人的信息格式3,通讯录的信息格式4,通讯录相关宏定义5,通讯录功能枚举6,基本主函数二、功能函数实现1,初始化函数2,查找函数3,打印菜单4...
    99+
    2023-01-31
    C语言多功能动态通讯录 C语言 通讯录
  • C语言与C++动态通讯录超详细实现流程
    目录1、思路以及要实现的功能2、详细步骤2.1 打印菜单界面(建一个源文件test.c)2.2 主函数2.3 初始化函数与加载函数2.4 增加联系人函数AddContact2.5 删...
    99+
    2022-11-13
  • C语言编程内存分配通讯录静态实现示例代码教程
    实现一个通讯录: 通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作