91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言數據結構順序表怎么構造

發布時間:2022-04-13 10:28:02 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

本篇內容介紹了“C語言數據結構順序表怎么構造”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    前言

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

    什么是順序表?

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

    順序表一般可分為:

    1.靜態順序表:使用定長數組存儲。
    2.動態順序表:使用動態開辟的數組存儲。

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

    一、順序表的構造VS功能

    1.順序表的構造

    示例:

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

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

    C語言數據結構順序表怎么構造

    2.接口實現(功能)

    // 基本增刪查改接口
    // 順序表初始化
    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.初始化

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

    代碼如下(示例):

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

    2.銷毀

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

    代碼如下(示例):

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

    3.檢查size與capacity是否溢出

    動態進行就是根據輸入的數據改變自身數組的大小,故我們需要對溢出的情況進行正確的規避,至于為什么會溢出,因為我們在初始化的時候將其空間為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.尾增功能(實現)

    先上代碼:

    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");
    }

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

    其他功能看下面代碼

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

    #define _CRT_SECURE_NO_WARNINGS 1
    #include"SeqList.h"
    #include<assert.h>
    void SeqListInit(SeqList* pq)//初始化
    {
    	assert(pq);//斷言,判斷是否可以執行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);//尾刪暫時不實現

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

    C語言數據結構順序表怎么構造

    “C語言數據結構順序表怎么構造”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    兴城市| 雅江县| 固始县| 施秉县| 河池市| 樟树市| 兴和县| 诏安县| 酉阳| 大英县| 普兰店市| 宜兰市| 汤原县| 永平县| 昌图县| 德化县| 柘城县| 虞城县| 娄底市| 黄石市| 台前县| 南康市| 安陆市| 荣成市| 曲周县| 平乡县| 自治县| 民丰县| 酉阳| 汉寿县| 连江县| 木兰县| 宕昌县| 通江县| 镇江市| 工布江达县| 怀来县| 嘉鱼县| 宜良县| 满洲里市| 寻乌县|