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

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn))

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

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

??前言:

順序表是數(shù)據(jù)結(jié)構(gòu)里面很基礎(chǔ)的一類,它是線性表的一種,其它線性表還有鏈表、棧和隊(duì)列等,今天來和博主一起學(xué)習(xí)關(guān)于順序表的知識吧。

??順序表和數(shù)組的區(qū)別

順序表,它分為兩類:動(dòng)態(tài)順序表靜態(tài)順序表,這兩個(gè)表的區(qū)別就是前者的空間不固定,是支持?jǐn)U容的,后者的空間是固定的,但是兩者的共同點(diǎn)空間都是連續(xù)的,動(dòng)態(tài)順序表的底層是動(dòng)態(tài)數(shù)組,而靜態(tài)順序表的底層是數(shù)組。

  • 很明顯我們經(jīng)常用到的數(shù)據(jù)結(jié)構(gòu)就是動(dòng)態(tài)的順序表,因?yàn)殪o態(tài)的順序表空間固定,沒什么實(shí)際的價(jià)值。
  • 還有一個(gè)區(qū)別就是,動(dòng)態(tài)順序表是基于動(dòng)態(tài)數(shù)組的,但是它作為一個(gè)數(shù)據(jù)結(jié)構(gòu),提供了很多動(dòng)態(tài)數(shù)組沒有直接提供的功能,像增、刪、查、改、創(chuàng)建和銷毀、以及計(jì)算數(shù)組的大小這些基本的功能。

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

??動(dòng)態(tài)順序表的模擬實(shí)現(xiàn)

??動(dòng)態(tài)順序表的基本結(jié)構(gòu)設(shè)計(jì)

#define DataTypeVector int
typedef struct my_vector
{
	int* a;//儲存數(shù)據(jù)
	size_t size;//順序表的數(shù)據(jù)大小
	size_t capacity;//順序表的空間大小
}mv;

各種接口:

//初始化

mv* Init();

//頭插
void push_front(mv* mv1, DataTypeVector x);

//頭刪
void pop_front(mv* mv1);

//尾插
void push_back(mv* mv1, DataTypeVector x);

//尾刪
void pop_back(mv* mv1);

//插入--在某個(gè)位置之前
void insert(mv* mv1,size_t positon, DataTypeVector x);

//刪除某個(gè)位置的元素
void erase(mv* mv1,size_t position);

//查找某個(gè)值,并返回它出現(xiàn)的位置,沒有找到,返回-1;
int find(mv* mv1, DataTypeVector x);

//計(jì)算動(dòng)態(tài)順序表的大小
size_t Size(mv* mv1);

//銷毀動(dòng)態(tài)順序表
void Destroy(mv** mv1);

//修改某個(gè)位置的值
void Modify(mv* mv1, size_t position, DataTypeVector x);

??動(dòng)態(tài)順序表的各種功能模擬實(shí)現(xiàn)

?? 初始化(init)

返回值版本:

//初始化動(dòng)態(tài)順序表
//返回值版本
mv* Init()
{
	mv* mv1 = (mv*)malloc(sizeof(mv));
	if (mv1 == NULL)
	{
		printf("malloc Falied\n");
		exit(-1);
	}
	mv1->a = NULL;
	mv1->capacity = 0;
	mv1->size = 0;
	return mv1;
}

二級指針版本:

//二級指針版本,不帶返回值
void Init(mv** mv1)
{
	assert(mv1);
	(*mv1) = (mv*)malloc(sizeof(mv));
	if ((*mv1) == NULL)
	{
		printf("malloc failed\n");
		exit(-1);
	}
	(*mv1)->a = NULL;
	(*mv1)->capacity = NULL;
	(*mv1)->size = NULL;
}

?? 頭插、頭刪

?? 頭插
//頭插
void push_front(mv* mv1, DataTypeVector x)
{
	assert(mv1 != NULL);
	if ((mv1)->capacity == (mv1)->size)//判斷是否需要擴(kuò)容
	{
		(mv1)->capacity = (mv1)->capacity == 0 ? 4 : (mv1)->capacity * 2;
		DataTypeVector* tmp = NULL;
		tmp = (DataTypeVector*)realloc(mv1->a, sizeof(DataTypeVector) * mv1->capacity);
		if (tmp == NULL)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		mv1->a = tmp;
	}

	//將所有值后移
	for (size_t i = mv1->size; i > 0; --i)
	{
		mv1->a[i] = mv1->a[i-1];
	}

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

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

?? 頭刪
//頭刪
void pop_front(mv* mv1)
{
	assert(mv1 != NULL);
	assert(mv1->size > 0);

	//將后面的值依次覆蓋前面的值
	for (size_t i = 0; i < mv1->size-1; ++i)
	{
		mv1->a[i] = mv1->a[i + 1];
	}

	--mv1->size;//別忘了數(shù)組的大小要減減
}

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

?? 尾插、尾刪

?? 尾插
//尾插
void push_back(mv* mv1, DataTypeVector x)
{
	assert(mv1 != NULL);

	if ((mv1)->capacity == (mv1)->size)//判斷是否需要擴(kuò)容
	{
		(mv1)->capacity = (mv1)->capacity == 0 ? 4 : (mv1)->capacity * 2;
		DataTypeVector* tmp = NULL;
		tmp = (DataTypeVector*)realloc(mv1->a,sizeof(DataTypeVector) * mv1->capacity);
		if (tmp == NULL)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		mv1->a = tmp;
	}
	mv1->a[mv1->size] = x;
	++mv1->size;
}

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

?? 尾刪
//尾刪
void pop_back(mv* mv1)
{
	assert(mv1);
	assert(mv1->size > 0);
	--mv1->size;
}

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

?? 計(jì)算動(dòng)態(tài)順序表的大小(size接口)

//計(jì)算動(dòng)態(tài)線性表的大小
size_t Size(mv* mv1)
{
	assert(mv1);
	return mv1->size;
}

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

?? 動(dòng)態(tài)順序表在特定位置插入(insert)

這里我們仿照C++STL庫,只實(shí)現(xiàn)了在pos位置之前插入。
數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

//插入--在某個(gè)位置之前
//插入--在某個(gè)位置之前
void insert(mv* mv1, size_t position,DataTypeVector x)
{
	assert(mv1 != NULL);
	assert(position < mv1->size);

	if ((mv1)->capacity == (mv1)->size)//判斷是否需要擴(kuò)容
	{
		(mv1)->capacity = (mv1)->capacity == 0 ? 4 : (mv1)->capacity * 2;
		DataTypeVector* tmp = NULL;
		tmp = (DataTypeVector*)realloc(mv1->a, sizeof(DataTypeVector) * mv1->capacity);
		if (tmp == NULL)
		{
			printf("calloc failed\n");
			exit(-1);
		}
		mv1->a = tmp;
	}

	//從下標(biāo)size開始,把數(shù)據(jù)都往后挪動(dòng).
	
		for (size_t i = mv1->size; i > position; --i)
		{
			mv1->a[i] = mv1->a[i-1];
		}
	
	
	//最后把下標(biāo)position位置賦值為x
	mv1->a[position] = x;
	//別忘了size
	++mv1->size;
}

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

?? 動(dòng)態(tài)順序表在特定位置刪除(erase)

//刪除某個(gè)位置的元素
void erase(mv* mv1, size_t position)
{
	assert(mv1 != NULL);
	assert(position < mv1->size);

	for (size_t i = position; i < mv1->size-1; ++i)
	{
		mv1->a[i] = mv1->a[i + 1];
	}

	--mv1->size;
}

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

?? 動(dòng)態(tài)順序表的查找

//查找某個(gè)值,并返回它出現(xiàn)的位置,沒有找到,返回-1;
int find(mv* mv1,DataTypeVector x)
{
	assert(mv1 != NULL);

	for (size_t i = 0; i < mv1->size; ++i)
	{
		if (x == mv1->a[i])//找到直接返回下標(biāo)i
			return i;
	}

	return -1;//沒有找到返回-1
}

這里順序表不一定是有序的,所以不能使用二分查找。

?? 修改某個(gè)位置的值

void Modify(mv* mv1,size_t position,DataTypeVector x)
{
	assert(mv1);
	assert(position < mv1->size);

	mv1->a[position] = x;
}

?? 動(dòng)態(tài)順序表的銷毀

動(dòng)態(tài)順序表的底層就是動(dòng)態(tài)數(shù)組,它是堆上開辟的,通常遵循一下原則:
1. 由誰申請就由誰釋放。 這是一個(gè)約定俗成的說法,指的是誰(程序員)申請的內(nèi)存,需要自己負(fù)責(zé)去釋放,避免出現(xiàn)內(nèi)存泄漏。
2.只能一次釋放整個(gè)動(dòng)態(tài)數(shù)組,而不能只釋放一部分
只要我們遵循這兩個(gè)原則,然后再對順序表類型的成員進(jìn)行置空和置零,就實(shí)現(xiàn)了動(dòng)態(tài)線順序表的銷毀。

//銷毀動(dòng)態(tài)順序表
void Destroy(mv** mv1)
{
	assert(mv1 != NULL);
	(*mv1)->capacity = (*mv1)->size = 0;
	free((*mv1)->a);//先銷毀順序表里面的成員
	(*mv1)->a = NULL;
	free(*mv1);//銷毀整個(gè)順序表
	*mv1 = NULL;
}

?? 總結(jié)

關(guān)于《數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn))》這篇文章就講解到這兒,感謝大家的支持,歡迎大家留言交流以及批評指正。接下來將為大家?guī)硪黄恫灰粯拥腃語言之easyx庫的使用》,敬請期待吧。下面是本篇博客的思維導(dǎo)圖希望對您有所幫助。

數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-770299.html

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

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)初階】七、非線性表里的二叉樹(堆的實(shí)現(xiàn) -- C語言順序結(jié)構(gòu))

    【數(shù)據(jù)結(jié)構(gòu)初階】七、非線性表里的二叉樹(堆的實(shí)現(xiàn) -- C語言順序結(jié)構(gòu))

    ========================================================================= 相關(guān)代碼gitee自取 : C語言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數(shù)據(jù)結(jié)構(gòu)初階】六、線性表中的隊(duì)列(鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)隊(duì)列)-CSDN博客 ?===========================

    2024年02月08日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu)初階之排序

    數(shù)據(jù)結(jié)構(gòu)初階之排序

    個(gè)人主頁:點(diǎn)我進(jìn)入主頁 專欄分類:C語言初階? ? ??C語言程序設(shè)計(jì)————KTV? ? ? ?C語言小游戲? ? ?C語言進(jìn)階 C語言刷題? ? ? ?數(shù)據(jù)結(jié)構(gòu)初階? ??Linux 歡迎大家點(diǎn)贊,評論,收藏。 一起努力,共赴大廠。 目錄 一.前言 二.選擇排序 2.1選擇排序思想 2.2代碼實(shí)現(xiàn) 三.快速

    2024年01月18日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)初階之插入排序與希爾排序詳解

    數(shù)據(jù)結(jié)構(gòu)初階之插入排序與希爾排序詳解

    個(gè)人主頁:點(diǎn)我進(jìn)入主頁 專欄分類:C語言初階? ? ??C語言程序設(shè)計(jì)————KTV? ? ? ?C語言小游戲? ? ?C語言進(jìn)階 C語言刷題? ? ? ?數(shù)據(jù)結(jié)構(gòu)初階? ??Linux 歡迎大家點(diǎn)贊,評論,收藏。 一起努力,共赴大廠。 目錄 一.前言 二.插入排序 2.1插入排序的思想 2.2代碼實(shí)現(xiàn) 三.希

    2024年02月02日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)初階之二叉樹的詳細(xì)解析

    數(shù)據(jù)結(jié)構(gòu)初階之二叉樹的詳細(xì)解析

    個(gè)人主頁:點(diǎn)我進(jìn)入主頁 專欄分類:C語言初階? ? ??C語言程序設(shè)計(jì)————KTV? ? ? ?C語言小游戲? ? ?C語言進(jìn)階 C語言刷題? ? ? ?數(shù)據(jù)結(jié)構(gòu)初階? ??Linux 歡迎大家點(diǎn)贊,評論,收藏。 一起努力,共赴大廠。 目錄 1.前言? 2.二叉樹各個(gè)功能代碼實(shí)現(xiàn) 2.1二叉樹結(jié)構(gòu)體 2.2二叉

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

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

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

    2024年02月22日
    瀏覽(96)
  • 數(shù)據(jù)結(jié)構(gòu)初階之二叉樹性質(zhì)練習(xí)與代碼練習(xí)

    數(shù)據(jù)結(jié)構(gòu)初階之二叉樹性質(zhì)練習(xí)與代碼練習(xí)

    個(gè)人主頁:點(diǎn)我進(jìn)入主頁 專欄分類:C語言初階? ? ??C語言程序設(shè)計(jì)————KTV? ? ? ?C語言小游戲? ? ?C語言進(jìn)階 C語言刷題? ? ? ?數(shù)據(jù)結(jié)構(gòu)初階? ??Linux 歡迎大家點(diǎn)贊,評論,收藏。 一起努力,共赴大廠。 目錄 1.前言 2.性質(zhì)練習(xí) 3.代碼練習(xí)? 3.1單值二叉樹 3.2檢查兩顆樹

    2024年02月04日
    瀏覽(16)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑧ - 動(dòng)態(tài)順序表詳解(附完整源碼)

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑧ - 動(dòng)態(tài)順序表詳解(附完整源碼)

    本章內(nèi)容 寫在前面 1.靜態(tài)與動(dòng)態(tài)是指什么? 2.動(dòng)態(tài)順序表結(jié)構(gòu)的定義 3.動(dòng)態(tài)順序表的函數(shù)接口實(shí)現(xiàn) 4.動(dòng)態(tài)順序表的問題及思考 5.關(guān)于順序表的OJ題 6.OJ答案及解析 1.移除元素 2.刪除有序數(shù)組中的重復(fù)項(xiàng) ?3.合并兩個(gè)有序數(shù)組 7.動(dòng)態(tài)順序表完整源碼 1.SeqList.h 2.SeqList.c ? ? 上一章

    2024年02月16日
    瀏覽(24)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑦ - 靜態(tài)順序表詳解(附完整源碼)

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑦ - 靜態(tài)順序表詳解(附完整源碼)

    本章內(nèi)容 1.什么是線性表 2.什么是順序表? 3.靜態(tài)順序表結(jié)構(gòu)的定義 4.靜態(tài)順序表的函數(shù)接口實(shí)現(xiàn) 5.靜態(tài)順序表的問題及思考 ? ? 線性表(linear list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、

    2024年02月15日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法初階(C語言)】復(fù)雜鏈表(隨機(jī)指針,隨機(jī)鏈表的復(fù)制)題目詳解+鏈表順序表結(jié)尾

    【數(shù)據(jù)結(jié)構(gòu)和算法初階(C語言)】復(fù)雜鏈表(隨機(jī)指針,隨機(jī)鏈表的復(fù)制)題目詳解+鏈表順序表結(jié)尾

    目錄 ?1.隨機(jī)鏈表的復(fù)制 1.2題目描述? 1.3題目分析 1.4解題: 2.順序表和鏈表對比 2.1cpu高速緩存利用率 3.結(jié)語 一個(gè)長度為? n ?的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針? random ? 該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。? ? ? ? 構(gòu)造這個(gè)鏈表的? 深拷貝 。?深拷貝

    2024年03月10日
    瀏覽(93)
  • 詳解初階數(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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包