数据结构 ->顺序表的输入 输出 查找 删除 销毁 快速排序

目录

「话不多说」上代码:定义

顺序表的「输入」

顺序表的「输出」

顺序表的「查找」

顺序表的「删除」

顺序表的「销毁」

顺序表的「快速排序」


顺序表,全名顺序储存结构,是线性表的一种。

顺序表储存数据时,会提前申请一整块足够大小的物理空间,然后将数据依次储存起来,储存时做到数据元素之间不留一丝缝隙。

顺序表_百度百科

个人理解:顺序表储存数据的模式同数组十分相近,但是(当然有但是)顺序表每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或一个字符,也可以是一页书,甚至其他更复杂的信息。

「话不多说」上代码:定义

#pragma once
#include<iostream>
using namespace std;
typedef int Sbt;
#define Size 1              //线性表储存空间的增量
typedef struct Sqlist
{
	Sbt* date = nullptr;    //储存空间的基址
	int legth = 0;          //当前长度
	int size = 0;           //当前分配的储存容量(以sizeof(Sbt)为单位)
}Sqlist;

初始化时将date置空,将线性表当前长度设为“0”。

顺序表的「输入」

//输入
void Sq_push(Sqlist& s, int x)
{
	if (s.legth <= s.size)
	{
		Sbt* temp;
		temp = (int *)realloc(s.date, (s.legth + Size) * sizeof(int));
		if (temp == nullptr)
		{
			cout << "内存分配失败" << endl;
			exit(0);
		}
		s.date = temp;
		s.size += Size;
	}
	s.date[s.legth] = x;
	++s.legth;
}

温馨提示:建议不要直接分配内存给s.date,在Microsoft Visual Studio Community 2019(我用的是这个)中,它会有以下警告:

官方给出的错误提示链接在此 --->    C6308 | Microsoft Docs

顺序表的「输出」

这个还是比较简单的,就不废话了,上代码。

void Sq_outall(Sqlist& s)
{
	for (int i = 0; i < s.legth; i++)
	{
		cout << s.date[i] << "  ";
	}
}

顺序表的「查找」

上代码

//查找
int Sq_found(Sqlist& s, int x)
{
	for (int i = 0; i < s.legth; i++)
	{
		if (s.date[i] == x)
		{
			cout << "位于第" << i << "号节点   (下标)" << endl;
			return i;
		}
	}
	cout << "ERROR:" << x << "不在指定范围内" << endl;
	return -1;
}

顺序表的「删除」

删除有三种情况有:前端删除,中端删除,后端删除。这三种都可以一次性解决。

从主函数内获得某数的下标,将其后方的数替换掉它,那它后方的数由它后方的后方替换掉,以此类推。

//删除
void Sq_dele(Sqlist& s, int x)
{
	for (int i = 0; i < s.legth; i++)
	{
		if (s.date[i] == x)
		{
			for (; i < s.legth; i++)
			{
				s.date[i] = s.date[i + 1];//将后方的数值替换掉前方的
			}
			s.legth--;
			break;
		}
	}
	cout<<"ERROR: " << x << " 不在指定范围内" << endl;
}

「别怪我没提醒你」  每删除一个数,s.legth都要减一;s.size不用管,因为你已经分配了内存空间,以便下次使用。

顺序表的「销毁」

//销毁
void Sq_destroy(Sqlist& s)
{
	s.legth = 0;
	s.size = 0;
	free(s.date);
	s.date = nullptr;
}

顺序表的「快速排序」

//快速排序
int Sq_quickcollate(Sqlist& s, int a, int b)
{
	int l = a, r = b,center;
	if (l < r)
	{
		while (l < r)
		{
			while (l < r && s.date[l] >= s.date[r])
				r--;
			if (l < r)
			{
				center = s.date[l];//                     ------ center <--
				s.date[l] = s.date[r];//                /                   \  
				s.date[r] = center;//                   -> s.date[r]------>s.date[l]
				l++;
				center = NULL;
			}
			while (l < r && s.date[r] <= s.date[r])
				l++;
			if (l < r)
			{
				center = s.date[l];
				s.date[l] = s.date[r];
				s.date[r] = center;
				r--;
				center = NULL;
			}
		}
		Sq_quickcollate(s, a, l);
		l++;
		Sq_quickcollate(s, l, b);
	}
	return 0;
}

参考文献:数据结构; C 语言版/严蔚敏,昊伟民编著。一北京:清华大学出版社,2007(2019.1重印(清华大学计算机系列教材)
 iSBN 978-7-302-14751-0

本人小白一枚,望指点

本人小白一枚,望指点

本人小白一枚,望指点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值