最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言編程動(dòng)態(tài)內(nèi)存開(kāi)辟實(shí)現(xiàn)升級(jí)版通訊錄教程示例

 更新時(shí)間:2021年10月22日 10:40:02   作者:高郵吳少  
這篇文章主要為大家介紹了C語(yǔ)言編程實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存開(kāi)辟升級(jí)版通訊錄的教程示例及解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

前言

所謂動(dòng)態(tài)內(nèi)存開(kāi)辟的通訊錄,就是我需要多少聯(lián)系人,就給多少聯(lián)系人,防止給定一個(gè)聯(lián)系人上限,需要增加聯(lián)系人無(wú)法擴(kuò)容,而聯(lián)系人沒(méi)有上限那么多又會(huì)造成內(nèi)存浪費(fèi)。

本文繼之前的靜態(tài)通訊錄作出改進(jìn),有興趣的同學(xué)可以看看之前的文章:C語(yǔ)言實(shí)現(xiàn)靜態(tài)通訊錄

一、存放聯(lián)系人信息

這里是用struct PeoInfodata結(jié)構(gòu)體指針指向通訊錄,而不再直接 struct PeoInfo data[Max]

用結(jié)構(gòu)體數(shù)組定義通訊錄容量大小,其他都和之前的靜態(tài)通訊錄一樣

多種信息描述用結(jié)構(gòu)體(struct PeoInfodata是動(dòng)態(tài),struct PeoInfo data[Max]是靜態(tài))

#define Name_max 20
#define Sex_max 5
#define Tele_max 12
#define Addr_max 30
#define Max 1000
//用#define定義是為了方便將來(lái)如果需要對(duì)數(shù)組大小增減,直接改#define這里的即可
struct PeoInfo
{
	char name[Name_max];//姓名
	int age;//年齡
	char sex[Sex_max];//性別
	char tele[Tele_max];//電話(huà)號(hào)碼
	char addr[Addr_max];//地址
};//聲明一個(gè)通訊錄結(jié)構(gòu)體類(lèi)型
struct Contact
{
	struct PeoInfo*data;
	int sz;//記錄已有聯(lián)系人數(shù)目
	int capacity;//當(dāng)前通訊錄最大容量,將來(lái)如果不夠可以自動(dòng)擴(kuò)容
};//struct Contact是一種結(jié)構(gòu)體類(lèi)型,它里面可以存放其他類(lèi)型,而struct PoeInfo也是一種類(lèi)型,自然是可以存放的

二、通訊錄初始化

我們先來(lái)看一下,動(dòng)態(tài)通訊錄運(yùn)行原理:

在這里插入圖片描述

我們聯(lián)系人結(jié)構(gòu)體創(chuàng)建好之后data(結(jié)構(gòu)體指針)這個(gè)成員是沒(méi)有指向一塊具體空間的,我們用初始化函數(shù)申請(qǐng)一塊空間,然后讓data指向那塊空間,假設(shè)我們現(xiàn)在開(kāi)辟三塊空間
(開(kāi)辟空間數(shù)由memset(pc->data, 0, Max * sizeof(struct PeoInfo));這句代碼中的Max控制,比如我現(xiàn)在是開(kāi)辟3塊空間就把Max改成3即可)

在這里插入圖片描述

(圖片來(lái)自比特就業(yè)課)
開(kāi)辟完空間后,capacity(當(dāng)前通訊錄最大容量)即是3,但是我們現(xiàn)在沒(méi)有放有效聯(lián)系人,所以sz(已有聯(lián)系人數(shù)目)還是0

在這里插入圖片描述

當(dāng)你放入一個(gè)聯(lián)系人張三的信息,sz變?yōu)?

在這里插入圖片描述

在這里插入圖片描述

再放入一個(gè)聯(lián)系人李四的信息,sz變?yōu)?,然后再放入聯(lián)系人王五的信息,sz變?yōu)?。后面的以此類(lèi)推

代碼如下(示例):

#define Default_sz 3//默認(rèn)初始聯(lián)系人容量為3
//這里#define定義是方便其他使用者將來(lái)如果不想初始容量為3,可以直接在#define這里修改
void InitContact(struct Contact*pc)
{
	pc->sz = 0;
	pc->data = (struct PeoInfo*)malloc(Default_sz * sizeof(struct PeoInfo));
	pc->capacity = Default_sz;
}

一個(gè)聯(lián)系人結(jié)構(gòu)體占用空間大小是sizeof(struct PeoInfo),我們這里是初始給3個(gè)聯(lián)系人結(jié)構(gòu)體大小空間(后面不夠再自動(dòng)擴(kuò)),你也可以用其他數(shù)字代替,malloc開(kāi)辟出空間后,是返回值類(lèi)型為void*,我們需要的pc->data是struct PeoInfo*型,我們強(qiáng)制轉(zhuǎn)換一下,然后開(kāi)辟出來(lái)的空間會(huì)由struct PeoInfo *型的指針進(jìn)行管理。

三、增加聯(lián)系人

void AddContact(struct Contact*pc)//動(dòng)態(tài)增加聯(lián)系人
{
	if (pc->sz == pc->capacity)
	{
		//容量已達(dá)上限,如果增加聯(lián)系人需擴(kuò)容
		struct PeoInfo* ptr= (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2)*sizeof(struct PeoInfo));//追加空間函數(shù),詳情見(jiàn)筆者動(dòng)態(tài)內(nèi)存分配文章
		//realloc第二個(gè)參數(shù)是字節(jié)為單位,pc->capacity + 2是容量個(gè)數(shù),sizeof(struct PeoInfo)是每個(gè)聯(lián)系人結(jié)構(gòu)體所占空間
		if (ptr != NULL)//realloc函數(shù)有可能開(kāi)辟空間失敗,失敗會(huì)返回空指針
		{
			pc->data = ptr;
			pc->capacity += 2;//我們以每次增容+2為例,你也可以換其他數(shù)字
			printf("增容成功\n");
		}
		else//返回空指針說(shuō)明開(kāi)辟失敗
		{
			return;//開(kāi)辟失敗就結(jié)束程序
		}
	}
	printf("請(qǐng)輸入聯(lián)系人姓名:\n");
	scanf("%s", pc->data[pc->sz].name);
	//pc->data是結(jié)構(gòu)體指針,我們之前很多文字說(shuō)過(guò)一個(gè)知識(shí)點(diǎn),假設(shè)a是一個(gè)指針,*(a+n)=a[n]
	//pc->data[pc->sz]=*(pc->data+pc->sz)
	printf("請(qǐng)輸入聯(lián)系人年齡:\n");
	scanf("%d", &(pc->data[pc->sz].age));
	//這里年齡和前面的名字有什么區(qū)別?
	//name在結(jié)構(gòu)體里是一個(gè)數(shù)組,數(shù)組單獨(dú)出現(xiàn)可以看成數(shù)組首元素地址,age是一個(gè)整形,要&進(jìn)行取地址操作
	printf("請(qǐng)輸入聯(lián)系人性別:\n");
	scanf("%d", (pc->data[pc->sz].sex));
	printf("請(qǐng)輸入聯(lián)系人電話(huà):\n");
	scanf("%d", (pc->data[pc->sz].tele));
	printf("請(qǐng)輸入聯(lián)系人地址:\n");
	scanf("%d", (pc->data[pc->sz].addr));
	printf("該聯(lián)系人已添加\n");
	pc->sz++;//添加完后,聯(lián)系人數(shù)目+1
}

四、銷(xiāo)毀通訊錄

void DestoryContact(struct Contact*pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
}

因?yàn)槲覀兺ㄓ嶄浭怯媒Y(jié)構(gòu)體指針malloc出來(lái)的嘛,不再需要通訊錄我們就用free函數(shù)把那塊空間還給操作系統(tǒng),然后要記得把指針置為空指針(就比如你去賓館,退房要把鑰匙還給賓館)

后記

對(duì)于靜態(tài)通訊錄改動(dòng)態(tài)通訊錄也就是改一下它的初始化、增加聯(lián)系人(類(lèi)比靜態(tài)通訊錄沒(méi)有上限,也避免浪費(fèi)空間),還有通訊錄銷(xiāo)毀的一些小改動(dòng),對(duì)于完整通訊錄還有查找、刪除、修改、顯示聯(lián)系人等操作函數(shù),但由于和靜態(tài)沒(méi)有改動(dòng),讀者可自行查看筆者以前的通訊錄文章 。

以上就是C語(yǔ)言編程動(dòng)態(tài)內(nèi)存開(kāi)辟實(shí)現(xiàn)升級(jí)版通訊錄教程示例的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言實(shí)現(xiàn)通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序

    C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序

    這篇文章主要介紹了C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++11之后的decltype類(lèi)型指示符詳解

    C++11之后的decltype類(lèi)型指示符詳解

    為了滿(mǎn)足這一要求,C++11?新標(biāo)準(zhǔn)引入了另一種類(lèi)型說(shuō)明符?decltype?,它的作用是選擇并返回操作數(shù)的數(shù)據(jù)類(lèi)型,這篇文章主要介紹了C++11之后的decltype類(lèi)型指示符,需要的朋友可以參考下
    2023-01-01
  • C++ 實(shí)現(xiàn)帶監(jiān)視哨的順序查找算法

    C++ 實(shí)現(xiàn)帶監(jiān)視哨的順序查找算法

    這篇文章主要介紹了C++ 實(shí)現(xiàn)帶監(jiān)視哨的順序查找算法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之復(fù)雜鏈表的拷貝

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之復(fù)雜鏈表的拷貝

    復(fù)雜鏈表指的是一個(gè)鏈表有若干個(gè)結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)有一個(gè)數(shù)據(jù)域用于存放數(shù)據(jù),還有兩個(gè)指針域,其中一個(gè)指向下一個(gè)節(jié)點(diǎn),還有一個(gè)隨機(jī)指向當(dāng)前復(fù)雜鏈表中的任意一個(gè)節(jié)點(diǎn)或者是一個(gè)空結(jié)點(diǎn)。今天我們要實(shí)現(xiàn)的就是對(duì)這樣一個(gè)復(fù)雜鏈表復(fù)制產(chǎn)生一個(gè)新的復(fù)雜鏈表
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)逆波蘭式實(shí)例

    C語(yǔ)言實(shí)現(xiàn)逆波蘭式實(shí)例

    這篇文章介紹了C語(yǔ)言實(shí)現(xiàn)逆波蘭式實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • 用C++實(shí)現(xiàn)推箱子

    用C++實(shí)現(xiàn)推箱子

    這篇文章主要為大家詳細(xì)介紹了用C++實(shí)現(xiàn)推箱子,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • OpenCV實(shí)現(xiàn)圖像細(xì)化算法

    OpenCV實(shí)現(xiàn)圖像細(xì)化算法

    本文主要介紹了OpenCV實(shí)現(xiàn)圖像細(xì)化算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡連接檢測(cè)的方法

    C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡連接檢測(cè)的方法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡連接檢測(cè)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C語(yǔ)言 共用體(Union)詳解及示例代碼

    C語(yǔ)言 共用體(Union)詳解及示例代碼

    本文主要介紹C語(yǔ)言 共用體,這里整理了相關(guān)資料及示例代碼,幫助大家學(xué)習(xí)理解此部分的知識(shí),有興趣的小伙伴可以參考下
    2016-08-08

最新評(píng)論

新安县| 麻江县| 越西县| 兰考县| 高邮市| 酉阳| 昔阳县| 工布江达县| 临泉县| 来宾市| 始兴县| 玉田县| 遂川县| 盐源县| 武胜县| 邻水| 青海省| 海阳市| 肥乡县| 峨边| 正安县| 新密市| 建平县| 江口县| 全南县| 靖安县| 五峰| 华蓥市| 鹿邑县| 芜湖市| 靖江市| 三门县| 怀仁县| 金华市| 彰化市| 邵阳县| 潜山县| 定兴县| 务川| 资兴市| 康定县|