建立头文件
头文件名 SeqList.h
1.构建一个结构体,结构体内的成员变量有,有效元素的个数size, 该数组的容量capacity,存放数据所开辟动态空间的地址a。(a是指向动态开辟空间的指针)代码10-15行。
2.创建接口
动态顺序表需要完成增删查改等功能
如图
完整代码如下,内部也已标有注释
SeqList.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <assert.h>
#include<stdio.h>
#include <stdlib.h>
typedef int SLDataType;//int的重新定义
//结构体struct SeqList或者SL(类型)里面有,有效元素的个数size,
//该数组的容量capacity,存放数据所开辟空间的地址a
typedef struct SeqList
{
SLDataType* a;
int size;//有效元素的个数
int capacity;//该数组的容量
}SL;
//下面的SL* ps是用来接收结构体的地址
void SeqListInit(SL* ps);//初始化
void SeqListPrint(SL* ps);//测试打印
void SeqListCheckCapacity(SL* ps);//检查容量,不够则加二倍
void SeqListPushBack(SL* ps, SLDataType x);//尾插
void SeqListPopBack(SL* ps);//尾删
void SeqListPushFront(SL* ps, SLDataType x);//头插
void SeqListPopFront(SL* ps);//头删
void SeqListInset(SL* ps, int pos,SLDataType x);//任意位置插入
void SeqListErase(SL* ps,int pos);//任意位置删除
int SeqListFind(SL* ps, SLDataType x);//查找
void SeqListFree(SL* ps);//释放空间
接口功能实现
先创建SeqList.c源文件
#include "SeqList.h"
void SeqListInit(SL* ps)//初始化
{
ps->a =(SLDataType*) malloc(sizeof(SLDataType) * 4);
if (ps->a == NULL)
{
printf("开辟内存失败\n");
/*exit(-1);*/
}
ps->size = 0;//记录初始化后结构体里面的值
ps->capacity = 4;
}
void SeqListPrint(SL* ps)//测试打印
{
assert(ps);
int i = 0;
for (i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void SeqListCheckCapacity(SL* ps)//检查容量,不够则加二倍
{
if (ps->size >= ps->capacity)
{
ps->capacity *= 2;
ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ps->capacity);
if (ps->a == NULL)
{
printf("扩容失败\n");
exit(-1);
}
}
}
//
void SeqListPushBack(SL* ps, SLDataType x)//尾插
{
assert(ps);
SeqListCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
void SeqListPopBack(SL* ps)//尾删
{
assert(ps);
ps->size--;
}
void SeqListPushFront(SL* ps, SLDataType x)//头插
{
assert(ps);
SeqListCheckCapacity(ps);
SLDataType end = ps->size - 1;
while (end >= 0)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->size++;
ps->a[end+1] = x;
}
void SeqListPopFront(SL* ps)//头删
{
assert(ps);
int start = 1;
while (start < ps->size)
{
ps->a[start - 1] = ps->a[start];
start++;
}
ps->size--;
}
void SeqListInset(SL* ps, int pos, SLDataType x)//任意位置插入
{
assert(ps);
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;
ps->size++;
}
void SeqListErase(SL* ps, int pos)//任意位置删除
{
assert(ps);
int start = pos + 1;
while (start < ps->size)
{
ps->a[start - 1] = ps->a[start];
start++;
}
ps->size--;
}
int SeqListFind(SL* ps, SLDataType x)//查找
{
assert(ps);
int i = 0;
while (i < ps->size)
{
if (ps->a[i] == x)
{
return i;
}
i++;
}
}
void SeqListFree(SL* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
}
创建工程测试test.c源文件
#include "SeqList.h"
//测试
void TestSeqList()
{
SL s;
SeqListInit(&s);
SeqListPushBack(&s, 1);
SeqListPushBack(&s, 2);
SeqListPushBack(&s, 3);
SeqListPushBack(&s, 3);
SeqListPushBack(&s, 3);
SeqListPushBack(&s, 3);
SeqListPrint(&s);//测试尾部插入打印
SeqListPopBack(&s);
SeqListPrint(&s);//测试尾部删除打印
SeqListPushFront(&s, 9);
SeqListPrint(&s);//测试头部插入打印
SeqListPopFront(&s);
SeqListPrint(&s);//测试头部删除打印
SeqListInset(&s, 3, -1);
SeqListPrint(&s);//测试任意位置插入打印
SeqListErase(&s, 3);
SeqListPrint(&s);//测试任意位置删除打印
int ret=SeqListFind(&s, 1);//查找
SeqListFree(&s);//释放动态开辟空间
}
int main()
{
TestSeqList();
return 0;
}
代码内部有详细的注释。