亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼

 更新時(shí)間:2022年02月14日 09:26:21   作者:?jiǎn)虇碳业凝堼? 
這篇文章主要為大家?guī)?lái)了C語(yǔ)言實(shí)現(xiàn)靜態(tài)動(dòng)態(tài)兩版本的通訊錄實(shí)戰(zhàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

正片開(kāi)始

這里為了方便對(duì)照,我搬出整個(gè)程序的前后修改版本,并分別作為靜態(tài)和動(dòng)態(tài)版本,實(shí)際差距并不大,提供出來(lái)只供君參考

動(dòng)機(jī)

為什么要寫(xiě)一個(gè)通訊錄?

1.當(dāng)然是一部分原因是看了b站上的資源自己比較感興趣

2.其次就是在C語(yǔ)言實(shí)際應(yīng)用上可以深化和鞏固,其實(shí)都看得出來(lái)我中間斷更了好久的數(shù)據(jù)結(jié)構(gòu)與算法的博客,主要想法還是想把C語(yǔ)言從里到外不遺余力的殺穿,又走了一遍底層原理,不過(guò)我相信費(fèi)時(shí)是值得的

3.在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法這板塊,需要C語(yǔ)言基礎(chǔ)高度的掌握,所以這部分算對(duì)前邊理論部分的一個(gè)實(shí)戰(zhàn)項(xiàng)目,數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu),無(wú)非就是數(shù)據(jù)的增刪查改,這里我們提前熱身一下也不錯(cuò)。

靜態(tài)版本

頭文件( phonebook.h)

我們這里依舊使用之前寫(xiě)掃雷的分裝思想,將這個(gè)通訊錄分為 頭文件,接口,功能三個(gè)部分。

首先我們寫(xiě)出頭文件,就是我們需要用到什么,給他整出來(lái),我們簡(jiǎn)單粗暴給命名為“ phonebook.h ”,展示為下面三個(gè)部分:

#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[]);//庫(kù)中搜尋要查找信息
void find(book* p);//查找信息
void modify(book* p);//修改信息
void sort(book* p);//排序信息

整個(gè)一坨掰成三瓣就是為了方便理解,從上到下分別是菜單(展示必要),自定義類(lèi)型變量(結(jié)構(gòu)體,枚舉類(lèi)型),需要實(shí)現(xiàn)的功能函數(shù)名。

為什么結(jié)構(gòu)體變量有兩個(gè)

book結(jié)構(gòu)體是我們整個(gè)通訊錄的骨骼,包含count(成員數(shù)量)和data(成員數(shù)據(jù)),這里就相當(dāng)于模擬了一個(gè)數(shù)組出來(lái),更方便管理; num 結(jié)構(gòu)體則是存放各個(gè)成員數(shù)據(jù)的細(xì)節(jié)成分(姓名,年齡,性別……)。

接口(test.c)

設(shè)置接口的目的就相當(dāng)于是設(shè)置了一個(gè)大門(mén),就是一個(gè)統(tǒng)攬全局的作用,我們把菜單,和功能模塊在這里作展示作用,代碼的實(shí)現(xiàn)我們會(huì)放在功能板塊實(shí)現(xiàn)。

#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("請(qǐng)選擇:\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("錯(cuò)誤輸入!\n");
			return 0;
		}
	} while (input);
	return 0;
}     

拋開(kāi)菜單部分,do-while 語(yǔ)句就是對(duì)應(yīng)了菜單給出的功能遙控器,需要什么點(diǎn)什么。

為什么我們需要一個(gè)枚舉類(lèi)型,其原因就是為了對(duì)應(yīng)上面菜單中的功能(枚舉類(lèi)型成員在未賦值情況下,第一個(gè)成員默認(rèn)值為 0 ,其下依次遞增,從而實(shí)現(xiàn)一一對(duì)應(yīng)),我們作為設(shè)計(jì)者,主要是為了方便我們自己寫(xiě)代碼,switch-case 語(yǔ)句中,case 條件我們一眼瞄過(guò)去如果是 1,2,3 的數(shù)字,我們?cè)谕晟茣r(shí)就可能云里霧里,還要去查目錄,就很麻煩,所以我們用枚舉類(lèi)型來(lái)避免這種小尷尬。

功能板塊(phonebook.c)

我們?cè)谕ㄓ嶄浿行枰_(dá)到的目的有基本的增刪查改,以及作為稱(chēng)得上完美通訊錄的全覽,排序和退出,下面我們 一 一 實(shí)現(xiàn):

1. 初始化:

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

初識(shí)化首先就要避免空指針和隨機(jī)數(shù),所以這里安排一手 assert 和 置0 就夠了。

2. 增添:

void add(book* p)
{
	assert(p);
	if (p->count == max)
	{
		printf("已滿(mǎn),請(qǐng)先進(jìn)行刪除\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入姓名:");
		scanf("%s", p->data[p->count].name);
		printf("請(qǐng)輸入年齡:");
		scanf("%d", &(p->data[p->count].age));
		printf("請(qǐng)輸入性別(F\\M):");
		scanf("%s", p->data[p->count].sex);
		printf("請(qǐng)輸入地址:");
		scanf("%s", p->data[p->count].addr);
		printf("請(qǐng)輸入電話(huà):");
		scanf("%s", p->data[p->count].num);
		p->count++;
		printf("\n增添成功!\n");
	}
}

增添數(shù)據(jù)我們要對(duì)應(yīng)好結(jié)構(gòu)體中的類(lèi)型,因?yàn)槟挲g比較特殊,它是 %d 的形式,輸入類(lèi)型不是字符串,所以我們要進(jìn)行取地址操作

3.查找

void find(book* p)
{
	assert(p);
	if (p->count == 0)
		printf("\n目錄為空!\n");
	else
	{
		char name[max] = { 0 };
		printf("請(qǐng)輸入查找對(duì)象:\n");
		scanf("%s", &name);
		int i = search(p, name);
		if (i != -1)
		{
			printf("聯(lián)系人存在,在第%d位\n", i + 1);
		}
		else
		{
			printf("聯(lián)系人不存在!\n");
		}
	}
}

注意在開(kāi)始要判斷一下現(xiàn)在通訊錄狀態(tài)是否為空,空就無(wú)法查找,注意要在庫(kù)中尋找我們的查找對(duì)象,我們還要需要一個(gè)對(duì)信息進(jìn)行篩選比對(duì)的函數(shù)來(lái)找出該對(duì)象,因此我們引入 search 函數(shù):

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為空,無(wú)法刪除!\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入刪除對(duì)象:\n");
		char name[max] = {0};
		scanf("%s", &name);
		int f = search(p,name);
		if (f == -1)
		{
			printf("該對(duì)象不存在!\n");
		}
		else
		{
			for (int j = f; j < p->count-1; j++)
			{
				p->data[j] = p->data[j + 1];
			}
			p->count--;
			printf("\n刪除成功!\n");
		}
	}
}

注意在開(kāi)始要判斷一下現(xiàn)在通訊錄狀態(tài)是否為空,空就無(wú)法刪除;確定不為空再找到刪除對(duì)象,我們所謂的刪除本質(zhì)就是用后面的數(shù)據(jù)進(jìn)行依次覆蓋,最后讓數(shù)組大小 count -1 即可。

5.修改

void modify(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("為空,無(wú)法刪除!\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入對(duì)象姓名:\n");
		char name[max] = { 0 };
		scanf("%s", &name);
		int i = search(p,name);
		if(i!=-1)
		{
			printf("該對(duì)象存在\n");
			printf("請(qǐng)輸入修改內(nèi)容:\n");
			printf("請(qǐng)輸入姓名:\n");
			scanf("%s", p->data[i].name);
			printf("請(qǐng)輸入年齡:\n");
			scanf("%d", &(p->data[p->count].age));
			printf("請(qǐng)輸入性別(F\M):\n");
			scanf("%c", &(p->data[p->count].sex));
			printf("請(qǐng)輸入地址:\n");
			scanf("%s", p->data[p->count].addr);
			printf("請(qǐng)輸入電話(huà):\n");
			scanf("%s", p->data[p->count].num);
			printf("\n修改成功!\n");
		}
		else
		{
			printf("該對(duì)象不存在!\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("請(qǐng)選擇:\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");
}

排序我細(xì)分為了順序和逆序兩種,基本思想就是 qsort 函數(shù)一步到胃,不再贅述。

7.全覽

void show(book* p)
{
	assert(p);
	int i = 0;
	printf("%10s %5s %5s %10s %13s\n","姓名","年齡","性別","地址","電話(huà)");
	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);
	}
}

就是全部打印出來(lái)即可,注意信息之間的間隔調(diào)整,讀者可自主更改其大小。

到這里我們所有功能就算實(shí)現(xiàn)完了,來(lái)康康實(shí)際效果如何(僅展示其中幾個(gè)):

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

靜態(tài)版全部代碼

為了方便讀者查看與創(chuàng)作,我把三個(gè)部分的代碼全部貼出來(lái):

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("請(qǐng)選擇:\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("錯(cuò)誤輸入!\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("已滿(mǎn),請(qǐng)先進(jìn)行刪除\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入姓名:");
		scanf("%s", p->data[p->count].name);
		printf("請(qǐng)輸入年齡:");
		scanf("%d", &(p->data[p->count].age));
		printf("請(qǐng)輸入性別(F\\M):");
		scanf("%s", p->data[p->count].sex);
		printf("請(qǐng)輸入地址:");
		scanf("%s", p->data[p->count].addr);
		printf("請(qǐng)輸入電話(huà):");
		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","姓名","年齡","性別","地址","電話(huà)");
	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為空,無(wú)法刪除!\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入刪除對(duì)象:\n");
		char name[max] = {0};
		scanf("%s", &name);
		int f = search(p,name);
		if (f == -1)
		{
			printf("該對(duì)象不存在!\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("請(qǐng)輸入查找對(duì)象:\n");
		scanf("%s", &name);
		int i = search(p, name);
		if (i != -1)
		{
			printf("聯(lián)系人存在,在第%d位\n", i + 1);
		}
		else
		{
			printf("聯(lián)系人不存在!\n");
		}
	}
}

void fix(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("為空,無(wú)法刪除!\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入對(duì)象姓名:\n");
		char name[max] = { 0 };
		scanf("%s", &name);
		int i = search(p,name);
		if(i!=-1)
		{
			printf("該對(duì)象存在\n");
			printf("請(qǐng)輸入修改內(nèi)容:\n");
			printf("請(qǐng)輸入姓名:\n");
			scanf("%s", p->data[i].name);
			printf("請(qǐng)輸入年齡:\n");
			scanf("%d", &(p->data[p->count].age));
			printf("請(qǐng)輸入性別(F\M):\n");
			scanf("%c", &(p->data[p->count].sex));
			printf("請(qǐng)輸入地址:\n");
			scanf("%s", p->data[p->count].addr);
			printf("請(qǐng)輸入電話(huà):\n");
			scanf("%s", p->data[p->count].num);
			printf("\n修改成功!\n");
		}
		else
		{
			printf("該對(duì)象不存在!\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("請(qǐng)選擇:\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");
}

動(dòng)態(tài)版

動(dòng)態(tài)版的區(qū)別就在于他的內(nèi)存是活的,按需索取,要多少拿多少,絕不少給也絕不浪費(fèi)空間,在空間上做出了質(zhì)的優(yōu)化,原理就是動(dòng)態(tài)內(nèi)存分配。

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

首先我們?cè)?book 定義的結(jié)構(gòu)體中引入一個(gè) capacity 變量,意為容量,它就相當(dāng)于一個(gè)空間使用的指標(biāo)變量。

動(dòng)態(tài)初始化:

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;
	}
}

重點(diǎn)是這里不再使用死板的數(shù)組,改用 malloc 函數(shù)先開(kāi)辟一塊默認(rèn)大小,這個(gè)大小我們隨意設(shè)置但避免浪費(fèi)我們要盡量往小了設(shè)置。注意空指針,我們后面設(shè)置一個(gè)查看錯(cuò)誤類(lèi)型方便排空(注意引<errno.h>頭文件) 。

擴(kuò)容函數(shù)

則擴(kuò)容的關(guān)鍵就在于我們的 capa_city 函數(shù):

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;
	}
}

我們?yōu)榱梭w現(xiàn)空間利用的得當(dāng),我們每次擴(kuò)容控制在 +2 數(shù)據(jù)空間即可。

接下來(lái)不用變動(dòng)即可實(shí)現(xiàn)動(dòng)態(tài)版本了,我直接上代碼:

動(dòng)態(tài)版全部代碼

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("請(qǐng)選擇:\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("錯(cuò)誤輸入!\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("已滿(mǎn),請(qǐng)先進(jìn)行刪除\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入姓名:");
		scanf("%s", p->data[p->count].name);
		printf("請(qǐng)輸入年齡:");
		scanf("%d", &(p->data[p->count].age));
		printf("請(qǐng)輸入性別(F\\M):");
		scanf("%s", p->data[p->count].sex);
		printf("請(qǐng)輸入地址:");
		scanf("%s", p->data[p->count].addr);
		printf("請(qǐng)輸入電話(huà):");
		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","姓名","年齡","性別","地址","電話(huà)");
	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為空,無(wú)法刪除!\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入刪除對(duì)象:\n");
		char name[max] = {0};
		scanf("%s", &name);
		int f = search(p,name);
		if (f == -1)
		{
			printf("該對(duì)象不存在!\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("請(qǐng)輸入查找對(duì)象:\n");
		scanf("%s", &name);
		int i = search(p, name);
		if (i != -1)
		{
			printf("聯(lián)系人存在,在第%d位\n", i + 1);
		}
		else
		{
			printf("聯(lián)系人不存在!\n");
		}
	}
}

void fix(book* p)
{
	assert(p);
	if (p->count == 0)
	{
		printf("為空,無(wú)法刪除!\n");
		return;
	}
	else
	{
		printf("請(qǐng)輸入對(duì)象姓名:\n");
		char name[max] = { 0 };
		scanf("%s", &name);
		int i = search(p,name);
		if(i!=-1)
		{
			printf("該對(duì)象存在\n");
			printf("請(qǐng)輸入修改內(nèi)容:\n");
			printf("請(qǐng)輸入姓名:\n");
			scanf("%s", p->data[i].name);
			printf("請(qǐng)輸入年齡:\n");
			scanf("%d", &(p->data[p->count].age));
			printf("請(qǐng)輸入性別(F\M):\n");
			scanf("%c", &(p->data[p->count].sex));
			printf("請(qǐng)輸入地址:\n");
			scanf("%s", p->data[p->count].addr);
			printf("請(qǐng)輸入電話(huà):\n");
			scanf("%s", p->data[p->count].num);
			printf("\n修改成功!\n");
		}
		else
		{
			printf("該對(duì)象不存在!\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("請(qǐng)選擇:\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語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言靜態(tài)動(dòng)態(tài)通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++實(shí)現(xiàn)掃雷游戲(控制臺(tái)版)

    C++實(shí)現(xiàn)掃雷游戲(控制臺(tái)版)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷游戲,控制臺(tái)版的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • c++ KMP字符串匹配算法

    c++ KMP字符串匹配算法

    大家好,本篇文章主要講的是c++ KMP字符串匹配算法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01
  • 詳解C語(yǔ)言中的Static關(guān)鍵字

    詳解C語(yǔ)言中的Static關(guān)鍵字

    這篇文章主要為大家介紹了C語(yǔ)言中Static關(guān)鍵字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • C++入門(mén)到精通之循環(huán)語(yǔ)句的使用教程

    C++入門(mén)到精通之循環(huán)語(yǔ)句的使用教程

    這篇文章主要給大家介紹了關(guān)于C++中循環(huán)語(yǔ)句的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C++中Boost庫(kù)裁剪與其應(yīng)用詳解

    C++中Boost庫(kù)裁剪與其應(yīng)用詳解

    大家都知道STL全稱(chēng)"標(biāo)準(zhǔn)模板庫(kù)(Standard Template Library)",其實(shí)它是一套標(biāo)準(zhǔn),可能有不同的實(shí)現(xiàn),它是 C++ 的"標(biāo)準(zhǔn)庫(kù)"。Boost 則是一個(gè) C++ 庫(kù),被稱(chēng)為"C++ 準(zhǔn)標(biāo)準(zhǔn)庫(kù)"。那么這篇文章文章我們就來(lái)詳細(xì)的介紹C++Boost庫(kù)的裁剪與其應(yīng)用,感興趣的朋友可以一起學(xué)習(xí)。
    2016-10-10
  • C語(yǔ)言中花式退出程序的方式總結(jié)

    C語(yǔ)言中花式退出程序的方式總結(jié)

    在本篇文章當(dāng)中主要給大家介紹C語(yǔ)言當(dāng)中一些不常用的特性,比如在main函數(shù)之前和之后設(shè)置我們想要執(zhí)行的函數(shù),以及各種花式退出程序的方式,需要的可以參考一下
    2022-10-10
  • C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲

    C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 深入剖析Android中init進(jìn)程實(shí)現(xiàn)的C語(yǔ)言源碼

    深入剖析Android中init進(jìn)程實(shí)現(xiàn)的C語(yǔ)言源碼

    這篇文章主要介紹了Android中init進(jìn)程實(shí)現(xiàn)的C語(yǔ)言源碼,init屬性服務(wù)在安卓中屬于系統(tǒng)的底層Linux服務(wù),需要的朋友可以參考下
    2015-07-07
  • C++示例講解vector容器

    C++示例講解vector容器

    這篇文章主要介紹了C++?容器?Vector?的使用方法,Vector?是一個(gè)能夠存放任意類(lèi)型的動(dòng)態(tài)數(shù)組,有點(diǎn)類(lèi)似數(shù)組,是一個(gè)連續(xù)地址空間,下文更多詳細(xì)內(nèi)容的介紹,需要的小伙伴可以參考一下
    2022-07-07
  • C++ continue和break語(yǔ)句

    C++ continue和break語(yǔ)句

    這篇文章主要介紹了C++ continue和break語(yǔ)句,文章圍繞continue和break語(yǔ)句的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,需要的朋友可以參考一下,希望對(duì)大家有所幫助
    2021-11-11

最新評(píng)論