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

數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

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


數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

前言

本章會用C語言來描述數(shù)據(jù)結(jié)構(gòu)中的順序表,實現(xiàn)簡單的增刪查改操作,其中頭文件包含在新建的頭文件SeqList.h內(nèi),順序表的實現(xiàn)在新建的Seqlist.c內(nèi),主函數(shù)Text.c將會實現(xiàn)菜單,方便我們進(jìn)行功能的選擇。

1. 順序表的概念

數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲,在數(shù)組上完成數(shù)據(jù)的增刪查改。

順序表分為靜態(tài)和動態(tài)兩個版本,一般我們都是使用動態(tài)的版本進(jìn)行操作
因為靜態(tài)的版本使用定長數(shù)組存儲元素,而動態(tài)的版本使用動態(tài)開辟的數(shù)組存儲
數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

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

數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

2.1 順序表的初始化與銷毀

我們知道,一個順序表有這么幾個組成部分:起始地址,存儲的數(shù)據(jù)個數(shù),以及容量。 在進(jìn)行初始化時,我們應(yīng)該將起始地址置為空(NULL),個數(shù)和容量置為0。
//初始化
void SLInit(SL* ps1)
{
	ps1->a = (SLDatatype*)malloc(sizeof(SLDatatype) * 4);
	if (ps1->a == NULL)
	{
		perror("malloc fail");//順序表為空就報錯,說明申請空間失敗
		return;
	}
	ps1->capacity = 4;//我們設(shè)定初始空間為4個SLDatatype(這里是int)大小
	ps1->size = 0;
}

注意要釋放掉內(nèi)存

void SLDestory(SL* ps1)
{
	free(ps1->a);//釋放
	ps1->a = NULL;//將順序表置為空
	ps1->size = 0;//有效數(shù)字置0
	ps1->capacity = 0;//容量置0
}

2.2 順序表的尾插

尾插,顧名思義,就是在順序表的尾部插入數(shù)據(jù),在實現(xiàn)尾插功能的同時,我們要寫一個檢查順序表容量的函數(shù),插入的時候我們要檢查空間是否足夠,不夠則要進(jìn)行擴(kuò)容,足夠則插入。

void SLPushBack(SL* ps1, SLDatatype x)
{
	SLCheckCapacity(ps1);//檢查容量
	ps1->a[ps1->size] = x;//尾插數(shù)據(jù)
	size++
	//ps1->a[ps1->size++] = x;
	
}

容量檢查

void SLCheckCapacity(SL* ps1)
{
	if (ps1->size == ps1->capacity)//有效數(shù)據(jù)大小如果和容量相等說明需要擴(kuò)容了
	{
		SLDatatype* tmp = (SLDatatype*)realloc(ps1->a, sizeof(SLDatatype) * ps1->capacity * 2);
		//如果空間不夠了,就擴(kuò)容到原來的二倍
		if (tmp == NULL)
		{
			perror("realloc fail");//如果tmp為空說明擴(kuò)容空間失敗
			return;
		}
		ps1->a = tmp;//檢查確保tmp不為空再賦給a
		ps1->capacity *= 2;//容量變?yōu)樵瓉淼亩?/span>
	}

}

2.3 順序表的尾刪

實現(xiàn)尾刪功能我們需要注意的時,說是刪,但是我們可不能真刪了,并不是把數(shù)據(jù)置為\n或是\0,只需要把有效數(shù)據(jù)-1就行了。
注意:不可以對要刪除數(shù)的空間進(jìn)行釋放,因為動態(tài)開辟出的空間有一個特點:一起開辟,一起釋放,在這里不可以實現(xiàn)。

void SLPopBack(SL* ps1)
{   //尾刪數(shù)據(jù)
	assert(ps1);//暴力檢查一下
	//size不能一直-1
	if(ps1->size>0)
	{
	    p->size--;
	}
}

2.4 順序表的頭插

除了需要把順序表中【0,size-1】的元素依次向后移動一位,再插入數(shù)值
我們要從后往前向后移,因為從前往后的話數(shù)據(jù)會被覆蓋
數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改

void SLPushFront(SL* ps1, SLDatatype x)
{
	SLCheckCapacity(ps1);//檢查容量
	for (int i = ps1->size - 1; i >= 0; i--)//頭插需要將順序表中【0,size-1】的元素依次向后移動一位
	{
		ps1->a[i + 1] = ps1->a[i];
	}
	ps1->a[0] = x;   //頭插數(shù)據(jù)
	ps1->size++;     //有效數(shù)據(jù)+1
}

2.5 順序表的頭刪

頭刪很簡單,與頭插相反,頭插是將從最后一個數(shù)開始向后覆蓋,而頭刪是從第二個元素開始從前往后覆蓋前一個元素。

void SLPopFront(SL* ps1)
{
	assert(ps1->a > 0);//暴力檢查
	for (int i = 0; i < ps1->size - 1; i++)
	{
		ps1->a[i] = ps1->a[i + 1];
	}
}

2.6 固定位置的插入

思路和頭插沒區(qū)別,只要找到要插入的位置,將它后面位置的元素全部向后移一位,然后插入,就OK了,需要注意的是pos(插入的位置)也要進(jìn)行斷言

void SLInsert(SL* ps1, int pos, SLDatatype x)
{
	assert(ps1);//斷言檢查空指針
	assert(pos>=0 && pos <= ps1->size);//斷言檢查pos是否合規(guī)

	SLCheckCapacity(ps1);//檢查容量
	int end = ps1->size - 1;
	while (pos <= end)
	{
		ps1->a[end + 1] = ps1->a[end];
		--end;
	}
	ps1->a[pos] = x;
	ps1->size++;
	

}

2.7 固定位置的刪除

同理,從要刪除的位置開始,從前往后將后一位的值賦給前一位,太簡單了

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

	SLCheckCapacity(ps1);
	int start = pos+1;
	while (start < ps1->size)
	{
		ps1->a[start - 1] = ps1->a[start];
		++start;
	}
	ps1->size--;
}

2.8 查找和打印

過于簡單,直接上代碼

int SLFind(SL* psl, SLDatatype x)
{
	assert(psl);

	for (int i = 0; i < psl->size; i++)
	{
		if (psl->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}
void SLPrint(SL* ps1)
{
	for (int i = 0; i < ps1->size; i++)
	{
		printf("%d ",ps1->a[i]);
	}
	printf("\n");
}

2.9 修改元素

void SLModify(SL* ps1, int pos, SLDatatype x)
{
	assert(ps1);
	assert(0 <= pos && pos < ps1->size);

	ps1->a[pos] = x;

}

主函數(shù)部分(菜單)

void menu()
{
	printf("***************************************\n");
	printf("1、尾插數(shù)據(jù)  2、尾刪數(shù)據(jù)\n");
	printf("3、頭插數(shù)據(jù)  4、頭刪數(shù)據(jù)\n");
	printf("5、打印數(shù)據(jù)  -1、退出\n");
	printf("***************************************\n");
}
int main()
{
	int option = 0;
	SL s;
	SLInit(&s);
	while (option != -1)
	{
		menu();
		printf("請輸入你的操作:>");
		scanf("%d", &option);
		if (option == 1)
		{
			/*printf("請輸入要尾插的數(shù)據(jù),以-1結(jié)束:");
			int x = 0;
			scanf("%d", &x);
			while (x != -1)
			{
				SLPushBack(&s, x);
				scanf("%d", &x);
			}*/

			int n = 0;
			printf("請輸入要尾插的數(shù)據(jù)個數(shù),再依次輸入要插入的數(shù)據(jù):");
			scanf("%d", &n);

			int x = 0;
			while (n > 0)
			{
				scanf("%d", &x);
				SLPushBack(&s, x);
				n--;
			}
		}
		else if (option == 5)
		{
			SLPrint(&s);
		}
		else if (option == -1)
		{
			break;
		}
		else
		{
			printf("無此選項,請重新輸入\n");
		}
	}

	SLDestroy(&s);

	return 0;
}

結(jié)語

就這樣,順序表從定義到結(jié)束,增刪查改的功能也全部實現(xiàn)了,學(xué)到這里,我們就大致掌握了順序表,同時我們也要思考一些問題:
1.中間/頭部的插入,時間復(fù)雜度為O(N)
2.增容需要申請新空間,拷貝數(shù)據(jù),釋放舊空間,這個過程會有損耗
3.增容一般是以兩倍的方式增長,所以必定會造成浪費(fèi),比如我們當(dāng)前容量為100,已經(jīng)滿了,我們擴(kuò)容到200,但是只新插入了5個數(shù)據(jù),這就浪費(fèi)了95個數(shù)據(jù)空間
如何處理呢?

數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改文章來源地址http://www.zghlxwxcb.cn/news/detail-436298.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)入門(C語言)順序表的增刪查改的文章就介紹完了。如果您還想了解更多內(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ìn)行投訴反饋,一經(jīng)查實,立即刪除!

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

相關(guān)文章

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

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

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

    2024年02月06日
    瀏覽(89)
  • 數(shù)據(jù)結(jié)構(gòu)從入門到實戰(zhàn)——順序表的應(yīng)用

    數(shù)據(jù)結(jié)構(gòu)從入門到實戰(zhàn)——順序表的應(yīng)用

    目錄 一、基于動態(tài)順序表實現(xiàn)通訊錄 二、代碼實現(xiàn) 2.1?通訊錄的初始化 2.2 通訊錄的銷毀? 2.3 通訊錄的展示 2.4?通訊錄添加聯(lián)系人信息 2.5?通訊錄刪除聯(lián)系人信息 2.6 通訊錄修改聯(lián)系人信息? 2.7 通訊錄的查找聯(lián)系人信息 2.8?將通訊錄中聯(lián)系人信息保存到文件中? 2.9 從文件中

    2024年04月25日
    瀏覽(57)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性表的順序存儲結(jié)構(gòu)及實現(xiàn)——C語言版

    【數(shù)據(jù)結(jié)構(gòu)】線性表的順序存儲結(jié)構(gòu)及實現(xiàn)——C語言版

    線性表的順序存儲結(jié)構(gòu)稱為 順序表 ,其基本思想是 用一段地址連續(xù)的存儲單元一次存儲線性表的數(shù)據(jù)元素。 設(shè)順序表的每個元素占用 c 個存儲單元,則第 i 個元素的存儲地址為: 所以, 只要確定了存儲順序表的起始地址(即基地址),計算任意一個元素的存儲地址的時間

    2024年03月15日
    瀏覽(33)
  • 數(shù)據(jù)結(jié)構(gòu)之順序表的實現(xiàn)(C語言版)

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

    ? ? ?Hello, 大家好,我是一代,今天給大家?guī)碛嘘P(guān)順序表的有關(guān)知識 ? ? ?所屬專欄:數(shù)據(jù)結(jié)構(gòu) ? ? ?創(chuàng)作不易,望得到各位佬們的互三呦 1.首先在講順序表之前我們先來了解什么是數(shù)據(jù)結(jié)構(gòu) 數(shù)據(jù)結(jié)構(gòu)是由“數(shù)據(jù)”和“結(jié)構(gòu)”兩詞組合?來。 什么是數(shù)據(jù)?常見的數(shù)值1、

    2024年04月25日
    瀏覽(25)
  • C語言數(shù)據(jù)結(jié)構(gòu)-----順序表(多功能動態(tài)順序表的代碼實現(xiàn))

    C語言數(shù)據(jù)結(jié)構(gòu)-----順序表(多功能動態(tài)順序表的代碼實現(xiàn))

    本篇講述了順序表的相關(guān)知識,以及動態(tài)順序表的代碼實現(xiàn)。 順序表和鏈表一般情況下都會叫他們線性表。 線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實際中廣泛使 用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊列、字符串… 線性

    2024年02月07日
    瀏覽(25)
  • [C語言][數(shù)據(jù)結(jié)構(gòu)][動態(tài)內(nèi)存空間的開辟]順序表的實現(xiàn)!

    [C語言][數(shù)據(jù)結(jié)構(gòu)][動態(tài)內(nèi)存空間的開辟]順序表的實現(xiàn)!

    目錄 零.必備知識 a.順序表的底層是數(shù)組. b.數(shù)組在內(nèi)存中是連續(xù)存放的. c.動態(tài)內(nèi)存空間的開辟(malloc,calloc,realloc). 一.順序表的定義與實現(xiàn)? ????????1.1 順序表的定義? ????????1.2 順序表的初始化? ????????1.3 順序表的銷毀? ????????1.4 順序表容量的檢查與調(diào)整

    2024年04月09日
    瀏覽(37)
  • 數(shù)據(jù)結(jié)構(gòu)-順序表的基本實現(xiàn)(C語言,簡單易懂,含全部代碼)

    數(shù)據(jù)結(jié)構(gòu)-順序表的基本實現(xiàn)(C語言,簡單易懂,含全部代碼)

    今天起開始編寫數(shù)據(jù)結(jié)構(gòu)中的各種數(shù)據(jù)結(jié)構(gòu)及算法的實現(xiàn),說到順序表,我們首先得了解下線性表。 線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊列、字符串… 線性表在邏

    2023年04月08日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】順序表的實現(xiàn)及基本操作完整代碼(C語言實現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】順序表的實現(xiàn)及基本操作完整代碼(C語言實現(xiàn))

    順序表:邏輯上相鄰的數(shù)據(jù)元素,其物理次序也是相鄰的 這里之所以要把int分別創(chuàng)建新名字為SqlElemType和Status,是因為實際應(yīng)用時數(shù)據(jù)的類型不一定是int型,這樣設(shè)置方便修改元素類型,提高代碼適用性。 LocateElem的時間復(fù)雜度為O(n) InsertSq的時間復(fù)雜度為O(n) DeleteSq的時間

    2024年04月12日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)(C語言實現(xiàn))——順序表的介紹及基本操作的實現(xiàn)

    今天我們來學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)中的線性表,本文主要介紹一種常見的線性表——順序表。 本文著重介紹順序表的概念以及順序表各種基本操作的實現(xiàn)過程(C語言實現(xiàn)),以后會更新更多的數(shù)據(jù)結(jié)構(gòu),覺得有用的朋友可以三連關(guān)注一波,一起學(xué)習(xí)。 線性表(linear list)是n個具有相

    2023年04月13日
    瀏覽(22)
  • C語言---數(shù)據(jù)結(jié)構(gòu)實驗---順序表的合并---鏈表的基本操作---重點解析約瑟夫問題

    C語言---數(shù)據(jù)結(jié)構(gòu)實驗---順序表的合并---鏈表的基本操作---重點解析約瑟夫問題

    實驗的寫法多種多樣,但本文并未采用 #define 定義容量的寫法,這樣寫已經(jīng)是很老舊過時的寫法。所有實驗主體采用均為動態(tài)開辟,后續(xù)如果利用 C++ 來寫或許會應(yīng)用更多語法… 本篇展示數(shù)據(jù)結(jié)構(gòu)的兩個實驗 其中,重點分析約瑟夫問題 實驗中代碼的命名風(fēng)格等均與下方博客

    2024年02月16日
    瀏覽(96)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包