欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言編程動態(tài)內(nèi)存開辟實現(xiàn)升級版通訊錄教程示例

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

前言

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

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

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

這里是用struct PeoInfodata結構體指針指向通訊錄,而不再直接 struct PeoInfo data[Max]

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

多種信息描述用結構體(struct PeoInfodata是動態(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定義是為了方便將來如果需要對數(shù)組大小增減,直接改#define這里的即可
struct PeoInfo
{
	char name[Name_max];//姓名
	int age;//年齡
	char sex[Sex_max];//性別
	char tele[Tele_max];//電話號碼
	char addr[Addr_max];//地址
};//聲明一個通訊錄結構體類型
struct Contact
{
	struct PeoInfo*data;
	int sz;//記錄已有聯(lián)系人數(shù)目
	int capacity;//當前通訊錄最大容量,將來如果不夠可以自動擴容
};//struct Contact是一種結構體類型,它里面可以存放其他類型,而struct PoeInfo也是一種類型,自然是可以存放的

二、通訊錄初始化

我們先來看一下,動態(tài)通訊錄運行原理:

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

在這里插入圖片描述

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

代碼如下(示例):

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

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

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

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

四、銷毀通訊錄

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

因為我們通訊錄是用結構體指針malloc出來的嘛,不再需要通訊錄我們就用free函數(shù)把那塊空間還給操作系統(tǒng),然后要記得把指針置為空指針(就比如你去賓館,退房要把鑰匙還給賓館)

后記

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

以上就是C語言編程動態(tài)內(nèi)存開辟實現(xiàn)升級版通訊錄教程示例的詳細內(nèi)容,更多關于C語言實現(xiàn)通訊錄的資料請關注腳本之家其它相關文章!

相關文章

  • C語言 循環(huán)詳解及簡單代碼示例

    C語言 循環(huán)詳解及簡單代碼示例

    本文主要介紹C語言的循環(huán)知識,這里整理了循環(huán)的基礎資料并附簡單的代碼示例詳細講解,有需要的小伙伴可以參考下
    2016-08-08
  • C語言動態(tài)內(nèi)存分配和內(nèi)存操作函數(shù)使用詳解

    C語言動態(tài)內(nèi)存分配和內(nèi)存操作函數(shù)使用詳解

    但是在實際的編程中,往往會發(fā)生這種情況,即所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù),而無法預先確定 。為了解決上述問題,C語言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要動態(tài)的分配內(nèi)存空間,也可把不再使用的空間回收再次利用
    2022-12-12
  • C++迭代器失效問題及解決

    C++迭代器失效問題及解決

    這篇文章主要介紹了C++迭代器失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • VS2022+libtorch+Cuda11.3安裝測試教程詳解(調用cuda)

    VS2022+libtorch+Cuda11.3安裝測試教程詳解(調用cuda)

    這篇文章主要介紹了VS2022+libtorch+Cuda11.3安裝測試(調用cuda),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 統(tǒng)計C語言二叉樹中葉子結點個數(shù)

    統(tǒng)計C語言二叉樹中葉子結點個數(shù)

    這篇文章主要介紹的是統(tǒng)計C語言二叉樹中葉子結點個數(shù),文章以C語言二叉樹中葉子結點為基礎分享一個簡單小栗子講解,具有一定的知識參考價值,需要的小伙伴可以參考一下
    2022-02-02
  • 淺析C++中單鏈表的增、刪、改、減

    淺析C++中單鏈表的增、刪、改、減

    以下是對C++中單鏈表的增、刪、改、減進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C語言的位段與枚舉詳解

    C語言的位段與枚舉詳解

    這篇文章主要為大家詳細介紹了C語言的位段與枚舉,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 內(nèi)部排序之堆排序的實現(xiàn)詳解

    內(nèi)部排序之堆排序的實現(xiàn)詳解

    本篇文章是對堆排序的實現(xiàn)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 基于C語言實現(xiàn)靜態(tài)通訊錄的示例代碼

    基于C語言實現(xiàn)靜態(tài)通訊錄的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)一個簡單的靜態(tài)通訊錄,文中的示例代碼講解詳細,對我們學習C語言有一定幫助,需要的可以參考一下
    2022-07-07
  • 基于C語言編寫一個多功能計算器

    基于C語言編寫一個多功能計算器

    這篇文章主要為大家詳細介紹了如何基于C語言編寫一個多功能計算器,除了四則混合運算之外,還支持三角函數(shù)和絕對值等函數(shù),感興趣的小伙伴可以跟隨小編一起學習一下
    2023-08-08

最新評論