给出顺序表的定义:
typedef int DataType;
typedef struct SeqListD
{
DataType* _pData;
int _size; // 顺序表中有效元素的个数
int _capacity; // 顺序表中可容纳元素的最大值
}SeqListD, *PSeqListD;
将函数的声明放在head.h的头文件里面:
#ifndef __SQELISTD_H_
#define __SQELISTD_H__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
#include <string.h>
typedef int DataType;
typedef struct SeqListD
{
DataType* _pData;
int _size; // 顺序表中有效元素的个数
int _capacity; // 顺序表中可容纳元素的最大值
}SeqListD, *PSeqListD;
//
// 顺序表的初始化
void SeqListDInit(PSeqListD pSeq);
// 尾插
void SeqListDPushBack(PSeqListD pSeq, DataType data);
// 尾删
void SeqListDPopBack(PSeqListD pSeq);
// 判断顺序表是否为空,为空返回true,否则返回false
int SeqListDEmpty(PSeqListD pSeq);
// 获取顺序表中有效元素的个数
int SeqListDSize(PSeqListD pSeq);
//获取顺序表的容量
int SeqListDCapacity(PSeqListD pSeq);
// 清空顺序表中的所有元素
void SeqListDClear(PSeqListD pSeq);
// 动态增容
int CheckCapacity(PSeqListD pSeq);
// 销毁顺序表
void SeqListDestroy(PSeqListD pSeq);
// 顺序表任意位置插入元素
void SeqListDInsert(PSeqListD pSeq, size_t pos, DataType data);
// 顺序表任意位置插入元素
void SeqListDErase(PSeqListD pSeq, size_t pos);
//
#endif //__SQELISTD_H__
函数的定义(具体实现):
#define _CRT_SECURE_NO_WARNINGS 0
#include "SeqListD.h"
void SeqListDInit(PSeqListD pSeq)
{
assert(pSeq);
pSeq->_pData = (DataType*)malloc(sizeof(DataType)*3);
if (!pSeq->_pData)
{
printf("系统空间不足\n");
exit(0);
}
pSeq->_capacity = 3;
pSeq->_size = 0;
}
void SeqListDPushBack(PSeqListD pSeq, DataType data)
{
assert(pSeq);
if (CheckCapacity(pSeq))
{
pSeq->_pData[pSeq->_size++] = data;
}
}
// 尾删
void SeqListDPopBack(PSeqListD pSeq)
{
assert(pSeq);
if (SeqListDEmpty(pSeq))
{
return;
}
pSeq->_size--;
}
// 判断顺序表是否为空,为空返回true,否则返回false
int SeqListDEmpty(PSeqListD pSeq)
{
assert(pSeq);
return 0 == pSeq->_size;
}
// 获取顺序表中有效元素的个数
int SeqListDSize(PSeqListD pSeq)
{
assert(pSeq);
return pSeq->_size;
}
//获取顺序表的容量
int SeqListDCapacity(PSeqListD pSeq)
{
assert(pSeq);
return pSeq->_capacity;
}
// 清空顺序表中的所有元素
void SeqListDClear(PSeqListD pSeq)
{
assert(pSeq);
pSeq->_size = 0;
}
// 动态增容
int CheckCapacity(PSeqListD pSeq)
{
if (pSeq->_size >= pSeq->_capacity)
{
int newCapacity = pSeq->_capacity * 2;
DataType* pTemp = (DataType*)malloc(sizeof(DataType)*pSeq->_capacity*2);
if (pTemp == NULL)
{
printf("系统空间不足\n");
return 0;
}
memcpy(pTemp, pSeq->_pData, sizeof(DataType)*pSeq->_size);
free(pSeq->_pData);
pSeq->_pData = pTemp;
pSeq->_capacity = newCapacity;
}
return 1;
}
// 销毁顺序表
void SeqListDDestroy(PSeqListD pSeq)
{
assert(pSeq);
if (pSeq->_pData)
{
free(pSeq->_pData);
pSeq->_pData = NULL;
pSeq->_capacity = 0;
pSeq->_size = 0;
}
}
// 顺序表任意位置插入元素
void SeqListDInsert(PSeqListD pSeq, size_t pos, DataType data)
{
assert(pSeq);
assert(pos <= pSeq->_size);
if (pSeq->_size == pSeq->_capacity)
{
int i = 0;
if (CheckCapacity(pSeq))
{
for (i = pSeq->_size; i > pos; i--)
{
pSeq->_pData[i] = pSeq->_pData[i - 1];
}
pSeq->_pData[i] = data;
pSeq->_size++;
return;
}
else
{
printf("顺序表已满,内存分配失败!\n");
return;
}
}
}
// 顺序表任意位置删除元素
void SeqListDErase(PSeqListD pSeq, size_t pos)
{
assert(pSeq);
assert(pos >= 0 && pos<pSeq->_size);
if (pSeq->_size == 0)
{
printf("顺序表已为空!\n");
return;
}
for (int i = pos; i < pSeq->_size; i++)
{
pSeq->_pData[i] = pSeq->_pData[i + 1];
}
pSeq->_size--;
}
测试代码:
#define _CRT_SECURE_NO_WARNINGS 0
#include "SeqListD.h"
void TestSeqListD()
{
SeqListD seq;
SeqListDInit(&seq);
SeqListDPushBack(&seq, 0);
SeqListDPushBack(&seq, 1);
SeqListDPushBack(&seq, 2);
printf("size = %d\n", SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDPushBack(&seq, 3);
SeqListDPushBack(&seq, 4);
SeqListDPushBack(&seq, 5);
printf("size = %d\n", SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDPopBack(&seq);
SeqListDPopBack(&seq);
SeqListDPopBack(&seq);
printf("size = %d\n", SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDClear(&seq);
printf("size = %d\n", SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDDestroy(&seq);
}
int main()
{
TestSeqListD();
system("pause");
return 0;
}
结果如下: