相信大家在学校学习数据结构时顺序表是基础的实验,因此给大家带来了动态版的顺序表。
下面时两种实现方式:
第一种:
这是头文件:
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* a;
int size; //有效个数
int capacity; //容量
}SL;
void SLprint(SL* sl); //打印数据
void SLInit(SL* sl); //初始化
void SLDestry(SL* sl); //销毁
void SLCheckCapacity(SL* sl); //检查capacity与size是否相等,相等扩容
void SLPushBack(SL* sl, SLDataType x); //尾插
void SLPopBack(SL* sl); //尾删
void SLFront(SL* sl, SLDataType x); //头插
void SLbeginDelete(SL* sl); //头删
void SLInsertData(SL* sl, int n, SLDataType x); //插入任意位置数据
void SLDeleteData(SL* sl, int n); //删除任意位置
int SLFind(SL* sl, SLDataType n); //寻找某数并返回位置
void SLAppointData(SL* sl, SLDataType n); //删除特定值
相关函数实现方式
#include"SeqList.h"
void SLCheckCapacity(SL* sl)
{
assert(sl);
if (sl->capacity == sl->size)
{
int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
SLDataType* newa = (SLDataType*)realloc(sl->a, newcapacity * sizeof(SLDataType));
if (newa==NULL)
{
perror("realloc file");
exit(-1);
}
sl->a = newa;
sl->capacity = newcapacity;
}
}
void SLInsertData(SL* sl, int n, SLDataType x)
{
assert(sl);
assert(n >= 0);
assert(n <= sl->size);
SLCheckCapacity(sl);
int i = sl->size-1;
while (i >= n)
{
sl->a[i+1] = sl->a[i];
i--;
}
sl->a[n] = x;
sl->size++;
}
void SLDeleteData(SL* sl, int n)
{
assert(sl);
assert(sl->size);
int i = n ;
while (i < sl->size - 1)
{
sl->a[i] = sl->a[i + 1];
i++;
}
sl->size--;
}
void SLprint(SL* sl)
{
assert(sl);
int x = 0;
while (x < sl->size)
{
printf("%d ", sl->a[x]);
x++;
}
printf("\n");
}
void SLInit(SL* sl)
{
assert(sl);
sl->a = NULL;
sl->capacity = sl->size = 0;
}
void SLDestry(SL* sl)
{
assert(sl);
if (sl->a)
{
free(sl->a);
sl->a = NULL;
sl->capacity = sl->size = 0;
}
}
void SLPushBack(SL* sl, SLDataType x)
{
assert(sl);
SLCheckCapacity(sl);
sl->a[sl->size] = x;
sl->size++;
//SLInsertData(sl, sl->size, x);
}
void SLPopBack(SL* sl)
{
if (sl->size < 0)
{
return;
}
assert(sl);
assert(sl->size);
sl->size--;
//SLDeleteData(sl, sl->size);
}
void SLFront(SL* sl, SLDataType x)
{
assert(sl);
SLCheckCapacity(sl);
for (int i = sl->size; i > 0; i--)
{
sl->a[i] = sl->a[i - 1];
}
sl->a[0] = x;
sl->size++;
//SLInsertData(sl, 0, x);
}
void SLbeginDelete(SL* sl)
{
assert(sl);
assert(sl->size);
int x = 0;
while (x < sl->size-1)
{
sl->a[x] = sl->a[x + 1];
x++;
}
sl->size--;
//SLDeleteData(sl, 0);
}
int SLFind(SL* sl, SLDataType n)
{
assert(sl);
assert(sl->size);
for (int i = 0; i < sl->size; i++)
{
if (sl->a[i] == n)
{
return i + 1;
}
}
return -1;
}
void SLAppointData(SL* sl, SLDataType n)
{
int i = SLFind(sl, n);
SLDeleteData(sl, i - 1);
}
一部分测试代码,当然也可以自行进行相关函数测试:
#include"SeqList.h"
void testsl()
{
SL ps;
SLInit(&ps);
SLPushBack(&ps, 1);
SLPushBack(&ps, 2);
SLPushBack(&ps, 3);
SLPushBack(&ps, 4);
SLPushBack(&ps, 5);
SLPushBack(&ps, 6);
SLPushBack(&ps, 7);
SLprint(&ps);
SLPopBack(&ps);
SLPopBack(&ps);
SLprint(&ps);
SLFront(&ps, 111);
SLFront(&ps, 222);
SLprint(&ps);
SLbeginDelete(&ps);
SLbeginDelete(&ps);
SLprint(&ps);
SLAppointData(&ps, 3);
SLprint(&ps);
SLDestry(&ps);
}
int main()
{
testsl();
return 0;
}
第二种:
其实大家可以发现,第一种不同函数的实现类似,因此我们可以用SLInsertData函数和SLDeleteData函数里减少代码的写入量
如下:
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* a;
int size; //有效个数
int capacity; //容量
}SL;
void SLprint(SL* sl); //打印数据
void SLInit(SL* sl); //初始化
void SLDestry(SL* sl); //销毁
void SLCheckCapacity(SL* sl); //检查capacity与size是否相等,相等扩容
void SLPushBack(SL* sl, SLDataType x); //尾插
void SLPopBack(SL* sl); //尾删
void SLFront(SL* sl, SLDataType x); //头插
void SLbeginDelete(SL* sl); //头删
void SLInsertData(SL* sl, int n, SLDataType x); //插入任意位置数据
void SLDeleteData(SL* sl, int n); //删除任意位置
int SLFind(SL* sl, SLDataType n); //寻找某数并返回位置
void SLAppointData(SL* sl, SLDataType n); //删除特定值
//-----------------------------------------------------------------------------
void SLCheckCapacity(SL* sl)
{
assert(sl);
if (sl->capacity == sl->size)
{
int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
SLDataType* newa = (SLDataType*)realloc(sl->a, newcapacity * sizeof(SLDataType));
if (newa==NULL)
{
perror("realloc file");
exit(-1);
}
sl->a = newa;
sl->capacity = newcapacity;
}
}
void SLInsertData(SL* sl, int n, SLDataType x)
{
assert(sl);
assert(n >= 0);
assert(n <= sl->size);
SLCheckCapacity(sl);
int i = sl->size-1;
while (i >= n)
{
sl->a[i+1] = sl->a[i];
i--;
}
sl->a[n] = x;
sl->size++;
}
void SLDeleteData(SL* sl, int n)
{
assert(sl);
assert(sl->size);
int i = n ;
while (i < sl->size - 1)
{
sl->a[i] = sl->a[i + 1];
i++;
}
sl->size--;
}
void SLprint(SL* sl)
{
assert(sl);
int x = 0;
while (x < sl->size)
{
printf("%d ", sl->a[x]);
x++;
}
printf("\n");
}
void SLInit(SL* sl)
{
assert(sl);
sl->a = NULL;
sl->capacity = sl->size = 0;
}
void SLDestry(SL* sl)
{
assert(sl);
if (sl->a)
{
free(sl->a);
sl->a = NULL;
sl->capacity = sl->size = 0;
}
}
void SLPushBack(SL* sl, SLDataType x)
{
SLInsertData(sl, sl->size, x);
}
void SLPopBack(SL* sl)
{
SLDeleteData(sl, sl->size);
}
void SLFront(SL* sl, SLDataType x)
{
SLInsertData(sl, 0, x);
}
void SLbeginDelete(SL* sl)
{
SLDeleteData(sl, 0);
}
int SLFind(SL* sl, SLDataType n)
{
assert(sl);
assert(sl->size);
for (int i = 0; i < sl->size; i++)
{
if (sl->a[i] == n)
{
return i + 1;
}
}
return -1;
}
void SLAppointData(SL* sl, SLDataType n)
{
int i = SLFind(sl, n);
SLDeleteData(sl, i - 1);
}
//-----------------------------------------------------------------------------------------
//下面同为测试代码
void testsl()
{
SL ps;
SLInit(&ps);
SLPushBack(&ps, 1);
SLPushBack(&ps, 2);
SLPushBack(&ps, 3);
SLPushBack(&ps, 4);
SLPushBack(&ps, 5);
SLPushBack(&ps, 6);
SLPushBack(&ps, 7);
SLprint(&ps);
SLPopBack(&ps);
SLPopBack(&ps);
SLprint(&ps);
SLFront(&ps, 111);
SLFront(&ps, 222);
SLprint(&ps);
SLbeginDelete(&ps);
SLbeginDelete(&ps);
SLprint(&ps);
SLAppointData(&ps, 3);
SLprint(&ps);
SLDestry(&ps);
}
int main()
{
testsl();
return 0;
}
其实我们在以后写作业面试时就可以用第二种,以此来减少时间,和错误。