【顺序表】定长顺序表

最常用最简单的数据结构,分为顺序表(定长的顺序表和不定长的顺序表)和链表

数组:  存数据,取数据,求长度

顺序表:存数据,读数据,增加数据,删除数据

为了记录顺序表的有效长度,可以定义一个整形的变量记录有效长度

顺序表的常见操作:

#pragma once
typedef struct SQList//定长顺序表
{
	int elem[10];
	int length;
}SQList,*PSQList;//typedef把变量提升为类型,PSQList == SQList*

void InitSqlist(PSQList ps);//初始化的声明
bool Insert(PSQList ps, int pos, int val);//插入数据,在ps顺序表的pos位置插入val
bool IsEmpty(PSQList ps);//判断是否为空
int Search(PSQList ps, int key);//查找,在ps查找第一个key值,返回下标,没有返回-1
bool DelPos(PSQList ps, int pos);//删除,pos位置的值
bool DelVal(PSQList ps, int val);//删除,第一个val值
int GetPrio(PSQList ps, int key);//返回key的前驱下标,如果不存在返回-1
int GetNext(PSQList ps, int key);//返回key的后继下标,如果不存在返回-1
void Show(PSQList ps);//输出
void Clear(PSQList ps);//清空

以上是.h文件,其中第一排#pragma once是自动出现的,这是防止头文件被重复引用,例如:c.h用了a.h和b.h,b.h用了a.h,主要防这种隐式引用
.h文件放定义与声明

 实现:

#include "1sqlist.h"
#include<assert.h>
#include<stdio.h>
void InitSqlist(PSQList ps)//初始化的声明
{
	assert(ps != NULL);//断言快速定位错误
	ps->length = 0;
}
bool Insert(PSQList ps, int pos, int val)//插入数据,在ps顺序表的pos位置插入val
{
	assert(ps != NULL);
	if (ps->length == 10)//满了
		return false;
	if (pos < 0 || pos>ps->length)
		return false;

	for (int i = ps->length-1; i > pos; i--)
	{
		ps->elem[i+1] = ps->elem[i];
	}
	ps->elem[pos] = val;
	ps->length++;
	return true;
}
bool IsEmpty(PSQList ps)//判断是否为空
{
	if (ps->length == 0)
		return true;
	return false;
}
int Search(PSQList ps, int key)//查找,在ps查找第一个key值,返回下标,没有返回-1
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return -1;
	}
	for (int i = 0; i < ps->length; i++)
	{
		if (ps->elem[i] == key)
			return i;
	}
	return -1;
}
bool DelPos(PSQList ps, int pos)//删除,pos位置的值
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	if (pos<0 || pos>ps->length)
		return false;
	for (int i = pos; i < ps->length-1; i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}
	ps->length--;
	return true;
}
bool DelVal(PSQList ps, int val)//删除,第一个val值
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	int i = Search(ps, val);
	for (i; i < ps->length - 1; i++)
	{
		ps->elem[i] = ps->elem[i + 1];
	}
	ps->length--;
}
int GetPrio(PSQList ps, int key)//返回key的前驱下标,如果不存在返回-1
{
	int i = Search(ps, key);
	if (i < 1)
		return -1;
	else
		return i - 1;
}
int GetNext(PSQList ps, int key)//返回key的后继下标,如果不存在返回-1
{
	int i = Search(ps, key);
	if (i <0||i==ps->length-1)
		return -1;
	else
		return i + 1;
}
void Show(PSQList ps)//输出
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return;
	}
	for (int i = 0; i < ps->length; i++)
	{
		printf("%d ", ps->elem[i]);
	}
	printf("\n");
}
void Clear(PSQList ps)//清空
{
	ps->length = 0;
}
void  Destroy(PSQList ps)//销毁整个内存
{
	Clear(ps);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦樂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值