溫馨提示×

溫馨提示×

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

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

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

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

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

    前言

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

    什么是順序表?

    順序表是用一段物理地址連續(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ù)結構類型改變時容易操作

    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);//斷言,判斷是否可以執(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.尾增功能(實現)

    先上代碼:

    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);//斷言,判斷是否可以執(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);//尾刪暫時不實現

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

    向AI問一下細節(jié)

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

    AI