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

【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

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

一、線性表的定義

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

數(shù)組形式

【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

鏈表形式

【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

二、順序表

1. 順序表的定義

順序表是一種線性數(shù)據(jù)結(jié)構(gòu),通過連續(xù)的內(nèi)存空間存儲元素,可以隨機訪問任何位置的元素。它支持在常量時間內(nèi)進行插入、刪除和訪問操作,但在插入或刪除元素時可能需要移動后續(xù)元素,導(dǎo)致時間復(fù)雜度為O(n)

2. 順序表的結(jié)構(gòu)

2.1 靜態(tài)順序表

靜態(tài)順序表使用定長數(shù)組,當(dāng)數(shù)組存儲滿后則不能再進行存儲。
【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

2.2 動態(tài)順序表

動態(tài)順序表使用動態(tài)申請的數(shù)組進行存儲,當(dāng)順序表被存滿后,會自動擴大容量。

【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

3. 動態(tài)順序表的接口實現(xiàn)

3.1 順序表的接口

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

// 對數(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);

3.2 接口的實現(xiàn)

void SeqListInit(SeqList* ps)
{
	//動態(tài)申請十個 SLDateType 類型大小的空間
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 10);
	//判斷是否開辟成功
	if (ps->a == NULL)
	{
		perror("malloc");
		return;
	}  
	ps->size = 0;        //順序表初始化,順序表內(nèi)無數(shù)據(jù),則賦值為 0
	ps->capacity = 10;   //容量為動態(tài)申請的元素個數(shù)
}


void SeqListDestroy(SeqList* ps)
{
	//將動態(tài)申請的空間釋放
	free(ps->a);
	ps->a = NULL;
}

int CheckSeqList(SeqList* ps)
{
	//檢查順序表是否被填滿
	if (ps->capacity == ps->size)
	{
		//若填滿則將動態(tài)申請的內(nèi)存擴大為原來的兩倍
		SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * (ps->capacity * 2));
		//定義一個變量接收擴大后返回空間的首地址
		//目的:若開辟失敗也不會改變原來的內(nèi)存
		if (tmp == NULL)
		{
			perror("realloc");
			return 0;
		}
		ps->a = tmp;
		//將容量變成原來的兩倍
		ps->capacity *= 2;
	}
	return 1;
}


void SeqListPushBack(SeqList* ps, SLDateType x)
{
	//判斷順序表是否為滿,未滿則進行下面的步驟
	//若滿了,則先擴容,再進行下面的步驟
	if (CheckSeqList(ps) == 0)
	{
		return;
	}
	
	//將需要尾插的數(shù)據(jù)放在下標(biāo)為size的數(shù)組中
	ps->a[ps->size] = x;
	//存儲的元素加一
	ps->size++;
}

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

void SeqListPushFront(SeqList* ps, SLDateType x)
{
	//判斷順序表是否為滿,未滿則進行下面的步驟
	//若滿了,則先擴容,再進行下面的步驟
	if (CheckSeqList(ps) == 0)
	{
		return;
	}

	//下面省略的代碼是沒有用隨機插入函數(shù)實現(xiàn)的
	/*int i = 0;
	for (i = ps->size - 1; i >= 0; i--)
	{
		//將所有的元素向后移動一位
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[0] = x;   //將需要插入的元素放在首元素的位置
	ps->size++;*/	//存儲元素個數(shù)加一
	
	//下面省略的代碼是沒有用隨機插入函數(shù)實現(xiàn)的,并使用memmove函數(shù)移動數(shù)組
	
	/*memmove(ps->a + 1, ps->a, sizeof(SLDateType) * ps->size);
	ps->a[0] = x;
	ps->size++;*/
	
	//該代碼是使用隨機插入函數(shù)實現(xiàn)的
	SeqListInsert(ps, 0, x);
	
}


void SeqListPopFront(SeqList* ps)
{
	//下面省略的代碼是沒有用隨機刪除函數(shù)實現(xiàn)的
	//斷言:順序表為空不能刪除
	//assert(ps->size != 0);
	/*int i = 0;
	//將首元素后面的元素全部向前移動一位
	for (i = 0; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;*/  //存儲元素個數(shù)減一

	//下面省略的代碼是沒有用隨機刪除函數(shù)實現(xiàn)的,并使用memmove函數(shù)移動數(shù)組
	/*memmove(ps->a, ps->a + 1, sizeof(SLDateType) * (ps->size - 1));
	ps->size--;*/ 
	
	//該代碼是使用隨機刪除函數(shù)實現(xiàn)的
	SeqListErase(ps, 0);
}

void SeqListPopBack(SeqList* ps)
{
	//下面省略的代碼是沒有用隨機刪除函數(shù)實現(xiàn)的
	
	//斷言:順序表為空不能刪除
	/*assert(ps->size != 0);
	ps->size--;*/ //存儲元素個數(shù)減一
	
	//該代碼是使用隨機刪除函數(shù)實現(xiàn)的
	SeqListErase(ps , ps ->size - 1);
}


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


void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
	int i = 0;
	//需要插入的位置不能在size下標(biāo)元素的后面
	//原因是size - 1 下標(biāo)中的元素是最后一個元素
	assert(ps->size >= pos);
	/*for (i = ps->size - 1; i >= pos; i--)
	{
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[pos] = x;
	ps->size++;*/

	memmove(ps->a + pos + 1, ps->a + pos, sizeof(SLDateType)*(ps->size - pos));
	ps->a[pos] = x;
	ps->size++;
}

void SeqListErase(SeqList* ps, int pos)
{
	//順序表不能為空
	assert(ps->size != 0);
	int i = 0;
	//將需要刪除元素的后面的元素全部向前移動一位
	for (i = pos; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

三、順序表總結(jié)

1. 動態(tài)順序表的優(yōu)點

(1)可以根據(jù)需要動態(tài)地分配內(nèi)存,靈活性更高。
(2)可以避免靜態(tài)數(shù)組可能出現(xiàn)的內(nèi)存浪費問題。
(3)由于內(nèi)存空間是動態(tài)分配的,因此可以處理數(shù)據(jù)量不確定或者變化的情況。

2. 動態(tài)順序表的缺點

(1)動態(tài)內(nèi)存分配比靜態(tài)內(nèi)存分配要慢一些,會增加程序的運行時間。
(2)需要手動管理內(nèi)存,包括申請和釋放,容易出現(xiàn)內(nèi)存泄漏和內(nèi)存碎片等問題。
(3)難以預(yù)測、控制內(nèi)存的使用情況,容易出現(xiàn)因為內(nèi)存不足而導(dǎo)致程序崩潰的情況

結(jié)尾

如果有什么建議和疑問,或是有什么錯誤,希望大家能夠提一下。
希望大家以后也能和我一起進步?。?br> 如果這篇文章對你有用的話,希望能給我一個小小的贊!文章來源地址http://www.zghlxwxcb.cn/news/detail-439921.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】線性表之鏈表

    【數(shù)據(jù)結(jié)構(gòu)】線性表之鏈表

    上一篇文章講述了線性表中的順序表,這篇文章講述關(guān)于鏈表的定義、類別、實現(xiàn)、多種不同鏈表的優(yōu)缺點和鏈表與順序表的優(yōu)缺點。 關(guān)于上一篇文章的鏈接:線性表之順序表 鏈表是一種物理存儲結(jié)構(gòu)上 非連續(xù)、非順序 的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針

    2024年02月05日
    瀏覽(102)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列

    【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列

    前面兩篇文章講述了關(guān)于線性表中的順序表與鏈表,這篇文章繼續(xù)講述線性表中的 棧和隊列。 這里講述的兩種線性表與前面的線性表不同,只允許在一端入數(shù)據(jù),一段出數(shù)據(jù),詳細(xì)內(nèi)容請看下面的文章。 順序表與鏈表兩篇文章的鏈接: 線性表之順序表 線性表之鏈表 注意:

    2024年02月06日
    瀏覽(94)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性表(一)線性表的定義及其基本操作(順序表插入、刪除、查找、修改)

    【數(shù)據(jù)結(jié)構(gòu)】線性表(一)線性表的定義及其基本操作(順序表插入、刪除、查找、修改)

    目錄 一、線性表 1. 線性表的定義 2. 線性表的要素 二、線性表的基本操作 三、線性表的順序存儲結(jié)構(gòu) 1. 定義 2. 順序表的操作? ? ?? a. 插入操作 b. 刪除操作 c. 查找操作 d. 修改操作 e. 代碼實例 ??????? ?一個線性表是由零個或多個 具有相同類型的結(jié)點 組成的有序集合。

    2024年02月03日
    瀏覽(99)
  • 數(shù)據(jù)結(jié)構(gòu) 線性表的定義和基本操作(以順序表為例)

    數(shù)據(jù)結(jié)構(gòu) 線性表的定義和基本操作(以順序表為例)

    名人說:一花獨放不是春,百花齊放花滿園。——《增廣賢文》 作者:Code_流蘇(CSDN) (一個喜歡古詩詞和編程的Coder??) 以下代碼個人分享出來,僅供學(xué)習(xí)交流,且僅在CSDN平臺發(fā)布,未經(jīng)授權(quán)禁止二次轉(zhuǎn)發(fā)。 〇、線性表是什么? 1、定義 線性表 是具有 相同數(shù)據(jù)類型 的 n(

    2024年02月12日
    瀏覽(102)
  • 數(shù)據(jù)結(jié)構(gòu):線性表之-單向鏈表(無頭)

    數(shù)據(jù)結(jié)構(gòu):線性表之-單向鏈表(無頭)

    目錄 什么是單向鏈表 順序表和鏈表的區(qū)別和聯(lián)系 順序表: 鏈表: 鏈表表示(單項)和實現(xiàn) 1.1 鏈表的概念及結(jié)構(gòu) 1.2單鏈表(無頭)的實現(xiàn) 所用文件 將有以下功能: 鏈表定義 創(chuàng)建新鏈表元素 尾插 頭插 尾刪 頭刪 查找-給一個節(jié)點的指針 改 pos位置之前插入 刪除pos位置的值 成品

    2024年02月09日
    瀏覽(96)
  • 數(shù)據(jù)結(jié)構(gòu):線性表之-循環(huán)雙向鏈表(萬字詳解)

    數(shù)據(jù)結(jié)構(gòu):線性表之-循環(huán)雙向鏈表(萬字詳解)

    目錄 基本概念 1,什么是雙向鏈表 2,與單向鏈表的區(qū)別 雙向鏈表詳解 功能展示: 1. 定義鏈表 2,創(chuàng)建雙向鏈表 3,初始化鏈表 4,尾插 5,頭插 6,尾刪 判斷鏈表是否被刪空 尾刪代碼 7,頭刪 8,pos位置之前插入 優(yōu)化后的頭插 優(yōu)化后的尾插 9,刪除pos位置的節(jié)點 優(yōu)化后的尾刪 優(yōu)

    2024年02月09日
    瀏覽(23)
  • C語言數(shù)據(jù)結(jié)構(gòu)——線性表之棧和隊列

    C語言數(shù)據(jù)結(jié)構(gòu)——線性表之棧和隊列

    為什么會定義棧和隊列這兩種數(shù)據(jù)結(jié)構(gòu)呢? 原因在于: 之所以會定義棧和隊列這樣的數(shù)據(jù)結(jié)構(gòu) 是因為他們有兩大特性 : 第一: 他們可以保存程序運行路徑中各個點的信息,以便用于回溯操作或其他需要訪問已經(jīng)訪問過的節(jié)點信息的操作。 比如: 棧用于解決迷宮問題,就

    2023年04月11日
    瀏覽(95)
  • 數(shù)據(jù)結(jié)構(gòu)第三課 -----線性表之雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)第三課 -----線性表之雙向鏈表

    ?? ?????????????????????? ??? 作者介紹: ???? ?? ?????????????? ?? ??作者id:老秦包你會, ?? 簡單介紹:?????????????????????????????? 喜歡學(xué)習(xí)C語言和python等編程語言,是一位愛分享的博主,有興趣的小可愛可以來互討 ????

    2024年02月05日
    瀏覽(94)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性表之單鏈表(講解實現(xiàn)——帶動圖理解)

    【數(shù)據(jù)結(jié)構(gòu)】線性表之單鏈表(講解實現(xiàn)——帶動圖理解)

    單鏈表的優(yōu)點 1.頭部和中間插入或刪除數(shù)據(jù)效率高,無需挪動。 2.按照需求申請釋放空間,無需擔(dān)心空間不夠用。 單鏈表的缺點 1.不可以進行下標(biāo)隨機訪問。 2.復(fù)雜度是O(n) 3.反向遍歷困難 單鏈表是線性表的一種,單鏈表是鏈?zhǔn)酱鎯Φ木€性表,不同于單鏈表, 鏈表在內(nèi)存空間

    2024年02月06日
    瀏覽(98)
  • 數(shù)據(jù)結(jié)構(gòu)三:線性表之單鏈表(帶頭結(jié)點單向)的設(shè)計與實現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)三:線性表之單鏈表(帶頭結(jié)點單向)的設(shè)計與實現(xiàn)

    ? ? ? ? 線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)正是所謂的單鏈表,何謂單鏈表?通過地址將每一個數(shù)據(jù)元素串起來,進行使用,這可以彌補順序表在進行任意位置的插入和刪除需要進行大量的數(shù)據(jù)元素移動的缺點,只需要修改指針的指向即可;單鏈表的種類又可劃分為很多種,本篇博客詳

    2024年02月19日
    瀏覽(107)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包