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

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

 更新時間:2022年02月15日 10:03:39   作者:喬喬家的龍龍  
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)順序表中增刪改關(guān)于頭插頭刪的教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

頭插操作

繼上一章內(nèi)容(C語言數(shù)據(jù)結(jié)構(gòu)順序表中的增刪改教程示例詳解),繼續(xù)講講順序表的基礎(chǔ)操作。

和尾插不一樣,尾插出手闊綽直接的開空間,咱頭插能開嗎?好像沒聽說過哪個接口可以在數(shù)據(jù)前面開一片空間吧,那我們思路就只有一個了——挪數(shù)據(jù)。那應(yīng)該從第一位開始挪嗎?注意,這和 memcpy 函數(shù)機制是一樣的,并不意味著后面數(shù)據(jù)一起挪動,也不會彼此獨立,而是相互影響,挪動的數(shù)據(jù)會對后面數(shù)據(jù)進行覆蓋。

在這里插入圖片描述

那我們的邏輯就應(yīng)該是從后往前挪,那我們就直接定一個下標,指向這段空間的最后一個位置即可,再利用香香 while 循環(huán)一手:

void pushfront(st* s, type x)
{
	assert(s);
	int end = s->size - 1;
	while (end >= 0)
	{
		s->a[end + 1] = s->a[end];//將從后往前的數(shù)據(jù)都向后挪一位
		end--;
	}
	s->a[0] = x;
	s->size++;
}

我們的 end 下標不是指向 size ,而是size后面一位也就是我們初始的capacity,end = 0時處理的是第一位之后的數(shù)據(jù),那么我們while循環(huán)時就應(yīng)該循環(huán)到 end<0為止。挪完了就可以sei數(shù)據(jù),最后不要忘了讓size++。
結(jié)果如下:

在這里插入圖片描述


我們?nèi)绻麑χ皩懳膊鍟r的細節(jié)記得的話,我們是需要有擴容操作的,這么寫過去寫過來很難受啊,我們就直接做成接口直接調(diào)用豈不美哉?

void enough(st* s)
{
	if (s->size == s->capacity)
	{
		s->capacity *= 2;
		s->a = (type*)realloc(s->a, sizeof(type) * s->capacity);
		if (s->a == NULL)
		{
			printf("擴容失敗\n");
			exit(0);
		}
	}
}

頭刪操作

一樣的,在頭刪操作時不僅要像尾刪一樣置0,還得把數(shù)據(jù)挪回去,注意是從前往后挪,不然數(shù)據(jù)又會被覆蓋,最后size–一下就搞定:

void popfront(st* s)
{
	assert(s);
	enough(s);
	int head = 0;
	while (head < s->size - 1)
	{
		s->a[head] = s->a[head + 1]; //從前往后的數(shù)據(jù)依次向前挪一位
		head++;
	}
	s->size--;
}

結(jié)果如下:

在這里插入圖片描述

小結(jié)

綜上所述,順序表其實就是在數(shù)組的基礎(chǔ)上保留了一個特性——數(shù)據(jù)是連續(xù)的,但又擺脫了數(shù)組固定大小的限制,他適應(yīng)性超強,隨插隨刪隨改。

但是順序表不是十全十美,我們數(shù)據(jù)量足夠龐大,比如已有一萬條數(shù)據(jù)的空間,我要插入一萬零一條,增容就會增到兩萬,空間浪費率極高。另外,尾插尾刪操作是很快的,直接放入拿走數(shù)據(jù),這是順序表最常見的操作,這是他的特長。

但是話說回來,頭插頭刪也很快嗎?顯然不是,頭插頭刪的時間復(fù)雜度是O(n), 代價全在數(shù)據(jù)挪動上,所以如果要想不挪動的話,就要涉及到鏈表的引入。但鏈表在二分查找,排序等方面都有致命缺陷,他不能隨機訪問,所以鏈表和順序表是相輔相成的。

今天就先到這里吧,摸了家人們,更多關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)順序表增刪改的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C語言中結(jié)構(gòu)體(struct)的用法

    詳解C語言中結(jié)構(gòu)體(struct)的用法

    這篇文章主要為大家詳細介紹了C語言中結(jié)構(gòu)體(struct)的用法,文中的示例代碼講解詳細,對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下
    2022-08-08
  • C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實現(xiàn)方法

    C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實現(xiàn)方法

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實現(xiàn)方法,簡單說明了哈夫曼樹的原理,并結(jié)合具體實例形式分析了C++實現(xiàn)哈夫曼樹的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • C語言數(shù)組a和&a的區(qū)別講解

    C語言數(shù)組a和&a的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于C語言數(shù)組a和&a的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++實現(xiàn)Matlab的zp2tf函數(shù)的示例代碼

    C++實現(xiàn)Matlab的zp2tf函數(shù)的示例代碼

    matlab?的?zp2tf?函數(shù)的作用是將極點形式的?H(s)?函數(shù)的分母展開,本文主要為大家介紹了C++實現(xiàn)Matlab的zp2tf函數(shù)示例代碼,需要的可以參考一下
    2023-04-04
  • C++ 設(shè)置透明背景圖片

    C++ 設(shè)置透明背景圖片

    這篇文章主要介紹了C++ 設(shè)置透明背景圖片的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++中std的使用及說明

    C++中std的使用及說明

    這篇文章主要介紹了C++中std的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Qt創(chuàng)建項目實戰(zhàn)之手把手創(chuàng)建第一個Qt項目

    Qt創(chuàng)建項目實戰(zhàn)之手把手創(chuàng)建第一個Qt項目

    我們在進行軟件開發(fā)學(xué)習(xí)時,有時候需要qt軟件進行代碼的敲寫,下面這篇文章主要給大家介紹了關(guān)于Qt創(chuàng)建項目實戰(zhàn)之手把手創(chuàng)建第一個Qt項目的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • Opencv實現(xiàn)讀取攝像頭和視頻數(shù)據(jù)

    Opencv實現(xiàn)讀取攝像頭和視頻數(shù)據(jù)

    這篇文章主要為大家詳細介紹了Opencv實現(xiàn)讀取攝像頭和視頻數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++的std::transform()的實現(xiàn)

    C++的std::transform()的實現(xiàn)

    在 C++ 標準庫中,std::transform() 是一個非常有用的算法函數(shù),它能夠?qū)⒔o定范圍中的每個元素進行變換,并將變換后的結(jié)果存儲到另一個范圍中,本文就詳細的介紹一下具體用法,感興趣的可以了解一下
    2023-08-08
  • C++11實現(xiàn)簡易定時器的示例代碼

    C++11實現(xiàn)簡易定時器的示例代碼

    這篇文章主要介紹了C++11實現(xiàn)簡易定時器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論