动态顺序表:
- 实现功能:动态顺序表的初始化、尾插、尾删、头插、头删、判空、有效元素的个数、清空、容量大小、销毁动态顺序表和扩容
代码实现:
头文件 SeqListD.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<malloc.h>
#include<stdio.h>
#include<string.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 SeqListDPushFront(PSeqListD pSeq, DataType data);//头插
void SeqListDPopFront(PSeqListD pSeq);//头删
int SeqListDEmpty(PSeqListD pSeq);//判空
int SeqListDSize(PSeqListD pSeq);//有效元素的个数
void SeqListDClear(PSeqListD pSeq);//清空
int SeqListDCapacity(PSeqListD pSeq);//容量大小
void SeqListDDestroy(PSeqListD pSeq);//销毁动态顺序表
int CheckCapacity(PSeqListD pSeq);//扩容
源代码 SeqListD.c
#include"SeqListD.h"
void SeqListDInit(PSeqListD pSeq)//动态顺序表的初始化
{
if (NULL == pSeq)
return;
pSeq->_array = (DataType*)malloc(3 * sizeof(DataType));
if (NULL == pSeq->_array)
return;
pSeq->_size = 0;
pSeq->_capacity = 3;
}
void SeqListDPushBack(PSeqListD pSeq, DataType data)//尾插
{
if (pSeq == NULL)
return;
if (!CheckCapacity(pSeq))
return;
pSeq->_array[pSeq->_size++] = data;
}
void SeqListDPopBack(PSeqListD pSeq)//尾删
{
if (NULL == pSeq)
return;
if (SeqListDEmpty(pSeq))
return;
pSeq->_size--;
}
void SeqListDPushFront(PSeqListD pSeq, DataType data)//头插
{
int i = 0;
if (NULL == pSeq)
return;
if (!CheckCapacity(pSeq))
return;
for (i = pSeq->_size; i > 0; ++i)
pSeq->_array[i] = pSeq->_array[i - 1];
pSeq->_array[0] = data;
pSeq->_size++;
}
void SeqListDPopFront(PSeqListD pSeq)//头插
{
if (NULL == pSeq)
return;
if (SeqListDEmpty(pSeq))
return;
pSeq->_size--;
}
int CheckCapacity(PSeqListD pSeq)//扩容
{
if (NULL == pSeq)
return;
if (pSeq->_size == pSeq->_capacity)
{
//申请新空间
size_t newCapacity = pSeq->_capacity * 2;
DataType*pTemp = (DataType*)malloc(newCapacity*sizeof(DataType));
if (NULL == pTemp)
return;
//搬移元素
memcpy(pTemp, pSeq->_array, pSeq->_size*sizeof(DataType));
//释放
free(pSeq->_array);
//指向新空间
pSeq->_array = pTemp;
pSeq->_capacity = newCapacity;
}
return 1;
}
int SeqListDEmpty(PSeqListD pSeq)//判空
{
return 0 == pSeq->_size;
}
int SeqListDSize(PSeqListD pSeq)//有效元素的个数
{
return pSeq->_size;
}
int SeqListDCapacity(PSeqListD pSeq)//容量大小
{
return pSeq->_capacity;
}
void SeqListDClear(PSeqListD pSeq)//清空
{
pSeq->_size = 0;
}
void SeqListDDestroy(PSeqListD pSeq)//销毁
{
if (pSeq->_array)
{
free(pSeq->_array);
pSeq->_capacity = 0;
pSeq->_size = 0;
}
}
void PrintSeqListD(PSeqListD pSeq)//打印动态顺序表
{
size_t i = 0;
for (; i < pSeq->_size; ++i)
printf("%d", pSeq->_array[i]);
printf("\n");
}
测试代码 main.c
void TestSeqListD()
{
SeqListD s;
SeqListDInit(&s);
SeqListDPushBack(&s, 1);
SeqListDPushBack(&s, 2);
SeqListDPushBack(&s, 3);
PrintSeqListD(&s);
printf("size = %d\n", SeqListDSize(&s));
printf("capacity = %d\n", SeqListDCapacity(&s));
SeqListDPushBack(&s, 4);
printf("size = %d\n", SeqListDSize(&s));
printf("capacity = %d\n", SeqListDCapacity(&s));
SeqListDPopBack(&s);
printf("size = %d\n", SeqListDSize(&s));
printf("capacity = %d\n", SeqListDCapacity(&s));
SeqListDClear(&s);
printf("size = %d\n", SeqListDSize(&s));
printf("capacity = %d\n", SeqListDCapacity(&s));
SeqListDDestroy(&s);
}
int main()
{
TestSeqListD();
return 0;
}