動態順序表的實現


SeqlistD.h

#pragma once

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int DataType; 
typedef unsigned int size_t; 

typedef struct SeqListD 
{ 
	DataType* _array; 
	size_t _capacity; // 底層空間的大小 
	size_t _size; // 有效元素的個數 
}SeqListD, *PSeqListD; 


///////////////////////////////////////////////// 
void SeqListDInit(PSeqListD pSeq); 
void SeqListDPushBack(PSeqListD pSeq, DataType data); 
void SeqListDPopBack(PSeqListD pSeq); 
void SeqListDInsert(PSeqListD pSeq,int pos,DataType data);
void SeqListDErase(PSeqListD pSeq,int pos);
int SeqListDEmpty(PSeqListD pSeq); 
size_t SeqListDSize(PSeqListD pSeq); 

// 清空順序表中的所有元素,注意不改變底層空間的大小 
void SeqListDClear(PSeqListD pSeq); 
size_t SeqListDCapacity(PSeqListD pSeq); 

// 銷毀順序表 
void SeqListDDestroy(PSeqListD pSeq); 

// 檢測順序表是否需要增容 
int CheckCapacity(PSeqListD pSeq); 
void PrintfSeqlistD(PSeqListD pSeq);

////////////////////////////////////////////////////
void SeqListDInit(PSeqListD pSeq)                      //初始化
{
	
	if(NULL==pSeq)
		return;
	pSeq->_array=(DataType* )malloc(3*sizeof(DataType));
	pSeq->_capacity=3;
	pSeq->_size=0;
    
}
void SeqListDPushBack(PSeqListD pSeq, DataType data)   //尾插
{
	if(NULL==pSeq)
		return;
	CheckCapacity(pSeq);

	pSeq->_array[pSeq->_size++]=data;
}
void SeqListDPopBack(PSeqListD pSeq)                  //尾刪
{
	if(NULL==pSeq)
		return;
	pSeq->_array[pSeq->_size-1]=0;
    pSeq->_size--;    
}

void SeqListDInsert(PSeqListD pSeq,int pos,DataType data)   //任意位置插入
{
    int i=0;
	if(NULL==pSeq)
		return;
    CheckCapacity(pSeq);
	for (i=pSeq->_size-1;i>=pos-1;i--)
	{
		pSeq->_array[i+1]=pSeq->_array[i];
	}
    pSeq->_array[pos-1]=data;
	pSeq->_size++;
}
void SeqlistDErase(PSeqListD pSeq,int pos)      //任意位置刪除
{
    int i=0;
	if(NULL==pSeq)
		return;
    for (i=pos;i<pSeq->_size;i++)
    {
		pSeq->_array[i-1]=pSeq->_array[i];
    }
	pSeq->_size--;
}
size_t SeqListDSize(PSeqListD pSeq)
{
	if(NULL==pSeq)
		exit(EXIT_FAILURE);
	return pSeq->_size;
}

// 清空順序表中的所有元素,注意不改變底層空間的大小 
void SeqListDClear(PSeqListD pSeq)
{
    if(NULL==pSeq)
		return;
	pSeq->_size=0;
}
size_t SeqListDCapacity(PSeqListD pSeq)
{
	if(NULL==pSeq)
		exit(EXIT_FAILURE);
	return pSeq->_capacity;
}

// 銷毀順序表 
void SeqListDDestroy(PSeqListD pSeq)
{
	if(NULL==pSeq)
		return;
	free(pSeq->_array);
	pSeq->_array=NULL;
	pSeq->_capacity=0;
	pSeq->_size=0;
}

// 檢測順序表是否需要增容 
int CheckCapacity(PSeqListD pSeq)
{
	DataType* tmp=NULL;
	if(NULL==pSeq)
		return 0;
	
	if(pSeq->_capacity==pSeq->_size)
	{
		size_t newCapacity=pSeq->_capacity*2;
		tmp=(DataType*)realloc(pSeq->_array,newCapacity*sizeof(DataType));
		if(NULL==tmp)
			return 0;
		pSeq->_array=tmp;
        pSeq->_capacity=newCapacity; 
	}
	return 0;
}
void PrintfSeqlistD(PSeqListD pSeq)
{
	size_t i=0;
	if(NULL==pSeq)
		return;
    for (;i<pSeq->_size;i++)
    {
		printf("%d ",pSeq->_array[i]);
    }
	printf("\n");
}

testSeqlistD.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqlistD.h"

void testSelistD()
{
	SeqListD s;
	SeqListDInit(&s);
	SeqListDPushBack(&s,1);        //尾插
	SeqListDPushBack(&s,2);
	SeqListDPushBack(&s,3);
	SeqListDPushBack(&s,4);
	SeqListDPushBack(&s,5);
	SeqListDPushBack(&s,6);

	printf("Capacity = %u ",SeqListDCapacity(&s));
	printf("Size = %u \n",SeqListDSize(&s));
	PrintfSeqlistD(&s);

   // SeqListDPopBack(&s);         //尾刪
    SeqListDInsert(&s,2,9);        //任意位置插入

	printf("Capacity = %u ",SeqListDCapacity(&s));
	printf("Size = %u \n",SeqListDSize(&s));
	PrintfSeqlistD(&s);

	SeqlistDErase(&s,7);           //任意位置刪除

	printf("Capacity = %u ",SeqListDCapacity(&s));
	printf("Size = %u \n",SeqListDSize(&s));
	PrintfSeqlistD(&s);

        SeqListDDestroy(&s);    //在結束時應該銷毀申請的堆空間,否則會造成內存泄漏
}
int main()
{
	testSelistD();
	return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com