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

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);
}
相关推荐
姜行运26 分钟前
数据结构【链表】
c语言·开发语言·数据结构·链表
egoist20232 小时前
【C++指南】一文总结C++二叉搜索树
开发语言·数据结构·c++·c++11·二叉搜索树
lidashent2 小时前
数据结构和算法——汉诺塔问题
数据结构·算法
ん贤4 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯
我的sun&shine11 小时前
高级数据结构03RB树
数据结构·b树
_GR14 小时前
2022年蓝桥杯第十三届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯·动态规划
快来卷java14 小时前
常见集合篇(二)数组、ArrayList与链表:原理、源码及业务场景深度解析
java·数据结构·链表·maven
Stardep15 小时前
算法学习11——滑动窗口——最大连续1的个数
数据结构·c++·学习·算法·leetcode·动态规划·牛客网
rigidwill66616 小时前
LeetCode hot 100—二叉搜索树中第K小的元素
数据结构·c++·算法·leetcode·职场和发展
UP_Continue19 小时前
排序--归并排序
数据结构