国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

順序表和鏈表從零詳細梳理(順序表篇)

這篇具有很好參考價值的文章主要介紹了順序表和鏈表從零詳細梳理(順序表篇)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、線性表

線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構,常見的線性表:順序表、鏈表、棧、隊列、字符串…
線性表在邏輯上是線性結(jié)構,也就說是連續(xù)的一條直線。但是在物理結(jié)構上并不一定是連續(xù)的,線性表在物理上存儲時,通常以數(shù)組鏈式結(jié)構的形式存儲。

下面借助圖形直觀感受一下順序表和鏈表的結(jié)構:
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言

2、順序表

2.1 概念和結(jié)構

順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構,一般情況下采用數(shù)組存儲。在數(shù)組上完成數(shù)據(jù)的增刪查改。
順序表有靜態(tài)和動態(tài)兩種。
1.靜態(tài)順序表:使用定長數(shù)組存儲元素。
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言
2.動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲元素。
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言
其中在存儲過程中都會存在空間不夠的情況,通常情況下我們用realloc(C語言的一個重點,后面復習會單獨寫博客來詳細介紹)來擴容。

其中呢,realloc有兩種擴容方式:
a.原地擴容:其效率非常高。
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言

b.異地擴容:相較于原地擴容來講,效率會低一些。
要用到異地擴容的原因是因為后面的空間已經(jīng)分配給別人了,所以此方法是將原有空間拷貝到異地,再將原空間釋放,最終會返回新的地址。

因此要判斷擴容類型也很簡單:
只需要驗證返回地址即可。
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言
下面我們一起通過兩個例子看看如何通過地址判斷是原地擴容還是異地擴容。

原地擴容:
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言
異地擴容:
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言
注意一點: realloc在異地擴容的時候,會自動釋放空間,不需要我們?nèi)ヅ袛嗫臻g是否相等來決定是否需要釋放。

2.2 接口實現(xiàn)

靜態(tài)順序表只適用于確定知道需要存多少數(shù)據(jù)的場景。靜態(tài)順序表的定長數(shù)組導致N定大了,空
間開多了浪費,開少了不夠用。所以現(xiàn)實中基本都是使用動態(tài)順序表,根據(jù)需要動態(tài)的分配空間
大小,所以下面我們實現(xiàn)動態(tài)順序表。

typedef int SLDataType;
// 順序表的動態(tài)存儲
typedef struct SeqList
{
SLDataType* array; // 指向動態(tài)開辟的數(shù)組
size_t size ; // 有效數(shù)據(jù)個數(shù)
size_t capicity ; // 容量空間的大小
}SL;
// 基本增刪查改接口
// 順序表初始化
void SLInit(SeqList* psl);
// 檢查空間,如果滿了,進行增容
void SLCheckCapacity(SeqList* psl);
// 順序表尾插
void SLPushBack(SeqList* psl, SLDataType x);
// 順序表尾刪
void SLPopBack(SeqList* psl);
// 順序表頭插
void SLPushFront(SeqList* psl, SLDataType x);
// 順序表頭刪
void SLPopFront(SeqList* psl);
// 順序表查找
int SLFind(SeqList* psl, SLDataType x);
// 順序表在pos位置插入x
void SLInsert(SeqList* psl, size_t pos, SLDataType x);
// 順序表刪除pos位置的值
void SLErase(SeqList* psl, size_t pos);
// 順序表銷毀
void SLDestory(SeqList* psl);
// 順序表打印
void SLPrint(SeqList* psl);

有了整體框架之后,我們就能更清晰地去實現(xiàn)順序表了。
下面讓我們一起各接口的具體實現(xiàn)方法吧!

2.2.1 順序表初始化、銷毀與打印

void SLInit(SL* psl)//初始化
{
	assert(psl);

	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}

void SLDestroy(SL* psl)
{
	assert(psl);

	if (psl->a != NULL)
	{
		free(psl->a);
		psl->a = NULL;
		psl->size = 0;
		psl->capacity = 0;
	}
}

void SLPrint(SL* psl)
{
	assert(psl);

	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

2.2.2 檢查空間容量(是否增容)

在這個地方我們加入一個 SLCheckCapacity 函數(shù)實現(xiàn)該接口功能。

void SLCheckCapacity(SL* psl)
{
	assert(psl);

	if (psl->size == psl->capacity)
	{
		int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		psl->a = tmp;
		psl->capacity = newCapacity;
	}
}

2.3 順序表頭插尾插

首先我們來看尾插,尾插就直接在后空間插入,空間不夠的話有SLCheckCapacity函數(shù)接口檢查,自動擴容插入就OK了。咱們直接上代碼:

void SLPushBack(SL* psl, SLDataType x)
{
	assert(psl);

	SLCheckCapacity(psl);

	psl->a[psl->size] = x;
	psl->size++;
}

但是頭插就不太一樣了,因為我們沒有向前擴容的說法,更不允許這么做。所以我們想完成頭插,就要挪動數(shù)據(jù)(將前面的數(shù)據(jù)往后挪)。
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言
特別注意:size是指向最后一個數(shù)據(jù)的下一個位置

void SLPushFront(SL* psl, SLDataType x)
{
	assert(psl);

	SLCheckCapacity(psl);

	// 挪動數(shù)據(jù)
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}

	psl->a[0] = x;
	psl->size++;
}

2.4 順序表的頭刪尾刪

就如下圖所示,想要把最后一個數(shù)據(jù)刪除,我們只要把size從之前的5改為4就可以了,這其實就代表了改動之后只有前4個數(shù)據(jù)是有效的。

順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言
有一點需要注意:在這個地方,被刪掉的數(shù)據(jù)的內(nèi)存不需要free,也不能free。

原因是:申請的空間如果要釋放,那么就要全部釋放,不能只釋放一個內(nèi)存單元。(這樣就不連續(xù)了)
同時呢,如果我們還要進行頭尾查,被刪除的數(shù)據(jù)所留下的那處空間也會被重新覆蓋,不必麻煩。

OK,根據(jù)上述思路上代碼:

void SLPopBack(SL* psl)
{
	assert(psl);

	// 空
	// 溫柔的檢查
	/*if (psl->size == 0)
	{
		return;
	}*/

	// 暴力檢查:如果size小于0直接報錯
	assert(psl->size > 0);
	
	psl->size--;
}

頭刪其實原理差不多了

void SLPopFront(SL* psl)
{
	assert(psl);

	// 暴力檢查
	assert(psl->size > 0);

	int begin = 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}

	psl->size--;
}

2.5 順序表插入(在pos插入x)

原理同樣有挪動的思想在里面
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言

void SLInsert(SL* psl, int pos, SLDataType x)
{
	assert(psl);
	assert(pos >= 0 && pos <= psl->size);

	SLCheckCapacity(psl);

	// 挪動數(shù)據(jù)
	int end = psl->size - 1;
	while (end >= pos)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}

	psl->a[pos] = x;
	psl->size++;
}//pos是下標,size是數(shù)據(jù)個數(shù),如果看做下標的話,它是最后一個數(shù)據(jù)的下一個位置

2.6 順序表在pos處消除x

思想:后一個數(shù)據(jù)往前面一個數(shù)據(jù)覆蓋(挪動覆蓋)
順序表和鏈表從零詳細梳理(順序表篇),數(shù)據(jù)結(jié)構與算法,鏈表,數(shù)據(jù)結(jié)構,c語言

void SLErase(SL* psl, int pos)
{
	assert(psl);
	assert(pos >= 0 && pos < psl->size);

	// 挪動覆蓋
	int begin = pos + 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}

	psl->size--;
}

好的,咱們這篇博客就先到這里了,有不足或錯誤的地方歡迎朋友們指正,感謝支持,謝謝!
咱們下篇博客見~~文章來源地址http://www.zghlxwxcb.cn/news/detail-836716.html

到了這里,關于順序表和鏈表從零詳細梳理(順序表篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據(jù)結(jié)構2:順序表和鏈表

    數(shù)據(jù)結(jié)構2:順序表和鏈表

    目錄 1.線性表 2.順序表 2.1概念及結(jié)構 2.2接口實現(xiàn) 2.3數(shù)據(jù)相關面試題 2.4順序表的問題及思考 3.鏈表 3.1鏈表的概念及結(jié)構 3.2鏈表的分類 3.3鏈表的實現(xiàn) 3.4鏈表面試題 3.5雙向鏈表的實現(xiàn) 4.順序表和鏈表的區(qū)別 線性表(linear list)是具有相同特征的數(shù)據(jù)元素的有限序列。線性表是

    2023年04月17日
    瀏覽(93)
  • 數(shù)據(jù)結(jié)構:2_順序表和鏈表

    數(shù)據(jù)結(jié)構:2_順序表和鏈表

    線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構, 常見的線性表:順序表、鏈表、棧、隊列、字符串… 線性表在邏輯上是線性結(jié)構,也就說是連續(xù)的一條直線。但是在物理結(jié)構上并不一定是連續(xù)的 ,線性表在物理上

    2024年01月18日
    瀏覽(100)
  • 順序表和鏈表對應的經(jīng)典算法

    順序表和鏈表對應的經(jīng)典算法

    目錄 一,移除元素 二,合并兩個有序數(shù)組 三,環(huán)形鏈表的約瑟夫問題 四,鏈表的中間節(jié)點 五,合并兩個有序鏈表 六,反轉(zhuǎn)鏈表 七,移除鏈表元素 一,移除元素 思路:定義一個循環(huán)遍歷數(shù)組,如果遇到的不是val就記錄下來這個元素,如果不是就跳過 定義兩個指針,一個用

    2024年02月21日
    瀏覽(23)
  • 順序表和鏈表的練習題

    順序表和鏈表的練習題

    該題目需要先對順序表進行遍歷至元素x正確插入位置,再對順序表完成插入操作。因此涉及到for循環(huán)與if語句的使用 該題目需要對順序表制定元素刪除,并且還需要返回值。所以定義的函數(shù)接口不能為void類型,使用for循環(huán)對p后繼順序表元素進行遍歷前移,且考慮可能出現(xiàn)刪

    2024年04月22日
    瀏覽(94)
  • 【數(shù)據(jù)結(jié)構初階】順序表和鏈表(1)

    【數(shù)據(jù)結(jié)構初階】順序表和鏈表(1)

    線性表(linear list) 是n個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使 用的數(shù)據(jù)結(jié)構,常見的線性表:順序表、鏈表、棧、隊列、字符串… 線性表在邏輯上是線性結(jié)構,也就說是連續(xù)的一條直線。但是在物理結(jié)構上并不一定是連續(xù)的,線性表在物理上

    2024年02月08日
    瀏覽(1598)
  • 【手撕數(shù)據(jù)結(jié)構】(三)順序表和鏈表

    【手撕數(shù)據(jù)結(jié)構】(三)順序表和鏈表

    ???線性表是n個具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構,常見的線性表:順序表、鏈表、棧、隊列、字符串… ???線性表在邏輯上是線性結(jié)構,也就說是一條連續(xù)的直線。但是在物理結(jié)構上并不一定是連續(xù)的,線性表在物理上存儲

    2024年02月05日
    瀏覽(97)
  • 數(shù)據(jù)結(jié)構奇妙旅程之順序表和鏈表

    數(shù)據(jù)結(jié)構奇妙旅程之順序表和鏈表

    ??????? write in front???????? ?????????大家好,我是xiaoxie.希望你看完之后,有不足之處請多多諒解,讓我們一起共同進步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie??????????原創(chuàng) CSDN?如需轉(zhuǎn)載還請通知???? 個人主頁:xiaoxie??

    2024年02月05日
    瀏覽(99)
  • 數(shù)據(jù)結(jié)構修煉第二篇:順序表和鏈表

    數(shù)據(jù)結(jié)構修煉第二篇:順序表和鏈表

    第一章 時間復雜度和空間復雜度 第二章 順序表,列表 第三章 棧和隊列 第四章 二叉樹 第五章 排序 作者:??樂言?? 簡介:??大一學生,目前在致力于c/c++/python,高數(shù)的學習,有問題盡管問我,關注后私聊! 持續(xù)更新專欄:《c進階》,《數(shù)據(jù)結(jié)構修煉》 ?? (優(yōu)質(zhì)好文持

    2024年02月02日
    瀏覽(583)
  • 【數(shù)據(jù)結(jié)構篇C++實現(xiàn)】- 線性表 - 順序表和鏈表

    【數(shù)據(jù)結(jié)構篇C++實現(xiàn)】- 線性表 - 順序表和鏈表

    友情鏈接:C/C++系列系統(tǒng)學習目錄 故事導入: 幼兒園放學時,一個班級的小朋友,一個跟著一個排隊出校,有一個打頭,有一個收尾,當中的小朋友每一個都知道他前面和后面的一個是誰,就如同一根線把他們串聯(lián)了起來。如此具有像線一樣的性質(zhì)的表就叫線性表 線性表(

    2024年02月07日
    瀏覽(98)
  • 初階數(shù)據(jù)結(jié)構之---順序表和鏈表(C語言)

    初階數(shù)據(jù)結(jié)構之---順序表和鏈表(C語言)

    線性表: 線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構。線性表在邏輯上是線性結(jié)構,也就是說是連續(xù)的一條直線。但在物理上并不一定是連續(xù)的。線性表在物理上存儲時,通常以 數(shù)組 和 鏈式結(jié)構 的形式存儲。

    2024年02月22日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包