1. 程式人生 > >C語言實現動態順序表(Linux環境)

C語言實現動態順序表(Linux環境)

SeqList.h

/*************************************************************************
	> File Name: SeqList.h
	> Author: 
	> Mail: 
	> Created Time: Tue Oct 23 19:16:35 2018
 ************************************************************************/

#ifndef _SEQLIST_H
#define _SEQLIST_H
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>

typedef int DataType;
typedef struct SeqList
{
    DataType* array;
    int size;//尺寸,裡面有多少東西
    int capacity;//容量  對應MAX_SIZE
}SList;



//初始化動態順序表
void SeqListInit(SList* pSeq)
{
    const int init_capacity = 5;//容量固定
    assert(pSeq != NULL);
    pSeq->size = 0;//size 置零
    pSeq->capacity = init_capacity;
    pSeq->array = (DataType *)malloc(sizeof(DataType)* init_capacity);
    assert(pSeq->array);
}


//銷燬動態順序表
void SeqListDestroy(SList* pSeq)
{
    free(pSeq->array);
    pSeq->array = NULL;
    pSeq->size = 0;
    pSeq->capacity = 0;
}



//判斷是否要進行擴容
void ExpandIfRequired(SList* pSeq)
{
    //表未滿,不需要擴容
    if(pSeq->size < pSeq->capacity)
    {
        return ;
    }
    //表已經滿了,需要擴容
    int newCapacity = pSeq->capacity * 2;//一般情況,一個不夠給兩個,再不夠給定三個 capacity
    DataType* newArray = (DataType *)malloc(sizeof(DataType) * newCapacity);
    assert(newArray);
    int i = 0;
    for(i = 0; i < pSeq->size; i++)
    {
        newArray[i] = pSeq->array[i];//搬移陣列,將老陣列元素搬移到新陣列中
    }

    free(pSeq->array);//釋放老陣列空間
    pSeq->array = newArray;//更新新陣列
    pSeq->capacity = newCapacity;//更新 capacity
}


//動態順序表尾插
void SeqListPushBack(SList* pSeq, DataType data)
{
    assert(pSeq != NULL);
    //擴容
    ExpandIfRequired(pSeq);//呼叫判斷是否進行擴容函式
    pSeq->array[pSeq->size++] = data;
}


//動態順序表列印
void SeqListPrint(const SList* pSeq)
{
    int i = 0;
    for(i = 0; i <pSeq->size; i++)
    {
        printf("%d ", pSeq->array[i]);
    }
    printf("\n");
}

void SeqListTest()
{
    SList pSeq;
    SeqListInit(&pSeq);//初始化動態順序表
    /* 尾插除錯 */
    SeqListPushBack(&pSeq, 1);
    SeqListPushBack(&pSeq, 2);
    SeqListPushBack(&pSeq, 3);
    SeqListPushBack(&pSeq, 4);
    SeqListPushBack(&pSeq, 5);
    /* 列印尾插之後的順序表 */
    SeqListPrint(&pSeq);

}


#endif

test.c

/*************************************************************************
	> File Name: test.c
	> Author: 
	> Mail: 
	> Created Time: Tue Oct 23 19:34:22 2018
 ************************************************************************/

#include"SeqList.h"
int main()
{
    SeqListTest();
    return 0;
}