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

數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本章會(huì)介紹的知識(shí)點(diǎn)如下圖:

數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

?

?1: 順序表的概念:順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)的線性結(jié)構(gòu),通常我們使用數(shù)組來(lái)表示,對(duì)數(shù)組進(jìn)行增刪查改。

? ? ? ? ? ? ? ? ?順序表的結(jié)構(gòu):邏輯結(jié)構(gòu)與物理結(jié)構(gòu)都是內(nèi)存中一塊連續(xù)開辟的空間,都是11對(duì)應(yīng)的線性結(jié)構(gòu)。

2: 順序表的兩種定義方式:靜態(tài)的順序表與動(dòng)態(tài)的順序表,一般情況下我們很少會(huì)用靜態(tài)的順序表,因?yàn)殪o態(tài)的順序表會(huì)將空間固定,導(dǎo)致如果我們使用順序表的時(shí)候可能會(huì)浪費(fèi)很多的空間,也可能在我們?cè)鋈莸臅r(shí)候會(huì)出現(xiàn)空間不夠的情況,這種情況下如果我們還是在繼續(xù)使用的話那么數(shù)組將會(huì)越界這種情況是error的。

兩種定義順序表的方式代碼如下

? ? ? ? 靜態(tài)的順序表????????

typedef int SqListDataType;//這里是給我們的順序表元素的類型起個(gè)名字
//							 假設(shè)元素是其他類型我們就可以修改這里
//靜態(tài)的
struct SqList1
{
	SqListDataType arr1[1000];//開辟了一個(gè)整形的數(shù)組
	int size;//用來(lái)記錄順序表當(dāng)前使用了多少的空間
};

動(dòng)態(tài)的順序表:

????????

struct SqList2
{
	SqListDataType* arr2;
	int size;
	int Capacity;//用來(lái)記錄當(dāng)前數(shù)組開辟了多少個(gè)空間
};

在這兩種結(jié)構(gòu)中通常我們是會(huì)選擇動(dòng)態(tài)的順序表來(lái)管理數(shù)據(jù)的。

3:順序表的接口實(shí)現(xiàn):

我們最終選擇這個(gè)定義的順序表?

數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

????????1:這個(gè)接口的定義是應(yīng)為當(dāng)我們?cè)谠黾釉氐臅r(shí)候我們所存儲(chǔ)的元素會(huì)變多,總有一種情況下我們空間會(huì)慢,所以這時(shí)候我們就需要擴(kuò)容,使用了realloc這個(gè)函數(shù)擴(kuò)容有兩種情況,一種是原地?cái)U(kuò),一種是換個(gè)空間擴(kuò)。不管怎么樣我們都定義一個(gè)空間,用來(lái)存儲(chǔ)新開辟的地址,讓后在給ps

//檢查容量的代碼
void check_capacity(SqList* ps)
{
	assert(ps);
	//空間不夠,擴(kuò)容,一次擴(kuò)兩倍
	if (ps->Capacity == ps->size)
	{

		SqListDataType* tmp=(SqListDataType*)realloc(ps->arr, (ps->Capacity)* 2*sizeof(SqListDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		else
		{
			printf("擴(kuò)容成功\n");
			ps->arr = tmp;
			ps->Capacity *= 2;
		}
	}
	
}

2:頭插思路:先檢查空間是否足夠,在從后往前移動(dòng)元素,將第一個(gè)位置出來(lái),最后在添加元素即可。

void PushFrontSqList(SqList* ps, SqListDataType x)
{
	//先檢查空間夠不夠,空間不夠擴(kuò)容
	check_capacity(ps);//先判斷空間是否滿了
	//先移動(dòng)元素
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}
	ps->arr[0] = x;
	ps->size++;
}

上述代碼的意思如下圖:

????????數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

?3:尾插思路:這個(gè)挺簡(jiǎn)單的,我們只要在size位置插入即可,size在++即可,這里要注意的就是我們插入要以數(shù)組的下標(biāo)。

代碼:

void PushBackSqList(SqList* ps, SqListDataType x)
{
	assert(ps);
	check_capacity(ps);
	ps->arr[ps->size] = x;
	ps->size++;
	//SqListInsert(ps, ps->size, x);
}

?4:頭刪思路:我們首先得判斷順序表是否有元素,如果有的話才能進(jìn)行刪除,我們只需要遍歷數(shù)組從前往后將后一個(gè)元素移動(dòng)到前一個(gè)就行,這里需要注意的就是我們移動(dòng)時(shí)位置的不同可能導(dǎo)致代碼的不一樣,而我的代碼是從第一個(gè)開始所以我最后的位置因該是size-2處,然后size--就可以了。

代碼:

void PopFrontSqList(SqList* ps)
{
	assert(ps);
	assert(ps->size > 0);
	int i = 0;
	for (i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

5:尾刪思路:這個(gè)挺簡(jiǎn)單的,首先還是得判斷順序表是否存在元素,如果有將size--就行了。

代碼:

void PopBackSqList(SqList* ps)
{
	assert(ps);
	assert(ps->size > 0);
	ps->size--;
}

6:順序表得查找思路:遍歷數(shù)組就行了,如果存在則返回下標(biāo),如果不存在我們返回-1.

代碼:

int FindSqList(SqList* ps, SqListDataType x)
{
    assert(ps);//防止ps沒(méi)有意義
	//思路:遍歷順序表找
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	//未找到
	printf("未找到\n");
	return -1;
}

7:順序表插入思路:在pos位置處插入一個(gè)元素,pos為下標(biāo),首先先我們得判斷pos是否存在,如果存在我們先從前往后將元素向后移動(dòng),然后在pos位置處插入即可。

代碼:

void SqListInsert(SqList* ps, int pos, SqListDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	check_capacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}
	ps->arr[pos] = x;
	ps->size++;
}

圖:數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

?8:順序表的刪除思路:先判斷,pos是否在順序表中,我們只要從前完后移動(dòng)pos后面的元素即可,然后我們?cè)诎裺ize--;

代碼:

void SqListErase(SqList* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	int i = pos;
	for (i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

9:順序表的修改思路:先判斷,pos是否在順序表中,然后在根據(jù)數(shù)組隨機(jī)訪問(wèn)的特點(diǎn)修改即可。

代碼:

void ModifySqlist(SqList* ps, int pos, SqListDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	ps->arr[pos] = x;

}

10:打?。罕闅v數(shù)組即可

代碼:

void SqListPrint(SqList* ps)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

11:銷毀順序表這一步也不能省略,防止內(nèi)存泄漏。

代碼:

//銷毀
void DestorySqList(SqList* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->Capacity = ps->size = 0;
}

以上就是順序表的大致結(jié)構(gòu)了。

通過(guò)上面我們可以發(fā)現(xiàn):順序表適合尾插,尾刪,修改,這是因?yàn)轫樞虮黼S機(jī)訪問(wèn)的特點(diǎn)造成的。

? ? ? ? 本章完,感謝大家的觀看。

????????數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-665510.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu):手撕順序表---順序表增刪查改尋找功能的實(shí)現(xiàn)

    順序表作為數(shù)據(jù)結(jié)構(gòu)的入門知識(shí),整體知識(shí)較為簡(jiǎn)單,主要對(duì)動(dòng)態(tài)內(nèi)存開辟 結(jié)構(gòu)體 指針有要求,其余難度較低 順序表主要需要實(shí)現(xiàn)的有順序表的增刪查改和定向搜索銷毀等,具體實(shí)現(xiàn)函數(shù)如下 要實(shí)現(xiàn)順序表,就需要對(duì)順序表進(jìn)行定義,在c語(yǔ)言中通常使用結(jié)構(gòu)體進(jìn)行寫入,

    2024年02月15日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)之手撕順序表(講解?源代碼)

    數(shù)據(jù)結(jié)構(gòu)之手撕順序表(講解?源代碼)

    ????????在本章之后,就要求大家對(duì)于指針、結(jié)構(gòu)體、動(dòng)態(tài)開辟等相關(guān)的知識(shí)要熟練的掌握,如果有小伙伴對(duì)上面相關(guān)的知識(shí)還不是很清晰,要先弄明白再過(guò)來(lái)接著學(xué)習(xí)哦! ????????那進(jìn)入正題,在講解順序表之前,我們先來(lái)介紹線性表這個(gè)數(shù)據(jù)結(jié)構(gòu)。 ????????線

    2024年02月08日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列詳解(C語(yǔ)言手撕)

    數(shù)據(jù)結(jié)構(gòu)之隊(duì)列詳解(C語(yǔ)言手撕)

    ??個(gè)人名片: ??作者簡(jiǎn)介:一名樂(lè)于分享在學(xué)習(xí)道路上收獲的大二在校生 ??個(gè)人主頁(yè)??:GOTXX ??個(gè)人WeChat:ILXOXVJE ??本文由GOTXX原創(chuàng),首發(fā)CSDN?????? ??系列專欄:零基礎(chǔ)學(xué)習(xí)C語(yǔ)言----- 數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)之路----C++的學(xué)習(xí)之路 ??每日一句:如果沒(méi)有特別幸運(yùn),那就請(qǐng)?zhí)?/p>

    2024年03月10日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解(C語(yǔ)言手撕)

    數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解(C語(yǔ)言手撕)

    ? ??文章簡(jiǎn)介: 概念:鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的 從圖片中可以看出,鏈表的每個(gè)節(jié)點(diǎn)都是一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體中有一個(gè)存儲(chǔ)數(shù)據(jù)的變量和一個(gè)指向下一節(jié)點(diǎn)的結(jié)構(gòu)體指針; 在邏輯上

    2024年03月10日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)之棧詳解(C語(yǔ)言手撕)

    數(shù)據(jù)結(jié)構(gòu)之棧詳解(C語(yǔ)言手撕)

    ??個(gè)人名片: ??作者簡(jiǎn)介:一名樂(lè)于分享在學(xué)習(xí)道路上收獲的大二在校生 ??個(gè)人主頁(yè)??:GOTXX ??個(gè)人WeChat:ILXOXVJE ??本文由GOTXX原創(chuàng),首發(fā)CSDN?????? ??系列專欄:零基礎(chǔ)學(xué)習(xí)C語(yǔ)言----- 數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)之路----C++的學(xué)習(xí)之路 ??每日一句:如果沒(méi)有特別幸運(yùn),那就請(qǐng)?zhí)?/p>

    2024年03月19日
    瀏覽(22)
  • 追夢(mèng)之旅【數(shù)據(jù)結(jié)構(gòu)篇】——C語(yǔ)言手撕八大經(jīng)典排序

    追夢(mèng)之旅【數(shù)據(jù)結(jié)構(gòu)篇】——C語(yǔ)言手撕八大經(jīng)典排序

    ? ? ??博客昵稱:博客小夢(mèng) ??最喜歡的座右銘:全神貫注的上吧?。?! ??作者簡(jiǎn)介:一名熱愛C/C++,算法等技術(shù)、喜愛運(yùn)動(dòng)、熱愛K歌、敢于追夢(mèng)的小博主! ??博主小留言:哈嘍! ??各位CSDN的uu們,我是你的博客好友小夢(mèng),希望我的文章可以給您帶來(lái)一定的幫助,話不

    2024年02月17日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)入門(C語(yǔ)言版)一篇文章教會(huì)你手撕八大排序

    數(shù)據(jù)結(jié)構(gòu)入門(C語(yǔ)言版)一篇文章教會(huì)你手撕八大排序

    排序 :所謂排序,就是使一串記錄,按照其中的某個(gè)或某些的大小,遞增或遞減的排列起來(lái)的操作。 穩(wěn)定性 :假定在待排序的記錄序列中,存在多個(gè)具有相同的的記錄,若經(jīng)過(guò)排序,這些記錄的相對(duì)次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而

    2024年02月01日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)<順序表>】C語(yǔ)言

    【數(shù)據(jù)結(jié)構(gòu)<順序表>】C語(yǔ)言

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

    2024年02月05日
    瀏覽(24)
  • [數(shù)據(jù)結(jié)構(gòu) - C語(yǔ)言] 順序表

    [數(shù)據(jù)結(jié)構(gòu) - C語(yǔ)言] 順序表

    目錄 1、線性表 2、順序表 2.1 順序表的概念 2.2 接口 3、接口實(shí)現(xiàn) 3.1 初始化 3.2 銷毀 3.3 容量檢測(cè) 3.4 打印數(shù)據(jù) 3.5 順序表的頭插 3.6 順序表的尾插 3.7 順序表的頭刪、尾刪 3.8 順序表查找 3.9 指定位置插入數(shù)據(jù) 線性表(linear list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 線性

    2023年04月21日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)——順序表(C語(yǔ)言)

    數(shù)據(jù)結(jié)構(gòu)——順序表(C語(yǔ)言)

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

    2024年02月13日
    瀏覽(37)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包