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

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

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


順序表前言

順序表作為數(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í)現(xiàn)函數(shù)如下

// 對(duì)數(shù)據(jù)的管理:增刪查改 
void SeqListInit(SeqList* ps);
void SeqListDestroy(SeqList* ps);

void SeqListPrint(SeqList* ps);
void SeqListPushBack(SeqList* ps, SLDateType x);
void SeqListPushFront(SeqList* ps, SLDateType x);
void SeqListPopFront(SeqList* ps);
void SeqListPopBack(SeqList* ps);

// 順序表查找
int SeqListFind(SeqList* ps, SLDateType x);
// 順序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDateType x);
// 順序表刪除pos位置的值
void SeqListErase(SeqList* ps, int pos);

定義順序表

要實(shí)現(xiàn)順序表,就需要對(duì)順序表進(jìn)行定義,在c語言中通常使用結(jié)構(gòu)體進(jìn)行寫入,包括順序表的容量,順序表中存在元素的個(gè)數(shù),順序表的主體

在對(duì)順序表的定義中存在兩種,如果不使用動(dòng)態(tài)內(nèi)存開辟,可以直接定義一個(gè)數(shù)組實(shí)現(xiàn)順序表,但由于數(shù)組容量是固定的,會(huì)把整個(gè)順序表固定大小,于是在這里采用動(dòng)態(tài)內(nèi)存開辟的方法實(shí)現(xiàn)順序表

首先對(duì)順序表進(jìn)行定義

typedef int SLDateType;
typedef struct SeqList
{
	SLDateType* a;
	int size;
	int capacity;
}SeqList;

接下來我們就對(duì)順序表的各項(xiàng)功能進(jìn)行依次實(shí)現(xiàn)


順序表初始化

把順序表的結(jié)構(gòu)體定義完成后就可以創(chuàng)建一個(gè)順序表了,創(chuàng)建好初始值后就要對(duì)順序表進(jìn)行一定的初始化內(nèi)容

代碼實(shí)現(xiàn)如下

void SeqListInit(SeqList* ps)
{
	assert(ps);
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->size = 0;
	ps->capacity = 4;
}

關(guān)于assert函數(shù)

assert的作用是斷言,主要是用來進(jìn)行條件判斷,例如這里檢測(cè)ps,意思就是檢測(cè)ps是否為空指針,如果ps是空指針后續(xù)的操作就不必而行了,這樣有利于檢查錯(cuò)誤信息,當(dāng)運(yùn)行到該語句結(jié)論為假時(shí),會(huì)直接終止代碼,算是暴力檢查的一種方法


順序表的銷毀

創(chuàng)建完順序表后就要對(duì)順序表進(jìn)行銷毀,銷毀的就是把它對(duì)應(yīng)的空間釋放,置空指針,返回初始值

代碼實(shí)現(xiàn)如下

void SeqListDestroy(SeqList* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

關(guān)于置空指針

一般來說,把相關(guān)空間釋放后為了避免出現(xiàn)野指針的情況要把指針置空,但不進(jìn)行指針的置空在一些情況下也是可以的,一般釋放空間后都會(huì)緊跟置空指針


打印順序表

將順序表里的信息打印到屏幕上,進(jìn)行可視化觀察有無錯(cuò)誤信息

代碼實(shí)現(xiàn)如下

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

順序表的尾插

將一個(gè)數(shù)據(jù)插入到順序表中就涉及到了順序表的尾插

思路也很簡(jiǎn)單,首先看原來順序表的容量是否滿足要求,如果不滿足就進(jìn)行一定的擴(kuò)容,再把要插入的數(shù)據(jù)放到順序表的尾部即可

如何實(shí)現(xiàn)檢查容量?

如果順序表的size和capacity是一致的,說明已經(jīng)滿了,到達(dá)上限了

因此函數(shù)實(shí)現(xiàn)如下

void SLCheckCapacity(SeqList* ps)
{
	assert(ps);
	SLDateType* tmp = NULL;
	if (ps->capacity == ps->size)
	{
		tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * ps->capacity * 2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps->a = tmp;
		ps->capacity *= 2;
		printf("擴(kuò)容成功 當(dāng)前容量%d\n", ps->capacity);
	}
}

但是由于后續(xù)還有再規(guī)定位置插入元素的情況,我們可以直接先寫在x位置插入元素的情況

因此函數(shù)實(shí)現(xiàn)就變成了實(shí)現(xiàn)在x位置插入元素

函數(shù)實(shí)現(xiàn)如下

void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (pos <= end)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size ++ ;
}

有了在x位置插入元素函數(shù)的實(shí)現(xiàn),對(duì)于在尾部插入函數(shù)只需要將x換成size即可

void SeqListPushBack(SeqList* ps, SLDateType x)
{
	assert(ps);
	SeqListInsert(ps,ps->size,x);
}

順序表的頭插

和順序表的尾插相似,當(dāng)我們有了在x位置插入元素的函數(shù)時(shí),這些需求就很好寫了

void SeqListPushFront(SeqList* ps, SLDateType x)
{
	assert(ps);
	SeqListInsert(ps, 0, x);
}

順序表的頭刪

有了前面的想法,我們也把在x位置的元素進(jìn)行刪除封裝成一個(gè)函數(shù)

函數(shù)實(shí)現(xiàn)如下

void SeqListErase(SeqList* ps, int pos)
{
	assert(pos >= 0 && pos < ps->size);
	int end = ps->size-1;
	while (pos <= end)
	{
		ps->a[pos] = ps->a[pos + 1];
		pos++;
	}
	ps->size--;
}

那么頭刪就是把標(biāo)號(hào)為0的元素刪除

具體函數(shù)實(shí)現(xiàn)如下

void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	SeqListErase(ps, 0);
}

順序表的尾刪

有了頭刪的想法,尾刪和頭刪基本一致

void SeqListPopBack(SeqList* ps)
{
	assert(ps);
	int end = ps->size - 1;
	SeqListErase(ps, end);
}

順序表定向位置查找

最簡(jiǎn)單的功能,只需要遍歷順序表即可

int SeqListFind(SeqList* ps, SLDateType x)
{
	assert(ps);
	for(int i=0;i<ps->size;i++)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;
}

整體來說順序表是數(shù)據(jù)結(jié)構(gòu)入門的部分,難度偏低文章來源地址http://www.zghlxwxcb.cn/news/detail-565632.html

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

本文來自互聯(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).C】順序表和單鏈表的增刪查改

    【數(shù)據(jù)結(jié)構(gòu).C】順序表和單鏈表的增刪查改

    寶子,你不點(diǎn)個(gè)贊嗎?不評(píng)個(gè)論嗎?不收個(gè)藏嗎? 最后的最后,關(guān)注我,關(guān)注我,關(guān)注我,你會(huì)看到更多有趣的博客哦!?。?喵喵喵,你對(duì)我真的很重要。 目錄 單鏈表增刪查改 c1.h sqlist.c number.c 單鏈表的增刪查改 ?c1.h stuscore.c c1.h sqlist.c number.c ?c1.h stuscore.c ? 寶子,你不點(diǎn)

    2024年02月11日
    瀏覽(91)
  • 詳解初階數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)——單文件文件實(shí)現(xiàn)SeqList的增刪查改

    詳解初階數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)——單文件文件實(shí)現(xiàn)SeqList的增刪查改

    目錄 一、線性表 二、順序表 2.1概念及結(jié)構(gòu) 2.2接口實(shí)現(xiàn) 2.3動(dòng)態(tài)順序表的創(chuàng)建 2.3動(dòng)態(tài)順序表的初始化 2.3.1傳值初始化 2.3.2傳址初始化 2.4動(dòng)態(tài)順序表的清空 2.5動(dòng)態(tài)順序表的擴(kuò)容 2.6動(dòng)態(tài)順序表內(nèi)容的打印 三、動(dòng)態(tài)順序表的使用 3.1尾插尾刪 3.1.1尾插 3.1.2尾刪 3.2頭插頭刪 3.2.1頭插

    2024年02月09日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C實(shí)現(xiàn))

    優(yōu)勢(shì) : 可通過 下標(biāo)i (數(shù)據(jù)連續(xù)(物理空間連續(xù))) 便捷查詢查找順序表中的信息,也會(huì)在后面的 排序算法 和 堆算法 中盡顯身手 問題 : 在頭部/中間的插入與刪除需要 挪動(dòng)數(shù)據(jù) ,時(shí)間復(fù)雜度為O(N),效率低; 增容需要申請(qǐng)新空間, 可能會(huì)拷貝數(shù)據(jù) ,釋放舊空間,會(huì)有

    2024年02月05日
    瀏覽(94)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈表:帶頭雙向循環(huán)鏈表的增刪查改

    【數(shù)據(jù)結(jié)構(gòu)】鏈表:帶頭雙向循環(huán)鏈表的增刪查改

    本篇要分享的內(nèi)容是帶頭雙向鏈表,以下為本片目錄 目錄 一、鏈表的所有結(jié)構(gòu) 二、帶頭雙向鏈表 2.1尾部插入 2.2哨兵位的初始化 2.3頭部插入 2.4 打印鏈表 2.5尾部刪除 2.6頭部刪除 ?2.7查找結(jié)點(diǎn) 2.8任意位置插入 2.9任意位置刪除? 在剛開始接觸鏈表的時(shí)候,我們所學(xué)僅僅所學(xué)的

    2024年02月05日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C語言實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C語言實(shí)現(xiàn))

    在上一節(jié)中我們提到了順序表有如下缺陷: 在頭部/中間的插入與刪除需要挪動(dòng)數(shù)據(jù),時(shí)間復(fù)雜度為O(N),效率低; 增容需要申請(qǐng)新空間,可能會(huì)拷貝數(shù)據(jù),釋放舊空間,會(huì)有不小的消耗; 增容一般是呈2倍的增長(zhǎng),勢(shì)必會(huì)有一定的空間浪費(fèi)。例如當(dāng)前容量為100,滿了以后增容

    2024年02月06日
    瀏覽(89)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的增刪查改(附源碼)

    【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的增刪查改(附源碼)

    ? 這么可愛的貓貓不值得點(diǎn)個(gè)贊嗎 ???? 目錄 一.鏈表的概念和結(jié)構(gòu) 二.單鏈表的邏輯結(jié)構(gòu)和物理結(jié)構(gòu) 1.邏輯結(jié)構(gòu) ?2.物理結(jié)構(gòu) 三.結(jié)構(gòu)體的定義 四.增加 1.尾插? ?SListpushback 2.頭插? SListpushfront 五.刪除 1.尾刪? SListpopback 2.頭刪? SListpopfront 六.查找? 插入? 釋放? ?打印 1.查找

    2024年02月02日
    瀏覽(89)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn))

    引入雙向鏈表:關(guān)于單鏈表的問題與討論 單鏈表存在的毛?。?因?yàn)閱捂湵?只能單向 遍歷鏈表, 對(duì)于 前插 這個(gè)操作,單鏈表必 須得找到所需前插節(jié)點(diǎn)位置的前一個(gè) ,那么這時(shí)就得 從頭指針重新遍歷一次 鏈表,會(huì)造成時(shí)間復(fù)雜度大大增加。 沒有頭節(jié)點(diǎn)(哨兵位)無法刪除

    2024年02月08日
    瀏覽(99)
  • 【數(shù)據(jù)結(jié)構(gòu)】單向鏈表的增刪查改以及指定pos位置的插入刪除

    【數(shù)據(jù)結(jié)構(gòu)】單向鏈表的增刪查改以及指定pos位置的插入刪除

    目錄 ?單向鏈表的概念及結(jié)構(gòu) ?尾插 頭插 尾刪 ?編輯 ?頭刪 ?查找 ?在pos位置前插 ?在pos位置后插 ?刪除pos位置 ?刪除pos的后一個(gè)位置 總結(jié) 代碼? 概念:鏈表是一種 物理存儲(chǔ)結(jié)構(gòu)上非連續(xù) 、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的 邏輯順序 是通過鏈表中的 指針鏈接 次序?qū)崿F(xiàn)的

    2024年02月05日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表

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

    本章會(huì)介紹的知識(shí)點(diǎn)如下圖: ? ? ? ? ? ? ? ? ? ?順序表的結(jié)構(gòu):邏輯結(jié)構(gòu)與物理結(jié)構(gòu)都是內(nèi)存中一塊連續(xù)開辟的空間,都是11對(duì)應(yīng)的線性結(jié)構(gòu)。 兩種定義順序表的方式代碼如下 ? ? ? ? 靜態(tài)的順序表???????? 動(dòng)態(tài)的順序表: ???????? 在這兩種結(jié)構(gòu)中通常我們是會(huì)

    2024年02月11日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】手撕順序表

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

    順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ); 在數(shù)組上完成數(shù)據(jù)的增刪查改。 ?1,? 靜態(tài)順序表 :使用 定長(zhǎng)數(shù)組 存儲(chǔ)元素。 2., 動(dòng)態(tài)順序表 :使用 動(dòng)態(tài)開辟 的數(shù)組存儲(chǔ)。 ? 靜態(tài)順序表只適用于確定知道需要存多少數(shù)

    2024年02月11日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包