1.顺序表要实现头插,尾插,头删,尾删,查找,初始化,销毁等功能
2.顺序表要使用动态顺序表
3.顺序表的实现要分为三个文件分为头文件,功能函数实现文件和测试文件
seqlist.h(功能命名头文件)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
静态顺序表
//#define N 10
//struct seqlist
//{
// int arr[N];
// int size;
//空间大小是固定好的动态顺序表的空间大小可以随时改变
//};
//typedef是定义结构体的名字
//动态顺序表
typedef int SLDataType;
//这里改变变量类型的话可以直接改变替换
typedef struct seqlist
{
SLDataType* arr;
int size;//有效的元素个数
int capacity;//数组的空间大小
}SL;
//初始化顺序表
void SLInit(SL* ps);
//顺序表尾插元素
void SLPushBack(SL* ps, SLDataType x);
//尾删元素
void SLPopBack(SL* ps);
//头插元素
void SLPushFront(SL* ps, SLDataType x);
//头删元素
void SLPopFront(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);
//顺序表的打印
void SLPrint(SL s);
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
//删除指定位置的数据
void SLErase(SL* ps, int pos);
//查找
int SLFInd(SL* ps, SLDataType x);
seqlist.c(功能实现文件)
#define _CRT_SECURE_NO_WARNINGS
#include"seqlist.h"
//初始化顺序表
void SLInit(SL* ps)
//传地址不是穿值
//实参传递给形参是值的传递,传递地址
{
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
//销毁顺序表
void SLDestroy(SL* ps)
{
if(ps->arr)
{
free(ps->arr);
}
ps->arr = NULL;
ps->capacity = ps->size = 0;
}
//检测顺序表是否有空间
void SLCheckCapacity(SL* ps)
{
if (ps->capacity == ps->size)
{
int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));
if (tmp == NULL)
{
perror("realloc fail");
exit(1);//直接退出程序
}
ps->arr = tmp;
ps->capacity = newCapacity;
}
}
//尾插元素
void SLPushBack(SL* ps, SLDataType x)
{
//插入数据之前先检查空间是否够用
//增容一般以二倍增加
//防止ps开局为空
assert(ps);
//if (ps->capacity == ps->size)
//{
// int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
// SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));
// if (tmp == NULL)
// {
// perror("realloc fail");
// exit(1);//直接退出程序
// }
// ps->arr = tmp;
// ps->capacity = newCapacity;
//}
SLCheckCapacity(ps);
ps->arr[ps->size++] = x;
}
//尾删元素
void SLPopBack(SL* ps)
{
assert(ps);
assert(ps->size);
//ps->arr[ps->size-1] = -1;
// 这里的size是数据个数组的下标跟size不一样数组的下表比size小一个单位
// 这段代码要不要都可以尾删只需要不打印最后一个数字就可以
//不会影响其他数据
ps->size--;
//ps->capacity--;空间没有变化capacity不用变化
}
//头插元素
void SLPushFront(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
for (int i = ps->size; i > 0; i--)
{
ps->arr[i] = ps->arr[i-1];
//最后size到达1的位置就是arr[1]=arr[0]让arr[0]的位置空出来
}
ps->arr[0] = x;
ps->size++;
}
//头删元素
void SLPopFront(SL* ps)
{
assert(ps);
assert(ps->size);
for (int i = 0; i < ps->size-1; i++)
{
ps->arr[i] = ps->arr[i + 1];//最后一次是arr[size-2]==arr[size-1];
//全部向前移动一位
}
ps->size--;
}
//打印顺序表
void SLPrint(SL s)
{
for (int i = 0; i < s.size; i++)
{
printf("%d ", s.arr[i]);
}
printf("\n");
}
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos>0&&pos<=ps->size);
SLCheckCapacity(ps);
for (int i = ps->size; i > pos; i--)
{
ps->arr[i] = ps->arr[i - 1];//最后一项是arr[pos+1]=arr[pos];
}
ps->arr[pos] = x;
ps->size++;
}
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos > 0 && pos < ps->size);
for (int i = pos; i < ps->size - 1; i++)
{
ps->arr[i] = ps->arr[i + 1];//最后一项是arr[size-2]=arr[size-1]
}
ps->size--;
}
//查找
int SLFInd(SL* ps, SLDataType x)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (ps->arr[i] == x)
{
return 1;
}
}
return -1;
}
text.c(测试文件)
#define _CRT_SECURE_NO_WARNINGS
//实现顺序表的增删查改
#include"seqlist.h"
void seqlist()
{
SL sl;
//初始化顺序表
SLInit(&sl);
//尾插
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
SLInsert(&sl, 2, 77);
SLPrint(sl);
SLErase(&sl, 2);
SLPrint(sl);
int find = SLFInd(&sl, 2);
{
if (find < 0)
{
printf("没有找到\n");
}
else
{
printf("找到了下表为%d\n", find);
}
}
头插
//SLPushFront(&sl, 5);
//SLPrint(sl);
//SLPushFront(&sl, 6);
//SLPrint(sl);
//SLPushFront(&sl, 7);
//SLPrint(sl);
//SLPushFront(&sl, 8);
//SLPrint(sl);
头删
//SLPopFront(&sl);
//SLPrint(sl);
尾删
//SLPopBack(&sl);
//SLPrint(sl);
//顺序表的销毁
SLDestroy(&sl);
}
int main()
{
seqlist();
return 0;
}