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

C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)順序表中的增刪改(尾插尾刪)教程示例詳解

 更新時(shí)間:2022年02月15日 10:01:59   作者:?jiǎn)虇碳业凝堼? 
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)順序表中的增刪改教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

初始化

在初步認(rèn)識(shí)順序表這一結(jié)構(gòu)后,我們就可以繼續(xù)深入探究
這是我之前在.h文件中創(chuàng)建的結(jié)構(gòu)體

typedef int type;
typedef struct list
{
	type* a;
	int size;
	int capacity;
}st;

在處理順序表結(jié)構(gòu)時(shí)我們會(huì)用到的一些接口,處理其中的關(guān)系,其實(shí)本質(zhì)上就是函數(shù),這里我用復(fù)雜英文對(duì)應(yīng)出來(lái)方便形成記憶。

void init(st *s);  //插入
void pushback( st* p, type x);//尾插
void popback(st* p); //尾刪
void pushfront( st* p, type x); //頭插
void popfront(st* p);   //頭刪
void insert(st* p, int n, type x);  //中間位置插入
void erase(st* p, int n);  //中間位置刪處

我用 init 函數(shù)實(shí)現(xiàn)簡(jiǎn)單的初始化,首先會(huì)先把結(jié)構(gòu)體成員傳過(guò)來(lái),注意再次強(qiáng)調(diào)區(qū)別形參和實(shí)參,傳值調(diào)用肯定會(huì)報(bào)錯(cuò)滴,乖乖的換成指針,其實(shí)不論是不是傳址調(diào)用,我們都可以搞成指針傳過(guò)去,為了保險(xiǎn)起見。
我們第一步肯定是開辟空間,先用 malloc 函數(shù)參上,當(dāng)然,null 還玩?zhèn)€屁屁,為了先避免掉這種情況,我們就 if 意思一下,然后給初始有效位設(shè)為 0,初始容量設(shè)為 5。

void init(st *s)
{
	s->a = (type*)malloc(sizeof(type) * 4);
	if (s->a == NULL)
	{
		printf("申請(qǐng)內(nèi)存失??!\n");
		exit(-1);
	}
	s->size = 0;
	s-> capacity = 1;
}

尾插

然后就開始pushback 尾插操作:

void pushback(st* s, type x)
{
	assert(s);//空指針判斷
	s->a[s->size] = x;
	s->size++;
}

還是老規(guī)矩,assert 斷言是否為空指針,再放行。往下就簡(jiǎn)單的,把x的值放入數(shù)組的size 位置上,讓 size ++即可。

但是 malloc 這種的指針是指向獨(dú)立不連續(xù)的空間,我們監(jiān)視窗口觀察也只能看到一個(gè)個(gè)不連續(xù)的值,所以還是要老老實(shí)實(shí)搞一個(gè)打印函數(shù),和數(shù)組一樣,直接遍歷一下我們++過(guò)的size即可:

void print(st* s)
{
	assert(s);
	int i = 0;
	for(i = 0; i < s->size; i++)
	{
		printf("%d ", s->a[i]);
	}
}

結(jié)果如下:

在這里插入圖片描述

格局打開

但是奇不奇怪,我 capacity 初始設(shè)定為 1,而我卻尾插了兩個(gè)數(shù)還沒(méi)有報(bào)錯(cuò),為什么捏?其實(shí)報(bào)錯(cuò)了一定是你越界了,但沒(méi)有報(bào)錯(cuò)不代表你就沒(méi)有越界,往往有些越界是檢查不出來(lái)的,因?yàn)檫€沒(méi)走到檢查的點(diǎn)上;就好比咱卷了不一定成功但不卷就一定不會(huì)成功。
所以我們的邏輯就要進(jìn)行更替:

	if (s->size >= s->capacity)
		s->capacity++; 

在assert 后加上 if 判斷句,讓容量隨有效位及時(shí)更新,但是又有一個(gè)問(wèn)題,當(dāng)我數(shù)據(jù)量非常大時(shí),我們使用一位開辟一位的方法讓 capacity++ 非常頻繁,但一下子開辟一大片空間有會(huì)浪費(fèi)資源,到后面已有數(shù)據(jù)越多開辟越大浪費(fèi)的越多怎么辦呢?我們比較普遍的做法就是開辟 2 倍:

	if (s->size == s->capacity)
	{
		s->capacity *= 2;
		s->a = (type*)realloc(s->a, sizeof(type) * s->capacity);
	}

這里敏感的朋友應(yīng)該張口就來(lái)realloc,realloc函數(shù)會(huì)對(duì)已有空間直接擴(kuò)容,但不一定是原地?cái)U(kuò)容,后面有足夠的空間就會(huì)原地?cái)U(kuò)容,但是不夠就會(huì)找一塊新的空間將數(shù)據(jù)拷貝過(guò)去再釋放掉原來(lái)空間。上面代碼將原來(lái)的空間給realloc,再增容到我要的空間,就能很好的滿足我們的要求。

尾刪

尾刪沒(méi)什么技術(shù)含量,和我們數(shù)組的思路一樣

void popback(st* s)
{
	assert(s);
	s->size--;
}

結(jié)果如下:

在這里插入圖片描述

以此類推,頭插頭刪是一個(gè)道理,不做贅述,更多關(guān)于C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)順序表增刪改的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程

    C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程

    本文主要介紹了C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • c++ lambda捕獲this 導(dǎo)致多線程下類釋放后還在使用的錯(cuò)誤問(wèn)題

    c++ lambda捕獲this 導(dǎo)致多線程下類釋放后還在使用的錯(cuò)誤問(wèn)題

    Lambda表達(dá)式是現(xiàn)代C++的一個(gè)語(yǔ)法糖,挺好用的。但是如果使用不當(dāng),會(huì)導(dǎo)致內(nèi)存泄露或潛在的崩潰問(wèn)題,這里總結(jié)下c++ lambda捕獲this 導(dǎo)致多線程下類釋放后還在使用的錯(cuò)誤問(wèn)題,感興趣的朋友一起看看吧
    2023-02-02
  • C語(yǔ)言內(nèi)存泄露很嚴(yán)重的解決方案

    C語(yǔ)言內(nèi)存泄露很嚴(yán)重的解決方案

    這篇文章主要介紹了C語(yǔ)言內(nèi)存泄露很嚴(yán)重的解決方案,預(yù)防內(nèi)存泄漏問(wèn)題有多種方法,比如加強(qiáng)代碼檢視、工具檢測(cè)和內(nèi)存測(cè)試等,下面文章總結(jié)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • C語(yǔ)言中sscanf()函數(shù)的字符串格式化用法

    C語(yǔ)言中sscanf()函數(shù)的字符串格式化用法

    這篇文章介紹的是C語(yǔ)言中sscanf()函數(shù),本文介紹了sscanf()函數(shù)的含義與用法,對(duì)大家日常使用C語(yǔ)言的sscanf()函數(shù)很有幫助,有需要的可以參考借鑒。
    2016-08-08
  • c++primer:變量和基本類型詳解

    c++primer:變量和基本類型詳解

    今天小編就為大家分享一篇關(guān)于C++Primer中變量和基本類型的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-08-08
  • C?語(yǔ)言的弱符號(hào)與弱引用你了解嗎

    C?語(yǔ)言的弱符號(hào)與弱引用你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C?語(yǔ)言弱符號(hào)與弱引用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C++ Qt開發(fā)之PushButton按鈕組件的使用詳解

    C++ Qt開發(fā)之PushButton按鈕組件的使用詳解

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,本文將重點(diǎn)介紹QPushButton按鈕組件的常用方法及靈活運(yùn)用,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • C++報(bào)錯(cuò):Segmentation Fault的解決方案

    C++報(bào)錯(cuò):Segmentation Fault的解決方案

    段錯(cuò)誤(Segmentation Fault)是 C++ 編程中常見且令人頭疼的錯(cuò)誤之一,段錯(cuò)誤通常發(fā)生在程序試圖訪問(wèn)未被允許的內(nèi)存區(qū)域時(shí),導(dǎo)致程序崩潰,本文將深入探討段錯(cuò)誤的產(chǎn)生原因、檢測(cè)方法及其預(yù)防和解決方案,需要的朋友可以參考下
    2024-07-07
  • C++ 中boost::share_ptr智能指針的使用方法

    C++ 中boost::share_ptr智能指針的使用方法

    這篇文章主要介紹了C++ 中boost::share_ptr智能指針的使用方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • Visual?Studio?2022?安裝低版本?.Net?Framework的圖文教程

    Visual?Studio?2022?安裝低版本?.Net?Framework的圖文教程

    這篇文章主要介紹了Visual?Studio?2022?如何安裝低版本的?.Net?Framework,首先打開?Visual?Studio?Installer?可以看到vs2022?只支持安裝4.6及以上的版本,那么該如何安裝4.6以下的版本,下面將詳細(xì)介紹,需要的朋友可以參考下
    2022-09-09

最新評(píng)論

福清市| 德安县| 宁阳县| 宁夏| 邯郸县| 西城区| SHOW| 达尔| 嘉鱼县| 黑山县| 隆子县| 当雄县| 朝阳市| 建湖县| 巨野县| 麦盖提县| 兴义市| 萨嘎县| 江达县| 从江县| 介休市| 郯城县| 绥阳县| 开原市| 康乐县| 肃北| 新民市| 霍林郭勒市| 株洲县| 衡阳县| 永春县| 朔州市| 武川县| 华蓥市| 福清市| 灵台县| 察哈| 泽库县| 城固县| 罗定市| 安阳市|