顺序表是线性的,较为简单,一般用数组储存,设计出一个可以动态增加容量的顺序表。
静态表可能会导致表的容量太小以至于装不下大量的数据
首先
设置默认的列表大小、扩容大小和元素类型
#define SeqListDataType int
#define SEQLIST_DEFAULT_SIZE 10
#define SEQLIST_DEFAULT_INC_SIZE 5
定义SeqList结构体
typedef struct SeqList
{
SeqListDataType* base;
size_t capacity;
size_t size;
}SeqList;
函数声明以及函数实现
//函数声明
//1初始化
void InitSeqList(SeqList* pst);
//2判满
bool IsFull(SeqList* pst);
//3判空
bool IsEmpty(SeqList* pst);
//4尾插
void SeqListPushBack(SeqList* pst, SeqListDataType data);
//5头插
void SeqListPushFront(SeqList* pst, SeqListDataType data);
//6尾删
void SeqListPopBack(SeqList* pst);
//7头删
void SeqListPopFront(SeqList* pst);
//8按位置插入
void SeqListInsertPos(SeqList* pst, int pos, SeqListDataType data);
//9按值插入
void SeqListInsertVal(SeqList* pst, SeqListDataType data);
//10按位置删除
void SeqListDelPos(SeqList* pst, int pos);
//11查找
int SeqListFind(SeqList* pst, SeqListDataType data);
//12按值删除
void SeqListDelVal(SeqList* pst, SeqListDataType data);
//13清空
void clear(SeqList* pst);
//14反转
void SeqListReverse(SeqList* pst);
//15排序
void Sort(SeqList* pst);
//16扩容
bool SeqListInc(SeqList* pst);
//函数定义
void InitSeqList(SeqList* pst)
{
pst->base = (SeqListDataType*)malloc(SEQLIST_DEFAULT_SIZE * sizeof(SeqListDataType));
assert(pst->base != NULL);
pst->capacity = SEQLIST_DEFAULT_SIZE;
pst->size = 0;
}
bool IsFull(SeqList* pst)
{
return pst->size >= pst->capacity;
}
bool IsEmpty(SeqList* pst)
{
return pst->size == 0;
}
void SeqListPushBack(SeqList* pst, SeqListDataType data)
{
if (IsFull(pst)&&!SeqListInc(pst))
{
printf("顺序表已满,无法插入数据");
return;
}
pst->base[pst->size++] = data;
}
void SeqListPushFront(SeqList* pst, SeqListDataType data)
{
if (IsFull(pst)&&!SeqListInc(pst))
{
printf("顺序表已满,无法插入数据");
return;
}
for (int i = pst->size; i > 0; i--)
{
pst->base[i] = pst->base[i - 1];
}
pst->base[0] = data;
pst->size++;
}
void ShowSeqList(SeqList* pst)
{
for (int i = 0; i < pst->size; i++)
{
printf("%d ",pst->base[i]);
}
printf("\n");
}
void SeqListPopBack(SeqList* pst)
{
if (IsEmpty(pst))
{
printf("顺序表已空,无法删除数据");
return;
}
pst->size--;
}
void SeqListPopFront(SeqList* pst)
{
if (IsEmpty(pst))
{
printf("顺序表已空,无法删除数据");
return;
}
for (int i = 0; i<pst->size; i++)
{
pst->base[i] = pst->base[i + 1];
}
pst->size--;
}
void SeqListInsertPos(SeqList* pst, int pos, SeqListDataType data)
{
if (pos<0 || pos>pst->size)
{
printf("输入位置不合法");
return;
}
if (IsFull(pst) && !SeqListInc(pst))
{
printf("顺序表已满,无法插入数据");
return;
}
for (int i = pst->size; i > pos; i--)
{
pst->base[i] = pst->base[i - 1];
}
pst->base[pos] = data;
pst->size++;
}
void SeqListInsertVal(SeqList* pst, SeqListDataType data)
{
if (IsFull(pst) && !SeqListInc(pst))
{
printf("顺序表已满,无法插入数据");
return;
}
int pos = 0;
while (data > pst->base[pos] && pos < pst->size)
{
pos++;
}
for (int i = pst->size; i > pos; i--)
{
pst->base[i] = pst->base[i - 1];
}
pst->base[pos] = data;
pst->size++;
}
void SeqListDelPos(SeqList* pst, int pos)
{
if (pos < 0 || pos > pst->size)
{
printf("删除的位置不合法,无法删除");
return;
}
for (int i = pos; i <= pst->size; i++)
{
pst->base[i] = pst->base[i + 1];
}
pst->size--;
}
int SeqListFind(SeqList* pst, SeqListDataType data)
{
for (int i = 0; i < pst->size; i++)
{
if (data == pst->base[i])
{
return i;
}
}
printf("不存在查询元素");
}
void SeqListDelVal(SeqList* pst, SeqListDataType data)
{
if (IsEmpty(pst))
{
printf("列表为空");
return;
}
for (int i = 0; i < pst->size; i++)
{
if (data == pst->base[i])
{
while(i <= pst->size)
{
pst->base[i] = pst->base[i + 1];
i++;
}
pst->size--;
return;
}
}
printf("无删除元素\n");
}
void clear(SeqList* pst)
{
pst->size = 0;
}
void SeqListReverse(SeqList* pst)
{
int left = 0;
int right = pst->size - 1;
while (left < right)
{
SeqListDataType tmp = pst->base[left];
pst->base[left] = pst->base[right];
pst->base[right] = tmp;
left++;
right--;
}
}
void Sort(SeqList* pst)
{
if (IsEmpty(pst))
{
printf("列表为空");
return;
}
for (int i = 0; i < pst->size; i++)
{
for (int j = 0; j < i; j++)
{
if (pst->base[i] < pst->base[j])
{
SeqListDataType tmp = pst->base[i];
pst->base[i] = pst->base[j];
pst->base[j] = tmp;
}
}
}
}
bool SeqListInc(SeqList* pst)
{
SeqListDataType* new_base = (SeqListDataType*)realloc(pst->base, sizeof(SeqListDataType) * (pst->capacity+SEQLIST_DEFAULT_INC_SIZE));
if (new_base == NULL)
{
printf("扩容失败\n");
return;
}
printf("扩容成功\n");
pst->base = new_base;
pst->capacity = pst->capacity + SEQLIST_DEFAULT_INC_SIZE;
return true;
}
主函数
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
int main()
{
SeqList mylist;
InitSeqList(&mylist);
SeqListDataType data;
int pos;
int select = 1;
while (select)
{
printf("***************************\n");
printf("1.PushBack 2.PushFront\n");
printf("3.ShowList 0.Quit\n");
printf("4.PopBack 5.PopFront\n");
printf("6.InsPos 7.InsVal\n");
printf("8.DelPos 9.Find\n");
printf("10.DelVal 11.clear\n");
printf("12.Reverse 13.Sort\n");
printf("***************************\n");
printf("请选择:<");
scanf("%d", &select);
if (select == 0)
{
break;
}
switch (select)
{
case 1:
printf("请输入要插入的值(-1结束):> ");
while (scanf("%d", &data),data!=-1)
{
SeqListPushBack(&mylist, data);
}
break;
case 2:
printf("请输入要插入的值(-1结束):> ");
while (scanf("%d", &data), data != -1)
{
SeqListPushFront(&mylist, data);
}
break;
case 3:
ShowSeqList(&mylist);
break;
case 4:
SeqListPopBack(&mylist);
case 5:
SeqListPopFront(&mylist);
case 6:
printf("请输入要插入的位置");
scanf("%d", &pos);
printf("请输入要输入的值");
scanf("%d", &data);
SeqListInsertPos(&mylist, pos, data);
case 7:
printf("请输入要插入的值");
scanf("%d", &data);
SeqListInsertVal(&mylist, data);
case 8:
printf("请输入删除的位置");
scanf("%d", &pos);
SeqListDelPos(&mylist, pos);
break;
case 9:
printf("请输入要查询的值");
scanf("%d", &data);
printf("查询值所在位置为%d\n",SeqListFind(&mylist, data));
break;
case 10:
printf("请输入要删除的值");
scanf("%d", &data);
SeqListDelVal(&mylist, data);
break;
case 11:
clear(&mylist);
printf("清空成功");
break;
case 12:
SeqListReverse(&mylist);
printf("翻转成功\n");
break;
case 13:
Sort(&mylist);
printf("排序完成\n");
break;
}
}
return 0;
}