线性表:n个数据元素组成的一个有效序列,可以在任意位置进行插入和删除。
顺序表:用一段地址连续的存储单元一次存储数据元素。
一般分为静态顺序表与动态顺序表。
以下是关于静态顺序表的一些插入与删除
头文件
#include"stdio.h"
#include "assert.h"
#include "malloc.h"
#ifndef _SEQLIST_H__
#define _SEQLIST_H__
#define max_size 10
typedef int DataType;//将int型重新定义一个类型
typedef struct seqlist
{
DataType arr[max_size];//最大可容纳的元素个数
int size;//有效元素个数
}seqlist, *pseqlist;//seqlist为新的类型
void InitSeqlist(pseqlist pseq);
void PrintSeqlist(pseqlist pseq);
int Find(pseqlist pseq, DataType data);
void PushBack(pseqlist pseq, DataType data);
void PopBack(pseqlist pseq);
void PushFront(pseqlist pseq, DataType data);
void PopFront(pseqlist pseq);
void Insert(pseqlist pseq, int pos, DataType data);
void Erase(pseqlist pseq, int pos);
void Remove(pseqlist pseq, DataType data);
void RemoveAll(pseqlist pseq, DataType data);
void RemoveAll1(pseqlist pseq, DataType data);
void RemoveAll2(pseqlist pseq, DataType data);
void test1(pseqlist s);
void test2(pseqlist s);
#endif _SEQLIST_H__
操作函数
#include "seqlist.h"
void InitSeqlist(pseqlist pseq)//初始化顺序表
{
assert(pseq);
pseq->size = 0;
}
void PrintSeqlist(pseqlist pseq)//打印顺序表
{
assert(pseq);
size_t i = 0;
if ((pseq->size) == 0)
{
printf("已经为空");
return;
}
else
{
for (i = 0; i < pseq->size; i++)
{
printf("%d ", pseq->arr[pseq->size]);
}
printf("\n");
}
}
int Find(pseqlist pseq, DataType data)//查找元素
{
assert(pseq);
if ((pseq->size) == 0)
{
printf("已经为空");
return;
}
for ( int i = 0; i < pseq->size; i++)
{
if (pseq->arr[pseq->size] == data)
{
return i;
}
else
{
return -1;
}
}
}
void PushBack(pseqlist pseq, DataType data)//尾插
{
assert(pseq);//判断指针是否为空
if ((pseq->size) >= max_size)//
{
printf("已经存满");
return;
}
else
{
pseq ->arr[pseq->size]=data ;//size的位置在顺序表有效元素的后面
}
pseq->size++;//更新size
}
void PopBack(pseqlist pseq)//尾删
{
assert(pseq);
if ((pseq->size) == 0)
{
printf("已空");
return;
}
else
{
pseq->size--;
printf("删除成功");
}
}
void PushFront(pseqlist pseq, DataType data)//头插
{
aseert(pseq);
if ((pseq->size) >= max_size)
{
printf("已经存满");
return;
}
else
{
for (int i = pseq->size; i >= 0; i--)
{
pseq->arr[i] = pseq->arr[i -1];//将元素整体后移,空出arr[0]的位置
pseq->arr[0] = data;
}
pseq->size++;
}
}
void PopFront(pseqlist pseq)//头删
{
assert(pseq);
if (pseq->size == 0)
{
printf("已空");
return;
}
else
{
for ( int i = pseq->size-1; i >0; i--)
{
pseq->arr[i - 1] = pseq->arr[i];//将整体前移
}
pseq->size--;
printf("删除成功");
}
}
void Insert(pseqlist pseq, int pos, DataType data)//从任意位置插入
{
assert(pseq);//1.判断指针是否为空
if ((pseq->size) >= max_size)//2.判断是否为满
{
printf("已经存满");
return;
}
if (pos < 0 || pseq->size < pos)//3.判断位置是否非法
{
printf("位置非法");
return;
}
else
{
for (int i = pseq->size - 1; i >= pos; --i)
{
pseq->arr[i + 1] = pseq->arr[i];//将pos以及pos位置以后的后移
pseq->arr[pos - 1] = data;//腾出的位置放要插入的数据
}
pseq->size++;
}
}
void Erase(pseqlist pseq, int pos)//从任意位置的删除数据
{
assert(pseq);//1.判断指针是否为空
if ((pseq->size) == 0)//2.判断是否为空
{
printf("已空");
return;
}
if (pos < 0 || pseq->size < pos)//3.判断位置是否非法
{
printf("位置非法");
return;
}
else
{
for (int i = pos-1; i<pseq->size-1;i++)
{
pseq->arr[i] = pseq->arr[i+1];//从最后一个元素开始到pos的位置进行前移
}
pseq->size--;
}
}
void Remove(pseqlist pseq, DataType data)//删除第一个为data的元素
{
assert(pseq);
int i = Find(pseq, data);
if (i >= 0)
{
while (i < (int)pseq->size)
{
pseq->arr[i - 1] = pseq->arr[i];
i++;
}
pseq->size--;
printf("已删除\n");
return;
}
else
{
printf("没有找到该元素");
return;
}
}
void RemoveAll(pseqlist pseq, DataType data)//删除所有位置的data
{
assert(pseq);
int pos = Find(pseq, data);
while( -1!= pos)
{
Erase(pseq, pos);
pos++;
}
}//时间复杂度高
void RemoveAll1(pseqlist pseq, DataType data)
{
assert(pseq);
int count = 0;
int i = 0;
DataType *ptmp = (DataType *)malloc(sizeof(DataType)*pseq->size);//开辟一段空间
//ptmp指向这一段空间
for (i = 0; i < pseq->size; i++)
{
if (pseq->arr[i] != data)
{
ptmp[count++] = pseq->arr[i];//将不是data数据的放入已经开辟好的空间中
}
strcpy(pseq, ptmp);
}//空间复杂度高
}
void RemoveAll2(pseqlist pseq, DataType data)
{
int i = 0;
int count = 0;
for (i = 0; i < pseq->size; i++)
{
if (pseq->arr[i] != data)
{
pseq->arr[i - count] = pseq->arr[i];
}
else
{
count++;
}//记录删除data的个数
}
pseq->size -= count;
}
//时间复杂度O(n),空间复杂度O(1)
测试函数
#include"seqlist.h"
void test1(pseqlist s)
{
InitSeqList(s);//初始化
PushBack(s, 2);//尾插
PopBack(s);//尾删
PrintSeqList(s);
PushFront(s, 3);//头插
PrintSeqList(s);
FrontBack(s);//头删
Insert(s,3,6);//任意位置插入
Erase(s, 5);//在任意位置删除
}
void test2(pseqlist s)
{
InitSeqList(s);//初始化
PrintSeqList(s);//打印顺序表
Find(s, 5);//查找数据
Remove(s, 3);//删除第一个为data的元素
RemoveAll(s, 4);//删除所有位置的data
RemoveAll1(s, 4);
RemoveAll2(s, 4);//删除所有位置data的改进
}
int main()
{
seqlist s;
test1(&s);
test2(&s);
system("pause");
return 0;
}