文章目录
- 一、结构体的定义
- 二、顺序表的各个函数接口实现
- 1.初始化顺序表
- 2.顺序表的插入
- 1)尾插(SeqListPushBack)
- 2)头插(SeqListPushFront)
- 3)随意插入(SeqListInsert)
- 3.顺序表的删除
- 1)尾删(SeqListPopBack)
- 2)头删(SeqListPopFront)
- 3)随意删除(SeqListPopDelete)
- 4.顺序表的查找(SeqListFind)
- 5.顺序表的修改(SeqListModify)
- 6.顺序表的销毁(SeqListDestroy)
- 7.顺序表的打印(SeqListPrint)
- 三、关于顺序表的一些题目
- 1移除元素
- 2.合并两个有序数组
一、结构体的定义
typedef int elemtype; //元素类型重命名,增强代码的可维护性
typedef struct seqlist
{
elemtype *a; //指向动态开辟的数组
int size; //有效数据的个数
int capacity; //顺序表的容量
}SL;
二、顺序表的各个函数接口实现
1.初始化顺序表
void SeqListInit(SL*ps)
{
ps->a = (elemtype*)malloc(4*sizeof(elemtype));
if (ps->a == NULL)
{
printf("malloc fail\n");
exit(-1);
}
ps->size = 0;
ps->capacity = 4; //先给4个容量
}
2.顺序表的插入
先检查顺序表的容量是否满了,满了的话就进行扩容
void SeqListCheckCapacity(SL* ps)
{
if (ps->size == ps->capacity) //size与capacity相等说明顺序表已满
{
elemtype* temp = (elemtype*)realloc(ps->a, ps->capacity * 2 * sizeof(elemtype));
//将容量扩大为原来的两倍
if (temp == NULL)
{
printf("realloc fail\n");
exit(-1);//退出程序
}
else
{
ps->a = temp;
ps->capacity *= 2;
}
}
}
1)尾插(SeqListPushBack)
void SeqListPushBack(SL* ps, elemtype x)
{
SeqListCheckCapacity(ps);//检查容量是否满了,以及满了之后的扩容操作
ps->a[ps->size] = x;
ps->size++; //有效数据个数加一
}
2)头插(SeqListPushFront)
void SeqListPushFront(SL* ps, elemtype x)
{
SeqListCheckCapacity(ps);
int end = ps->size - 1; //end是表中最后一个元素
while (end >= 0) //以下操作是将顺序表中的元素从后往前依次后移,将第一个位置空出来
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[0] = x;
ps->size++;
}
3)随意插入(SeqListInsert)
void SeqListInsert(SL* ps, int pos, elemtype x)
{
if (pos > ps->size) //pos是待插入的位置
return;
int end = ps->size - 1; //end为顺序表中最后一个元素
while (end >= pos)
{
ps->a[end+1] = ps->a[end]; //将pos以及pos之后的元素依次后移
end--;
}
ps->a[pos] = x;
ps->size++; //有效数据加一
}
3.顺序表的删除
1)尾删(SeqListPopBack)
void SeqListPopBack(SL* ps)
{
if (ps->size == 0) //判断顺序表中是否有数据
return;
ps->size--; //尾删,直接将有效数据数减一即可
}
2)头删(SeqListPopFront)
void SeqListPopFront(SL* ps)
{
if (ps->size == 0) //判断顺序表中是否有数据
return;
int start = 0;
while (start-1 < ps->size)
{
ps->a[start] = ps->a[start + 1];
start++;
}
ps->size--; //有效数据减一
}
3)随意删除(SeqListPopDelete)
void SeqListDelete(SL* ps, int pos) //pos是待删除的位置
{
if (ps->size == 0) //判断顺序表中是否有数据
return;
int start = pos; //从pos处开始
while (start < ps->size)
{
ps->a[start] = ps->a[start + 1];
start++;
}
ps->size--;
}
4.顺序表的查找(SeqListFind)
int SeqListFind(SL* ps, elemtype x)
{
for (int i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
return i; //找到了,返回下标值
}
return -1; //没有找到,返回-1
}
5.顺序表的修改(SeqListModify)
void SeqListModify(SL* ps, int pos, elemtype x)
{
if (pos > ps->size)
return;
ps->a[pos] = x;
}
6.顺序表的销毁(SeqListDestroy)
void SeqListDestroy(SL* ps)
{
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->size = 0;
}
7.顺序表的打印(SeqListPrint)
void SeqListPrint(SL ps) //不改变数组,不需要用指针
{
for (int i = 0; i < ps.size; i++)
{
printf("%d ",ps.a[i]);
}
printf("\n");
}
三、关于顺序表的一些题目
1移除元素
int removeElement(int* nums, int numsSize, int val){
int src=0,dst=0;
//双指针:如果src处不是val,则把src放到dst处,src++,dst++,如果是val,src++
while(src<numsSize)
{
if(nums[src]!=val)
{
nums[dst]=nums[src];
dst++;
src++;
}
else
{
src++;
}
}
return dst; //dst之前的都是要保留下来的元素
}
2.合并两个有序数组