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

C語言數據結構順序表的進階講解

 更新時間:2022年04月12日 18:11:54   作者:Fighting陽!  
程序中經常需要將一組數據元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數等。一組數據中包含的元素個數可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關系由它們的存儲順序自然表示

前言

在學習鏈表之前先掌握順序表

什么是順序表?

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

順序表一般可分為:

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

提示:由于靜態(tài)功能有限,這里主要討論動態(tài)順序表

一、順序表的構造VS功能

1.順序表的構造

示例:

typedef int SeqDataType
// 順序表的動態(tài)存儲
typedef struct SeqList
{
 SeqDataType* a; // 指向動態(tài)開辟的數組
 size_t size ; // 有效數據個數
 size_t capicity ; // 容量空間的大小
}SeqList;

這里使用SeqDataType定義是由于我們不知道a是什么類型的數組,因此我們要靈活運用功能就要事先定義SeqDataType的類型(此例為int),以便后續(xù)結構類型改變時容易操作

在這里插入圖片描述

2.接口實現(xiàn)(功能)

// 基本增刪查改接口
// 順序表初始化
void SeqListInit(SeqList* psl, size_t capacity);
// 順序表銷毀
void SeqListDestory(SeqList* psl);
// 順序表打印
void SeqListPrint(SeqList* psl);
// 檢查空間,如果滿了,進行增容
void CheckCapacity(SeqList* psl);
// 順序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 順序表尾刪
void SeqListPopBack(SeqList* psl);
// 順序表頭插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 順序表頭刪
void SeqListPopFront(SeqList* psl);
// 順序表查找
int SeqListFind(SeqList* psl, SLDataType x); 

二、功能具體分析

1.初始化

在實現(xiàn)具體項目功能之前,要事先做好準備,即初始化,將其置空,assert函數下文講解

代碼如下(示例):

void SeqListInit(SeqList* pq)//初始化
{
	assert(pq);//斷言,判斷是否可以執(zhí)行1/0
	pq->a = NULL;
	pq->size = 0;
	pq->capacity = 0;
}

2.銷毀

銷毀是在結束之后需要進行的操作,因為這里是動態(tài),需要考慮空間釋放,以免造成空間泄露。(先提到銷毀是因為其與初始化為首位)

代碼如下(示例):

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

3.檢查size與capacity是否溢出

動態(tài)進行就是根據輸入的數據改變自身數組的大小,故我們需要對溢出的情況進行正確的規(guī)避,至于為什么會溢出,因為我們在初始化的時候將其空間為0,無論第一次輸入多少數據都會溢出。

void SeqCheckCapacity(SeqList* pq)
{
	if (pq->size == pq->capacity)//滿了,需要增容
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;
	//SeqDataType* newA = malloc(sizeof(SeqDataType) * newcapacity);
	  SeqDataType* newA  =realloc(pq->a,sizeof(SeqDataType)* newcapacity);//或者直接擴容
		if (newA == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pq->a = newA;
		pq->capacity = newcapacity;
	}
}

習慣上在擴容時我們習慣將其放大二倍的操作,由于realloc擴容分為兩種情況(這里暫時不討論),故如果擴容失敗我們需要截止,并打印錯誤。

4.尾增功能(實現(xiàn))

先上代碼:

void SeqListPushBack(SeqList* pq, SeqDataType x)
{
	assert(pq);
	SeqCheckCapacity(pq);
	pq->a[pq->size] = x;
	pq->size++;
}

顧名思義就是在尾部增添內容,size正對應有效數組下標的下一位,對該位置進行賦值,最后有效數組size應+1,由于尾增之前我們不知道其capacity是否等于size

故我們需要進行檢查seqCheckCapacity,如果相等,則需要擴容。

5.打印

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

這里具體就沒什么了,只是為了保證程序功能能夠具體完整實現(xiàn)

其他功能看下面代碼

三、實現(xiàn)具體功能代碼頁(SeqList.c)

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
#include<assert.h>
void SeqListInit(SeqList* pq)//初始化
{
	assert(pq);//斷言,判斷是否可以執(zhí)行1/0
	pq->a = NULL;
	pq->size = 0;
	pq->capacity = 0;
}
void SeqListDestory(SeqList* pq)
{
	assert(pq);
	free(pq->a);
	pq->a = NULL;
	pq->capacity = pq->size = 0;
}
void SeqCheckCapacity(SeqList* pq)
{
	if (pq->size == pq->capacity)//滿了,需要增容
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;
	//SeqDataType* newA = malloc(sizeof(SeqDataType) * newcapacity);
	  SeqDataType* newA  =realloc(pq->a,sizeof(SeqDataType)* newcapacity);//或者直接擴容
		if (newA == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pq->a = newA;
		pq->capacity = newcapacity;
	}
}
void SeqListPushBack(SeqList* pq, SeqDataType x)
{
	assert(pq);
	SeqCheckCapacity(pq);
	pq->a[pq->size] = x;
	pq->size++;
}

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

}
void SeqListPopBack(SeqList* pq)
{
	assert(pq);
	assert(pq->size > 0);
	--pq->size;
}
void SeqListPopFront(SeqList* pq);//尾刪暫時不實現(xiàn)

test.c主函數代碼頁

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"SeqList.h"

void TestSeqList1()
{
	SeqList s;
	SeqListInit(&s);//?
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
    SeqListPushFront(&s, 0);
    SeqListPushFront(&s, 0);
    SeqListPushFront(&s, 0);
    SeqListPushFront(&s, 0);
	SeqListPrint(&s);
	SeqListPopBack(&s);
	SeqListPrint(&s);
	SeqListPopBack(&s);
	SeqListPrint(&s);
	SeqListDestory(&s);//
}
int main()
{
	TestSeqList1();
	return 0;
}

在這里插入圖片描述

四.總結

順序表類型實現(xiàn)通訊錄后期會更,此目的是為了捋清楚如何構造各項結構與結構之間的關系->數據結構,尾刪,首刪,首增功能都較為容易,可以看上部分SeqList.c。此外,assert函數為斷言,目的是防止出現(xiàn)錯誤卻找不到并且執(zhí)行的情況,其引用的頭文件為:assert.h。

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

相關文章

  • Windows系統(tǒng)vscode安裝與配置G++、Cmake的圖文步驟

    Windows系統(tǒng)vscode安裝與配置G++、Cmake的圖文步驟

    本文主要介紹了Windows系統(tǒng)vscode安裝與配置G++、Cmake的步驟,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • C++類的靜態(tài)成員初始化詳細講解

    C++類的靜態(tài)成員初始化詳細講解

    通常靜態(tài)數據成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時使用作用域操作符來指出靜態(tài)成員所屬的類.但如果靜態(tài)成員是整型或是枚舉型const,則可以在類聲明中初始化
    2013-09-09
  • OpenCV實現(xiàn)圖像距離變換

    OpenCV實現(xiàn)圖像距離變換

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像距離變換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • c++語言中虛函數實現(xiàn)多態(tài)的原理詳解

    c++語言中虛函數實現(xiàn)多態(tài)的原理詳解

    這篇文章主要給大家介紹了關于c++語言中虛函數實現(xiàn)多態(tài)的原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用c++語言具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • C++實現(xiàn)LeetCode(119.楊輝三角之二)

    C++實現(xiàn)LeetCode(119.楊輝三角之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(119.楊輝三角之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)高精度的加法

    C語言實現(xiàn)高精度的加法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)高精度的加法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++探索構造函數私有化會產生什么結果

    C++探索構造函數私有化會產生什么結果

    C++的構造函數的作?:初始化類對象的數據成員。即類的對象被創(chuàng)建的時候,編譯系統(tǒng)對該對象分配內存空間,并?動調?構造函數,完成類成員的初始化。構造函數的特點:以類名作為函數名,?返回類型
    2022-05-05
  • 一文讓你不再害怕指針之C指針詳解(經典,非常詳細)

    一文讓你不再害怕指針之C指針詳解(經典,非常詳細)

    這篇文章主要給大家介紹了C指針的相關資料,文中介紹的很經典,非常詳細,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C指針具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • 淺談C++虛重載操作符 virtual operator= 的使用方法

    淺談C++虛重載操作符 virtual operator= 的使用方法

    下面小編就為大家?guī)硪黄獪\談C++虛重載操作符 virtual operator= 的使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++基礎入門篇之強制轉換

    C++基礎入門篇之強制轉換

    這篇文章主要給大家介紹了關于C++基礎入門篇之強制轉換的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論

鄂尔多斯市| 沈丘县| 特克斯县| 金塔县| 沂水县| 永仁县| 化隆| 定襄县| 昌平区| 东山县| 尚义县| 道真| 小金县| 胶南市| 汾西县| 绍兴县| 武山县| 城口县| 望奎县| 台南市| 微山县| 贡觉县| 海兴县| 明溪县| 廉江市| 三江| 镇坪县| 西盟| 阿巴嘎旗| 永登县| 临澧县| 惠州市| 荆门市| 旺苍县| 美姑县| 常熟市| 高淳县| 高邮市| 新化县| 绩溪县| 屏南县|