静态顺序表

线性表: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;

}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值