最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言動態(tài)順序表實例代碼

 更新時間:2021年12月19日 15:06:20   作者:bitzhan  
大家好,本篇文章主要講的是C語言動態(tài)順序表實例代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

順序表概念:

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

代碼解析:

一.準(zhǔn)備工作

1.?首先對一些頭文件的引用和創(chuàng)建一個結(jié)構(gòu)體,結(jié)構(gòu)體包含一個數(shù)組,size表示該數(shù)組目前有多少個元素,capacity表示目前數(shù)組能存多少個元素。例如:

?

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>
 
typedef int DataType;
typedef struct SeqList
{
	DataType* a;
	int size;
	int capacity;
}SL;

2.創(chuàng)建一個順序表

SL sl;

二、順序表的基本操作?

1.順序表的初始化函數(shù)

? ? ? ? ?注意這里的參數(shù)得是指針,形參是實參的一份臨時拷貝,所以得把地址傳給函數(shù)才能改變值。

void SeqListInit(SL* sl)
{
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

2.尾插函數(shù)(在尾部插入數(shù)據(jù))

? ? ? ? 寫尾插函數(shù)之前我們得先判斷一下數(shù)組空間是否夠。例如下面的例子。

所以我們要先檢查空間是否滿了,滿了就擴(kuò)容

將這個判斷空間函數(shù)命名為? void CheckSpace(SL* sl) (這是動態(tài)順序表區(qū)別于靜態(tài)順序表最主要的部分)?

void CheckSpace(SL* sl)
{
	if (sl->size == sl->capacity)
	{
		//因為capacity一開始等于0,所以先給capacity一個值
		int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
		DataType* tmp = (DataType*)realloc(sl->a, sizeof(DataType)*newcapacity);
		if (tmp == NULL)
		{
			printf("開辟失敗\n");
			exit(-1);
		}
		else
		{
			sl->capacity = newcapacity;
			sl->a = tmp;
		}
	}
}

尾插函數(shù):

void SeqListPushBack(SL* sl, DataType x)
{
CheckSpace(sl);
	sl->a[sl->size] = x;
	sl->size++;
}

3.頭插函數(shù)(在數(shù)組頭部插入數(shù)據(jù))

? ? ? ?

void SeqListPushFront(SL* sl, DataType x)
{
	//因為插入的時候都要檢查空間是不是滿了,滿了就擴(kuò)容
	CheckSpace(sl);
	for (int end = sl->size - 1; end >= 0; end--)
	{
		sl->a[end + 1] = sl->a[end];
	}
	sl->a[0] = x;
	sl->size++;
}

?挪數(shù)據(jù)對應(yīng)著for循環(huán)的代碼,最后再給數(shù)組的第一個位置賦值。別忘了對size+1.

?4.尾刪函數(shù)

? ? ? ? 如果size等于0了就說明順序表中沒有數(shù)據(jù)了,所以

void SeqListPopBack(SL* sl)
{
	assert(sl->size > 0);
	sl->size--;
}

5.頭刪函數(shù)

? ? ? ? 從第二個數(shù)據(jù)開始整體往前挪以為就可以了。(要從前面開始挪):

void SeqListPopFront(SL* sl)
{
	for (int i = 1; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}

6.在第pos的位置插入數(shù)據(jù)

? ? ? ? 首先pos不能小于現(xiàn)有的數(shù)據(jù)個數(shù)。

? ? ? ? 第二判斷空間,滿了就擴(kuò)容。

? ? ? ? 第三:從第pos個位置的數(shù)據(jù)開始(這里第pos個位置的數(shù)據(jù)在數(shù)組中的下標(biāo)是pos-1)?將后面的數(shù)據(jù)整體往后挪一位。

? ? ? ? 第四:再這個位置賦值,別忘了對size++;

void SeqListInsert(SL* sl, int pos, DataType x)
{
	//查看空間
	assert(pos <= sl->size);
	CheckSpace(sl);
	for (int end = sl->size-1; end >= pos-1; end--)//這里不能用sl->size--
	{
		sl->a[end+1] = sl->a[end];
	}
	sl->a[pos - 1] = x;
	sl->size++;
}

7.刪除第pos個位置的數(shù)據(jù)

? ? ? ? 首先pos不能小于現(xiàn)有數(shù)據(jù)個數(shù)

? ? ? ? 第二:將從第pos個位置的數(shù)據(jù)開始到最后一個數(shù)據(jù)往前挪一位

? ? ? ? 第三:對size--?

void SeqListErase(SL* sl, int pos)
{
	assert(pos <=sl->size);
	for (int i = pos; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}

8.修改第pos個位置的數(shù)據(jù)

? ? ? ? 一:pos不能小于現(xiàn)有數(shù)據(jù)個數(shù)

? ? ? ? 二:賦值。第pos個位置的數(shù)據(jù)在數(shù)組中下標(biāo)是pos-1。(因為數(shù)組下表從0開始)

void SeqListModify(SL* sl, int pos, DataType x)
{
	assert(pos <= sl->size);
	sl->a[pos - 1] = x;
}

9.查找函數(shù)。

? ? ? ? 遍歷一遍看是否有這個數(shù)據(jù),有就返回數(shù)據(jù)是第幾個元素。(這里我不是返回該數(shù)據(jù)在數(shù)組中的下標(biāo),我是返回 下標(biāo)+1)?

? ? ? ? 這里我沒有考慮如果有兩個一樣的數(shù)據(jù)的情況。

int SeqListFind(SL* sl, DataType x)
{
	for (int i = 0; i < sl->size;i++)
	{
		if (sl->a[i] == x)
		{
			i++;
			printf("在第%d個位置\n", i);
			return i;
		}
	}
	printf("沒有此數(shù)據(jù)\n");
	return -1;
}

10.銷毀函數(shù)

? ? ? ? 釋放sl->a之后要對它置空,因為指針free之后,free函數(shù)只是把指針指向的內(nèi)存空間釋放了,即內(nèi)存中存儲的值,但是并沒有將指針的值賦為NULL,指針仍然指向這塊內(nèi)存。?

void SeqListDestory(SL* sl)
{
	free(sl->a);
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

11.打印函數(shù)

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

三、總代碼:

? ? ? ? 菜單寫的比較簡單。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>
 
typedef int DataType;
typedef struct SeqList
{
	DataType* a;
	int size;
	int capacity;
}SL;
 
void SeqListInit(SL* sl)
{
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}
 
void SeqListPrint(SL* sl)
{
	for (int i = 0; i < sl->size; i++)
	{
		printf("%d ", sl->a[i]);
	}
	printf("\n");
}
 
void CheckSpace(SL* sl)
{
	if (sl->size == sl->capacity)
	{
		//因為capacity一開始等于0,所以先給capacity一個值
		int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
		DataType* tmp = (DataType*)realloc(sl->a, sizeof(DataType)*newcapacity);
		if (tmp == NULL)
		{
			printf("開辟失敗\n");
			exit(-1);
		}
		else
		{
			sl->capacity = newcapacity;
			sl->a = tmp;
		}
	}
}
 
void SeqListPushBack(SL* sl, DataType x)
{
	//看空間是不是滿了,滿了就擴(kuò)容
	//if (sl->size == sl->capacity)
	//{
	//	//因為capacity一開始等于0,所以先給capacity一個值
	//	int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
	//	DataType* tmp = (DataType*)realloc(sl->a, sizeof(DataType)*newcapacity);
	//	if (tmp == NULL)
	//	{
	//		printf("開辟失敗\n");
	//		exit(-1);
	//	}
	//	else
	//	{
	//		sl->a = tmp;
	//	}
	//}
	//封裝成一個函數(shù)
	CheckSpace(sl);
	sl->a[sl->size] = x;
	sl->size++;
}
 
void SeqListPushFront(SL* sl, DataType x)
{
	//因為插入的時候都要檢查空間是不是滿了,滿了就擴(kuò)容
	CheckSpace(sl);
	for (int end = sl->size - 1; end >= 0; end--)
	{
		sl->a[end + 1] = sl->a[end];
	}
	sl->a[0] = x;
	sl->size++;
}
 
void SeqListPopBack(SL* sl)
{
	assert(sl->size > 0);
	sl->size--;
}
 
void SeqListPopFront(SL* sl)
{
	for (int i = 1; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}
 
void SeqListInsert(SL* sl, int pos, DataType x)
{
	//查看空間
	assert(pos <= sl->size);
	CheckSpace(sl);
	for (int end = sl->size - 1; end >= pos - 1; end--)//這里不能用sl->size--
	{
		sl->a[end + 1] = sl->a[end];
	}
	sl->a[pos - 1] = x;
	sl->size++;
}
 
void SeqListErase(SL* sl, int pos)
{
	assert(pos <= sl->size);
	for (int i = pos; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}
 
void SeqListModify(SL* sl, int pos, DataType x)
{
	assert(pos <= sl->size);
	sl->a[pos - 1] = x;
}
 
int SeqListFind(SL* sl, DataType x)
{
	for (int i = 0; i < sl->size; i++)
	{
		if (sl->a[i] == x)
		{
			i++;
			printf("在第%d個位置\n", i);
			return i;
		}
	}
	printf("沒有此數(shù)據(jù)\n");
	return -1;
}
 
void SeqListDestory(SL* sl)
{
	free(sl->a);
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}
 
 
void menu()
{
	printf("******************************\n");
	printf("*** 1.尾插數(shù)據(jù)  2.頭插數(shù)據(jù) ***\n");
	printf("*** 3.在第pos個位置插入數(shù)據(jù)***\n");
	printf("*** 4.尾刪數(shù)據(jù)  5.頭刪數(shù)據(jù) ***\n");
	printf("*** 6.在第pos個位置刪除數(shù)據(jù)***\n");
	printf("*** 7.修改第pos個位置的數(shù)據(jù)***\n");
	printf("*** 8.查找數(shù)據(jù) 9.打印數(shù)據(jù)  ***\n");
	printf("********** -1.退出 ***********\n");
	printf("******************************\n");
}
int main()
{
	SL sl;
	SeqListInit(&sl);
	int option = 0;
	int x = 0;
	int pos = 1;
	while (option != -1)
	{
		menu();
		scanf("%d", &option);
		switch (option)
		{
		case 1:
			printf("請輸入要插入的數(shù)據(jù),以-1結(jié)束:\n");
			do
			{
				scanf("%d", &x);
				if (x != -1)
				{
					SeqListPushBack(&sl, x);
				}
			} while (x != -1);
			break;
		case 2:
			printf("請輸入要插入的數(shù)據(jù),以-1結(jié)束:\n");
			do
			{
				scanf("%d", &x);
				if (x != -1)
				{
					SeqListPushFront(&sl, x);
				}
			} while (x != -1);
			break;
		case 3:
			printf("請輸入要插入的數(shù)據(jù),要從第幾個插入,以非正正數(shù)結(jié)束\n");
			do
			{
				scanf("%d", &x);
				scanf("%d", &pos);
				if (pos >= 0)
				{
					SeqListInsert(&sl, pos, x);
				}
			} while (pos >= 0);
			break;
		case 4:
			SeqListPopBack(&sl);
			break;
		case 5:
			SeqListPopFront(&sl);
			break;
		case 6:
			printf("請輸入要刪除第幾個位置的數(shù)據(jù),以非正正數(shù)結(jié)束\n");
			do
			{
				scanf("%d", &pos);
				if (pos>0)
				{
					SeqListErase(&sl, pos);
				}
			} while (pos>0);
			break;
		case 7:
			printf("請輸入要修改的數(shù)據(jù),要修改第幾個數(shù)據(jù),以非正整數(shù)結(jié)束\n");
			do
			{
				scanf("%d", &x);
				scanf("%d", &pos);
				if (pos>0)
				{
					SeqListInsert(&sl, pos, x);
				}
			} while (pos>0);
			break;
		case 8:
			printf("請輸入需要查找的數(shù)據(jù)\n");
			scanf("%d", &x);
			SeqListFind(&sl, x);
			break;
		case 9:
			SeqListPrint(&sl);
			break;
		case -1:
			printf("退出\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入\n");
		}
	}
	SeqListDestory(&sl);
	return 0;
}

到此這篇關(guān)于C語言動態(tài)順序表實例代碼的文章就介紹到這了,更多相關(guān)C語言順序表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++編寫實現(xiàn)圖書管理系統(tǒng)

    C++編寫實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++編寫實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解C++ 中的臨時對象

    詳解C++ 中的臨時對象

    這篇文章主要介紹了C++ 中的臨時對象的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C語言實現(xiàn)雙人貪吃蛇游戲?qū)嵗a

    C語言實現(xiàn)雙人貪吃蛇游戲?qū)嵗a

    大家好,本篇文章主要講的是C語言實現(xiàn)雙人貪吃蛇游戲?qū)嵗a,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++實現(xiàn)string存取二進(jìn)制數(shù)據(jù)的方法

    C++實現(xiàn)string存取二進(jìn)制數(shù)據(jù)的方法

    這篇文章主要介紹了C++實現(xiàn)string存取二進(jìn)制數(shù)據(jù)的方法,針對STL中string的用法進(jìn)行了較為詳細(xì)的分析,需要的朋友可以參考下
    2014-10-10
  • C++獲取項目路徑的兩種方式詳解

    C++獲取項目路徑的兩種方式詳解

    這篇文章主要介紹了C++獲取項目路徑的兩種方式的相關(guān)資料,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • 淺談C++ IO流

    淺談C++ IO流

    這篇文章主要介紹了C++ IO流的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • Cocos2d-x 3.x入門教程(一):基礎(chǔ)概念

    Cocos2d-x 3.x入門教程(一):基礎(chǔ)概念

    這篇文章主要介紹了Cocos2d-x 3.x入門教程(一):基礎(chǔ)概念,本文講解了Director、Scene、Layer、Sprite等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • C++實現(xiàn)藍(lán)橋杯競賽題目---搭積木

    C++實現(xiàn)藍(lán)橋杯競賽題目---搭積木

    這篇文章主要介紹了C++實現(xiàn)藍(lán)橋杯競賽題目---搭積木,本篇文章通過題目分析列舉公式進(jìn)行分析算法,包含詳細(xì)的圖文,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)掃雷程序

    C語言實現(xiàn)掃雷程序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)掃雷程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++中異常的深度解析

    C++中異常的深度解析

    異常處理機(jī)制允許程序中獨立開發(fā)部分能夠在運(yùn)行時就出現(xiàn)的問題進(jìn)行通信并做出相應(yīng)的處理,這篇文章主要介紹了C++中異常的深度解析,需要的朋友可以參考下
    2025-03-03

最新評論

金塔县| 武川县| 柳林县| 黄骅市| 普宁市| 台江县| 新乡县| 兴化市| 观塘区| 黄骅市| 哈巴河县| 丹寨县| 舒城县| 喀喇| 安乡县| 东丽区| 宽甸| 田东县| 周口市| 当雄县| 特克斯县| 抚宁县| 望江县| 全州县| 磴口县| 阿勒泰市| 温宿县| 义乌市| 乡城县| 铜鼓县| 会东县| 松滋市| 灵丘县| 广水市| 遵义县| 庆元县| 盈江县| 江门市| 古蔺县| 顺义区| 池州市|