数据结构---定长顺序表

1.线性表的定义

存在唯一的一个被称为"第一个"的数据元素;存在唯一的一个被称为"最后一个"的数据元素;除第一个之外,集合中的每一个数据元素都只有一个前驱;除最后一个之外,集合中的每一个数据元素都只有一个后继。

线性表是最简单最常用的一种线性表。线性表分为顺序表和链表。顺序表又分为定长顺序表和不定长顺序表。

2. 线性表的顺序表,顺序表的设计思想

加入length和左端连续

typedef struct SQList

{

int elem[10];

int length;

} SQList, * PSQList;

头文件sqlist.h文件

cs 复制代码
#pragma once
//防止头文件重复编译
//定长顺序表
 
//定义与声明
typedef struct SQList
{
	int elem[10];
	int length;
} SQList, * PSQList;

结构示意图

length表示前length个数据是有效的

int i = ps->length-1;//(存在边界问题)

在某号位置插入某个数据,即将ps->elem[i+1]=ps->elem[i];

cs 复制代码
实现
#include "sqlist.h"
#include <assert.h>
#include <stdio.h>

//定长顺序表的实现

//初始化(自己定义的结构体,名字叫ps)
//ps是结构体,访问结构体里面的用指向符 ->
void  InitSqlist(PSQList ps)
{
	assert(ps != NULL);//判断参数,ps是外面传进来的,有可能为空
	if (ps == NULL)
		return;
	ps->length = 0;
}
static bool IsFul(PSQList ps)
{
	return ps->length == 10;
}

//插入数据,在ps顺序表的pos位置插入val;
bool Insert(PSQList ps, int pos, int val)
{
	assert(ps != NULL);
	if (ps == NULL)
		return false;

	if (pos<0 || pos>ps->length||IsFul(ps))
	{
		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;
}

输出函数

cs 复制代码
//输出
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");
}

以上就是核心代码

接下来实现对定长顺序表的一些操作

①在ps中查找第一个key值,找到返回下标,没有找到返回-1;

cs 复制代码
//判空
bool IsEmpty(PSQList ps)
{
	return ps->length == 0;
}

//在ps中查找第一个key值,找到返回下标,没有找到返回-1;
int Search(PSQList ps, int key)
{
	for (int i = 0; i < ps->length; i++)
	{
		if (key == ps->elem[i])
		{
			return i;
		}
	}
	return -1;
}

②删除pos位置的值

cs 复制代码
//删除pos位置的值
bool DelPos(PSQList ps, int pos)
{
	assert(ps != NULL);
	if (ps == NULL)
		return false;

	if (pos < 0 || pos >= ps->length)//如果是空表pos也满足大于0
	{
		return false;
	}
	//把数据前移
	for (int i = pos; i < ps->length - 1; i++)
	{
		ps->elem[i] = ps->elem[i + 1];
	}
	//有效数据个数--
	ps->length--;
	return true;
}

③删除第一个val的值

cs 复制代码
//删除第一个val的值
bool DelVal(PSQList ps, int val)
{
	assert(ps != NULL);
	if (ps == NULL)
		return false;
	int i = Search(ps, val);//i是下标
	//调用参数如果有返回值,将返回值进行判断,这是一个好习惯
	if (i < 0)
	{
		return false;
	}
	return DelPos(ps, i);

}

④//返回key的前驱下标,如果不存在返回-1

cs 复制代码
//返回key的前驱下标,如果不存在返回-1;
int GetPrio(PSQList ps, int key)
{
	int i = Search(ps, key);
	if (i <= 0)//注意:头没有前驱
	{
		return -1;
	}
	return i - 1;
}

⑤返回key的后继下标,如果不存在返回-1

cs 复制代码
int GetNext(PSQList ps, int key)
{
	int i = Search(ps, key);
	if (i < 0 || i == ps->length - 1)//注意:尾没有后继
	{
		return -1;
	}
	return i + 1;
}

⑥清空数据

cs 复制代码
//清空数据
void Clear(PSQList ps)
{
	ps->length = 0;
}

⑦销毁整个内存

cs 复制代码
//销毁整个内存.动态内存,没有用malloc,直接用clear清空即可
void Destroy(PSQList ps)
{
	Clear(ps);
}

整体代码:

cs 复制代码
实现
#include "sqlist.h"
#include <assert.h>
#include <stdio.h>

//定长顺序表的实现

//初始化(自己定义的结构体,名字叫ps)
 //ps是结构体,访问结构体里面的用指向符 ->
void  InitSqlist(PSQList ps)
{
	assert(ps != NULL);//判断参数,ps是外面传进来的,有可能为空
	if (ps == NULL)
		return;
	ps->length = 0;
}
static bool IsFul(PSQList ps)
{
	return ps->length == 10;
}

//插入数据,在ps顺序表的pos位置插入val;
bool Insert(PSQList ps, int pos, int val)
{
	assert(ps != NULL);
	if (ps == NULL)
		return false;

	if (pos<0 || pos>ps->length||IsFul(ps))
	{
		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)
{
	return ps->length == 0;
}

//在ps中查找第一个key值,找到返回下标,没有找到返回-1;
int Search(PSQList ps, int key)
{
	for (int i = 0; i < ps->length; i++)
	{
		if (key == ps->elem[i])
		{
			return i;
		}
	}
	return -1;
}

//删除pos位置的值
bool DelPos(PSQList ps, int pos)
{
	assert(ps != NULL);
	if (ps == NULL)
		return false;

	if (pos < 0 || pos >= ps->length)//如果是空表pos也满足大于0
	{
		return false;
	}
	//把数据前移
	for (int i = pos; i < ps->length - 1; i++)
	{
		ps->elem[i] = ps->elem[i + 1];
	}
	//有效数据个数--
	ps->length--;
	return true;
}

//删除第一个val的值
bool DelVal(PSQList ps, int val)
{
	assert(ps != NULL);
	if (ps == NULL)
		return false;
	int i = Search(ps, val);//i是下标
	//调用参数如果有返回值,将返回值进行判断,这是一个好习惯
	if (i < 0)
	{
		return false;
	}
	return DelPos(ps, i);

}

//返回key的前驱下标,如果不存在返回-1;
int GetPrio(PSQList ps, int key)
{
	int i = Search(ps, key);
	if (i <= 0)//注意:头没有前驱
	{
		return -1;
	}
	return i - 1;
}

//返回key的后继下标,如果不存在返回-1;
int GetNext(PSQList ps, int key)
{
	int i = Search(ps, key);
	if (i < 0 || i == ps->length - 1)//注意:尾没有后继
	{
		return -1;
	}
	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;
}
//销毁整个内存.动态内存,没有用malloc,直接用clear清空即可
void Destroy(PSQList ps)
{
	Clear(ps);
}
相关推荐
罗湖老棍子1 小时前
【 例 1】石子合并(信息学奥赛一本通- P1569)
数据结构·算法·区间dp·区间动态规划·分割合并
小高Baby@1 小时前
JSON、bind、form
数据结构·json
数智工坊4 小时前
【数据结构-栈】3.1栈的顺序存储-链式存储
java·开发语言·数据结构
执着2594 小时前
力扣102、二叉树的层序遍历
数据结构·算法·leetcode
元亓亓亓4 小时前
考研408--数据结构--day5--栈与队列的应用
数据结构·考研··408·队列
小高Baby@4 小时前
Golang中面向对象的三大特性之多态的理解
数据结构·golang
dazzle4 小时前
Python数据结构(十五):归并排序详解
数据结构·python·算法
.ZGR.4 小时前
认识数据结构:图——无人机防空平台的“衍生品”
java·开发语言·数据结构
晚风吹长发5 小时前
初步了解Linux中的线程同步问题及线程安全和死锁与生产消费者模型
linux·运维·服务器·开发语言·数据结构·安全
一只专注api接口开发的技术猿5 小时前
淘宝商品详情API的流量控制与熔断机制:保障系统稳定性的后端设计
大数据·数据结构·数据库·架构·node.js