【数据结构】顺序表

目录

1.顺序表定义

2.分类

  静态顺序表

  动态顺序表

实现

头文件:SequList.h

顺序表初始化和销毁

扩容

从头部插入一个数据

从尾部插入一个数据

从头部删除一个数据

从尾部删除一个数据

指定位置之前插⼊

删除指定位置数据

查找数据


1.顺序表定义

     用一段·物理地址连续的存储单元依次存储数据元素的线性结构,通过数组实现

使用结构体来构造一个顺序表

2.分类

  静态顺序表

#define N 7
typedef int SLdatatype;
typedef struct SequList{

     SLdatatype arr[N];
     int size;
}

  代码中a[N]为定长数组,size是有效数据的个数

  但静态数组有缺点:空间开辟局限,会造成空间不够用或者空间浪费的情况 

  动态顺序表

实现

typedef int SLdatatype;//方便修改数据类型
typedef struct Sequlist{
     SLdatatype* a;
     int size;
     int capacity;//空间容量
}SL;

头文件:SequList.h
typedef int SLDataType;
// 动态顺序表 -- 按需申请
typedef struct SeqList
{
 SLDataType* a;
 int size; // 有效数据个数
 int capacity; // 空间容量
}SL;
//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);
//扩容
void SLCheckCapacity(SL* ps);
//头部插⼊删除 / 尾部插⼊删除
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
//指定位置之前插⼊/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
 int SLFind(SL* ps, SLDataType x);

顺序表初始化和销毁
void SLinit(SL* ps)
{
	ps->a = NULL;
	ps->capacity = 0;
	ps->size = 0;
}

void SLDestory(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->size =ps-> capacity = 0;
}
扩容

   顺序表空间可能不够,在使用前应先检查,当size==capacity时说明空间容量已经满了,进行下一步使用前,需要扩容 

   扩容一般两倍增加

void* SLchekcapacity(SL* ps)
{
	if (ps->capacity == ps->size)
	{
		int newcapacity=ps->capacity = 0 ? 4 : ps->capacity * 2;
        //上句代码是防止capacity=0的情况产生
		SL *temp=(SL*)realloc(ps->a, newcapacity * sizeof(SLdatatype));
		if (temp == NULL)
		{
			perror(realloc);
			exit(1);
		}
		ps->a = temp;
		ps->capacity = newcapacity;
	}
}
从头部插入一个数据
void SLPushFront(SL* ps, SLdatatype x) 
{
	assert(ps);
	SLchekcapacity(ps);

		for (int i = ps->size; i > 0; i--)
		{
			ps->a[i] = ps->a[i - 1];
		}
		ps->a[0] = x;
		ps->size++;
}

 调用函数4次插入数据1 2 3 4 打印如下:

从尾部插入一个数据
void SLPushBack(SL* ps, SLdatatype x)
{
	assert(ps);
	SLchekcapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}

 在尾部插入数据99打印如下:

从头部删除一个数据
void SLPopFront(SL* ps)
{
	for(int i = ps->size - 1; i < 0; i--)
	{
		ps->a[i - 1] = ps->a[i];
	}ps->size--;
}
从尾部删除一个数据
void SLPopFront(SL* ps)
{
	for (int i = ps->size - 1; i < 0; i--)
	{
		ps->a[i - 1] = ps->a[i];
	}ps->size--;
}
指定位置之前插⼊
void SLInsert(SL* ps, int pos, SLdatatype x)
           //pos是指定位置,x是要插入数据
{
	assert(ps);
	SLchekcapacity(ps);
	for (int i = ps->size - 1; i < pos; i--)
	{
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[pos] = x;
}
SLInsert(&s, 3, 88);//调用函数插入数据88

结果如下: 

删除指定位置数据
void SLErase(SL* ps, int pos)
{
	assert(ps);
	for (int i = pos; i < ps->size-1; i++)
	{
		ps->a[i ] = ps->a[i+1];
	}ps->size--;
}
查找数据

   按照数组下标按位查找

int SLfind(SL* ps, SLdatatype x)
{
	assert(ps);
	for (int i = 0; i < ps->size-1; i++)
	{
		if (ps->a[i] == x)
		{
			return i;
		}
		else
			return -1;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值