亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言數(shù)據(jù)結(jié)構(gòu)順序表的進階講解

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

前言

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

什么是順序表?

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

順序表一般可分為:

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

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

一、順序表的構(gòu)造VS功能

1.順序表的構(gòu)造

示例:

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

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

在這里插入圖片描述

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函數(shù)下文講解

代碼如下(示例):

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

2.銷毀

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

代碼如下(示例):

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

3.檢查size與capacity是否溢出

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

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++;
}

顧名思義就是在尾部增添內(nèi)容,size正對應有效數(shù)組下標的下一位,對該位置進行賦值,最后有效數(shù)組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主函數(shù)代碼頁

#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;
}

在這里插入圖片描述

四.總結(jié)

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

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

相關(guān)文章

  • C++實現(xiàn)添加圖片水印到PDF文檔

    C++實現(xiàn)添加圖片水印到PDF文檔

    水印是顯示在文檔內(nèi)容后面的淡色文字或圖片,可以用于指示文檔的狀態(tài)(保密、草稿等),本文主要為大家介紹了如何使用?Spire.PDF?for?C++?在?PDF?文檔中添加圖片水印,需要的可以參考下
    2023-11-11
  • C語言中那些你必須知道的常用關(guān)鍵字

    C語言中那些你必須知道的常用關(guān)鍵字

    這篇文章主要介紹了C語言中我們常用的關(guān)鍵字靜態(tài)static的詳細講解和typedef?、#define定義常量和宏,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • 基于堆的基本操作的介紹

    基于堆的基本操作的介紹

    本篇文章對堆的基本操作進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • OpenCV計算輪廓長度/周長和面積

    OpenCV計算輪廓長度/周長和面積

    這篇文章主要為大家詳細介紹了OpenCV計算輪廓長度/周長和面積,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++中的自定義函數(shù)返回類型

    C++中的自定義函數(shù)返回類型

    這篇文章主要介紹了C++中的自定義函數(shù)返回類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++統(tǒng)計軟件使用時間代碼示例

    C++統(tǒng)計軟件使用時間代碼示例

    這篇文章主要介紹了C++統(tǒng)計軟件使用時間的小程序,大家可以參考使用
    2013-11-11
  • 淺談C++為什么非要引入那幾種類型轉(zhuǎn)換

    淺談C++為什么非要引入那幾種類型轉(zhuǎn)換

    這篇文章主要介紹了C++為什么非要引入那幾種類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 舉例講解C語言對歸并排序算法的基礎(chǔ)使用

    舉例講解C語言對歸并排序算法的基礎(chǔ)使用

    這篇文章主要介紹了C語言對歸并排序算法的使用,歸并排序算法的平均事件復雜度為(n\log n),需要的朋友可以參考下
    2016-05-05
  • C語言在屏幕上輸出楊輝三角

    C語言在屏幕上輸出楊輝三角

    這篇文章主要介紹了在屏幕上輸出楊輝三角的方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    本文主要介紹了如何使用visual studi2019配置qt5開發(fā)環(huán)境,以及創(chuàng)建qt項目,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論