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

C語言深入淺出講解順序表的實現

 更新時間:2022年04月14日 15:50:19   作者:scut-ALong  
線性表是最簡單的數據結構,而順序表又是最簡單的線性表,其基本思想是用一段地址連續(xù)的儲存單元依次存儲線性表的數據元素,比如我們常用的一維數組,下面代碼實現了順序表的定義以及基本操作

今天起開始編寫數據結構中的各種數據結構及算法的實現,說到順序表,我們首先得了解下線性表。

1.線性表

線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串…

線性表在邏輯上是線性結構,也就說是連續(xù)的一條直線。但是在物理結構上并不一定是連續(xù)的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

線性表的存儲

2.順序表

2.1 概念及結構

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

1.靜態(tài)順序表:使用定長數組存儲。

2.動態(tài)順序表:使用動態(tài)開辟的數組存儲。

//順序表的靜態(tài)存儲 
#define N 100
struct SeqList
{
	int a[N];//定長存儲
	int size;//有效數據的個數
};
//順序表的動態(tài)存儲
typedef struct SeqList
{
	SeqDataType* a;//指向動態(tài)開辟的數組
	int size;	  //有效數據個數
	int capacity; //容量
}SeqList;

順序表本質上是數組,在數組上增加了兩個要求:

1.插入數據的過程中,可以動態(tài)增長

2.并且要求里面存儲的數據必須是從左往右,是連續(xù)的

順序表的缺陷

1.動態(tài)增容有性能消耗

2.頭部插入數據時,需要挪動數據

2.2 提供接口

靜態(tài)順序表只適用于確定知道需要存多少數據的場景。靜態(tài)順序表的定長數組導致N定大了,空間開多了浪費,開少了不夠用。所以現實中基本都是使用動態(tài)順序表,根據需要動態(tài)的分配空間大小,所以下面我們來實現動態(tài)順序表。

首先在頭文件<SeqList.h>中提供接口:

typedef int SeqDataType; //需要插入什么類型的數據,就改成對應類型

typedef struct SeqList
{
	SeqDataType* a;//指向動態(tài)開辟的數組
	int size;	  //有效數據個數
	int capacity; //容量
}SeqList;

//內存中管理數據結構 提供增刪查改的接口
//順序表初始化
void SeqListInit(SeqList* pq);
//順序表銷毀
void SeqListDestory(SeqList* pq);
//順序表打印
void SeqListPrint(SeqList* pq);//打印數組
//檢查空間,如果滿了,進行增容
void SeqCheckCapacity(SeqList* pq)
//順序表尾插
void SeqListPushBack(SeqList* pq, SeqDataType x);
//順序表頭插
void SeqListPushFront(SeqList* pq, SeqDataType x);
//順序表尾刪
void SeqListPopBack(SeqList* pq);
//順序表頭刪
void SeqListPopFront(SeqList* pq);
//順序表查找x
int SeqListFind(SeqList* pq, SeqDataType x);//查找 查到返回下標,沒查到返回-1
//順序表在指定位置插入數據
void SeqListInsert(SeqList* pq, int pos, SeqDataType x);//在下標pos位置處插入數據
//順序表在指定位置刪除數據
void SeqListErase(SeqList* pq, int pos);//把下標為pos位置處的數據刪除
//順序表在指定位置替換數據
void SeqListModify(SeqList* pq, int pos, SeqDataType x);//把小標為pos位置的值改為x

2.3 接口實現

在源文件SeqList.c中實現接口功能

(1)順序表初始化

void SeqListInit(SeqList* pq)
{
	assert(pq != NULL);//或者 assert(pq); 斷言 防止傳入空指針
	pq->a = NULL;
	pq->size = 0;
	pq->capacity = 0;
}

(2)順序表銷毀

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

(3)順序表打印

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

(4)檢查空間,如果滿了,進行增容

//檢查是否需要擴容
void SeqCheckCapacity(SeqList* pq)
{
	//滿了,需要增容
	if (pq->size == pq->capacity)
	{
		int newcapacity = (pq->capacity == 0 ? 4 : pq->capacity * 2);

		//realloc接收的地址如果為空,將像malloc一樣,開辟一塊新空間
		SeqDataType* newA = realloc(pq->a, sizeof(SeqDataType) * newcapacity);//realloc返回 開辟的新空間的地址
		if (newA == NULL)
		{
			printf("realloc fail\n");
			exit(-1);//失敗了就退出
		}
		pq->a = newA;
		pq->capacity = newcapacity;
	}
}

(5)順序表尾插

void SeqListPushBack(SeqList* pq, SeqDataType x)//尾插
{
	assert(pq);

	SeqCheckCapacity(pq);

	pq->a[pq->size] = x;
	pq->size++;
}

(6)順序表頭插

void SeqListPushFront(SeqList* pq, SeqDataType x)
{
	assert(pq);

	SeqCheckCapacity(pq);

	int end = pq->size - 1;
	while (end >= 0)
	{
		pq->a[end + 1] = pq->a[end];
		end--;
	}
	pq->a[0] = x;
	pq->size++;
}

(7)順序表尾刪

void SeqListPopBack(SeqList* pq)
{
	assert(pq);
	assert(pq->size > 0);
	pq->size--;
}

(8)順序表頭刪

void SeqListPopFront(SeqList* pq)
{
	assert(pq);
	assert(pq->size > 0);

	int begin = 0;
	while (begin < pq->size - 1)
	{
		pq->a[begin] = pq->a[begin + 1];
		begin++;
	}
	pq->size--;
}

(9)順序表查找x

int SeqListFind(SeqList* pq, SeqDataType x)
{
	assert(pq);
	for (int i = 0; i < pq->size; ++i)
	{
		if (pq->a[i] == x)
		{
			return x;
		}
	}
	return -1;//沒找到
}

(10)順序表在指定位置插入數據

void SeqListInsert(SeqList* pq, int pos, SeqDataType x){<!--{C}%3C!%2D%2D%20%2D%2D%3E-->assert(pq);assert(pos >= 0 && pos < pq->size);SeqCheckCapacity(pq);//檢查是否需要擴容int end = pq->size - 1;while (end >= pos){<!--{C}%3C!%2D%2D%20%2D%2D%3E-->pq->a[end + 1] = pq->a[end];end--;}pq->a[pos] = x;pq->size++;}void SeqListInsert(SeqList* pq, int pos, SeqDataType x)
{
	assert(pq);
	assert(pos >= 0 && pos < pq->size);

	SeqCheckCapacity(pq);//檢查是否需要擴容

	int end = pq->size - 1;
	while (end >= pos)
	{
		pq->a[end + 1] = pq->a[end];
		end--;
	}
	pq->a[pos] = x;
	pq->size++;
}

(11)順序表在指定位置刪除數據

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

(12)順序表在指定位置替換數據

void SeqListModify(SeqList* pq, int pos, SeqDataType x)
{
	assert(pq);
	assert(pos >= 0 && pos < pq->size);

	pq->a[pos] = x;
}

主函數的設計大家可以自由發(fā)揮,做個簡單的測試功能調用函數或是創(chuàng)建菜單欄實現交互都可以。我水平有限,請朋友們諒解!寫的不好的地方還請大佬們指出。

下期預告——單鏈表

到此這篇關于C語言深入淺出講解順序表的實現的文章就介紹到這了,更多相關C語言 順序表內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++基于EasyX實現簡單掃雷游戲

    C++基于EasyX實現簡單掃雷游戲

    這篇文章主要為大家詳細介紹了C++基于EasyX實現簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 詳解C語言的預處理效果

    詳解C語言的預處理效果

    這篇文章主要為大家介紹了C語言的預處理效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C語言中sizeof()與strlen()的區(qū)別詳解

    C語言中sizeof()與strlen()的區(qū)別詳解

    這篇文章主要給大家介紹了關于C語言中sizeof()與strlen()區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • VC中實現GB2312、BIG5、Unicode編碼轉換的方法

    VC中實現GB2312、BIG5、Unicode編碼轉換的方法

    這篇文章主要介紹了VC中實現GB2312、BIG5、Unicode編碼轉換的方法,該功能非常實用,需要的朋友可以參考下
    2014-07-07
  • Qt模仿實現文字浮動字母的效果

    Qt模仿實現文字浮動字母的效果

    這篇文章主要介紹了通過Qt實現的文字浮動的效果,效果很簡單就是文本向上移動,在移動過程中文字整體變大或縮小。感興趣的可以試一試
    2022-01-01
  • QT線程池的使用(QThreadPool類和QRunnable類)

    QT線程池的使用(QThreadPool類和QRunnable類)

    本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • C語言入門之基礎知識詳解

    C語言入門之基礎知識詳解

    這篇文章主要介紹了C語言入門之基礎知識詳解,文中有非常詳細的C語言使用教程及相關基礎知識,對正在學習c語言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • C++實現四則運算器(無括號)

    C++實現四則運算器(無括號)

    這篇文章主要為大家詳細介紹了C++實現四則運算器,無括號的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言報錯Use of Uninitialized Variable的原因及解決方案

    C語言報錯Use of Uninitialized Variable的原因及解決方案

    Use of Uninitialized Variable是C語言中常見且危險的錯誤之一,它通常在程序試圖使用一個未初始化的變量時發(fā)生,本文將詳細介紹Use of Uninitialized Variable的產生原因,提供多種解決方案,并通過實例代碼演示如何有效避免和解決此類錯誤,需要的朋友可以參考下
    2024-06-06
  • c++11 新特性——智能指針使用詳解

    c++11 新特性——智能指針使用詳解

    這篇文章主要介紹了c++11 新特性——智能指針使用的相關資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-02-02

最新評論

重庆市| 阿克| 耿马| 集安市| 峨山| 辽源市| 盐津县| 台州市| 潮安县| 鹿泉市| 梁山县| 宜昌市| 炎陵县| 宁远县| 合山市| 孙吴县| 穆棱市| 五寨县| 泸西县| 五峰| 武山县| 吉水县| 宁波市| 青田县| 丁青县| 大埔县| 谷城县| 吉隆县| 宜兴市| 田东县| 许昌县| 泰来县| 岳普湖县| 谷城县| 玉田县| 湖口县| 楚雄市| 海兴县| 雷波县| 界首市| 台前县|