线性表顺序存储

线性表顺序存储


我们来谈一下线性表的顺序储存结构

图示:
photo_ex

  • 定义:
    • 由 n (n>=0)个数据特性相同的元素构成的有限序列称为线性表
    • 线性表中元素的个数 n (n>=0)定义为线性表的长度,n = 0 时称为空表

  • 特点:
    • 而对于一个非空的线性表来说,通常具有以下特征

    1、存在 唯一 的开始结点
    2、存在 唯一 的终端结点
    3、 除了终端结点和开始结点,其间的每一个结点都有 一个直接前驱一个直接后继

    • 逻辑结构:线性结构
    • 特点:类型相同、有限性、有序性
    • 也是应用最广泛的数据结构之一

顺序储存:

  • 线性表的顺序表示指的是用一组 地址连续的存储单元 依次 存储线性表的数据元素,这种表示也称作线性表的 顺序存储顺序映像

图例:
ex


C++实现代码

  • main.cpp
#include"LinkListHead.h"
void menu();
int main()
{
	char choise;
	LinkList ElemList;
	menu();
	std::cout << "请输入你的选择" << std::endl;
	std::cin >> choise;
	switch (choise)
	{
	case '1':
		if (ElemList.Create())
		{
			if (!ElemList.Insert(100, 5))
			{
				std::cout << "不能插入100到5的位置是因为该表已满" << std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	case '2':
		if (ElemList.Create())
		{
			if (!ElemList.Delete(3))
			{
				std::cout << "不能删除的原因是因为表为空或者没有该下标" << std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	case '3':
		if (ElemList.Create())
		{
			if (ElemList.Insert(100, 6))
			{
				std::cout << "能插入是因为其中元素个数为5个" << std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	case '4':
		if (ElemList.Create())
		{
			if (!ElemList.Insert(100, 7))
			{
				std::cout << "不能插入是因为该元素个数只有5个,无法在第七个位置插入一个数"
					<< std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	case '5':
		if (ElemList.Create())
		{
			if (ElemList.Delete(4))
			{
				std::cout << "能删除是因为列表中有大于4个元素的个数" << std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	case '6':
		if (ElemList.Create())
		{
			if (!ElemList.Delete(8))
			{
				std::cout << "不能在第8个位置删除的原因是列表中没有大于或等于8的个数"
					<< std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	case '7':
		if (ElemList.Create())
		{
			if (ElemList.Insert(100, 1))
			{
				std::cout << "能在该位置插入的原因是改下标合法" << std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	case '8':
		if (ElemList.Create())
		{
			if (ElemList.Delete(1))
			{
				std::cout << "该位置能够删除是因为该下标处于线性表长度中" << std::endl;
				ElemList.DisplayList();
			}
		}
		break;
	default:
		std::cout << "非法输入,结束" << std::endl;
		break;
	}
	return 0;
}

void menu()
{
	std::cout
		<<"1、申请10个空间,往空间中放进10个元素,然后随意增加一个元素\n" 
		<<"2、申请10个空间,往空间中放进0个元素,然后随意删除一个元素\n"
		<<"3、申请10个空间,往空间中放进5个元素,然后在第6个位置增加一个元素\n"
		<<"4、申请10个空间,往空间中放进5个元素,然后在第7个位置增加一个元素\n"
		<<"5、申请10个空间,往空间中放进5个元素,然后删除第4个位置的元素\n"
		<<"6、申请10个空间,往空间中放进5个元素,然后删除第8个位置的元素\n"
		<<"7、申请10个空间,往空间中放进0个元素,然后增加第1个位置的元素\n"
		<<"8、申请10个空间,往空间中放进5个元素,然后删除第1个位置的元素\n"
		<<std::endl;
}

  • LinkListHead.h
#pragma once
#ifndef _LINKLISTHEAD_H_
#define _LINKLISTHEAD_H_
#include<iostream>
#include<cstdlib>
typedef int DataType;
class LinkList
{
private:
	int length;//表元素的长度
	int maxsize;//表最大的长度
	bool empty;//判断表空
	DataType* list = nullptr;//表
public:
	LinkList();//初始化函数,初始化为空表 done
	LinkList(LinkList& L);//构造一个新的线性表 done
	bool Create();//创建顺序离散表 done
	bool Insert(DataType target, int index);//往第几个位置插入一个元素 done
	bool Delete(int index);//删除下标为index的元素 done
	int Find(DataType target);//找到是否有这些元素,然后返回该元素下标,如果没有,返回0
	void DisplayList();//显示线性表
	void DestoryList();//摧毁离散表
	virtual ~LinkList();//析构链表

};
#endif // !_LINKLISTHEAD_H_

  • LinkListHead.cpp
#include "LinkListHead.h"

LinkList::LinkList()
{
	length = 0;
	maxsize = 0;
	empty = true;
}

LinkList::LinkList(LinkList& L)
{
	length = L.length;
	maxsize = L.maxsize;
	empty = L.empty;
	//进行拷贝复制,申请新的顺序表
	list = new DataType[maxsize];//申请maxsize大小的空间
	for (int i = 0; i < length; i++)//进行每一个元素复制
		list[i] = L.list[i];

}

bool LinkList::Create()
{
	using std::cin;
	using std::cout;
	using std::endl;
	cout << "请输入申请顺序线性表的大小" << endl;
	cin >> maxsize;//输入线性表的大小
	list = new DataType[maxsize];//利用大小来创建线性表
	if (!list)//如果表为空
	{
		cout << "不能申请空间" << endl;
		exit(-1);//当申请空间失败的时候,退出
	}
	//当表空的时候,创建数据
	cout << "请输入有多少个数据" << endl;
	cin >> length;
	if (length<0 || length>maxsize)
	{
		cout << "非法输入创建失败" << endl;
		//失败后置空空间,恢复初始设置
		maxsize = 0;
		length = 0;
		delete[]list;
		list = nullptr;

		return false;//返回失败
	}
	else
	{
		cout << "请输入数据" << endl;
		for (int i = 0; i < length; i++)
			cin >> list[i];//进行数据输入
		cout << "输入成功,创建成功" << endl;
		empty = false;
		return true;//返回成功
	}
}

bool LinkList::Insert(DataType target, int index)
{
	using std::cout;
	using std::endl;
	//首先进行非法检查
	if (index<1 || index>length+1 || length == maxsize)//判断插入数的下表是否是合法
	{
		//非法的形式:
		//1、插入的下表上溢或者下溢
		//2、顺序表中的元素的长度已经等于最大值的长度
		cout << "非法插入" << endl;
		return false;
	}
	else
	{
		for (int i = length - 1; i >= index - 1; i--)
		{
			list[i + 1] = list[i];//整体元素往后移动一位
		}
		list[index - 1] = target;//把index位置插入元素
		length++;
		cout << "插入成功" << endl;
		return true;
	}
}

bool LinkList::Delete(int index)
{
	using std::endl;
	using std::cout;
	if (length == 0 || empty)
	{
		cout << "表空,无法删除" << endl;
		return false;
	}
	if (index<1 || index>length)
	{
		//大于有效长度,或者小于最小长度,非法
		cout << "非法下标" << endl;
		return false;
	}
	else
	{
		//如果不是以上的情况,那么正常删除其中的元素
		
		for (int i = index - 1; i < length; i++)
			list[i] = list[i + 1];//后一位赋值给前一位,覆盖掉前一位
		length--;//长度减少1
		cout << "删除完成" << endl;
		return true;//返回成功
	}
}

int LinkList::Find(DataType target)
{
	for (int i = 0; i < length; i++)
		if (list[i] == target)
			return i + 1;//找到了,返回其元素的下表
	return 0;//找不到,返回0
}

void LinkList::DisplayList()
{
	for (int i = 0; i < length; i++)
	{
		std::cout << list[i] << " ";
	}
	std::cout << "length = "<<length << std::endl;
	std::cout << std::endl;
}

void LinkList::DestoryList()
{
	delete[]list;
	length = 0;
	maxsize = 0;
	list = nullptr;
}

LinkList::~LinkList()
{
	delete[]list;
	length = 0;
	maxsize = 0;
	list = nullptr;
}


运行图示:

菜单1:
photo1

菜单2:
photo2

菜单3:
photo3

菜单4:
photo4

菜单5:
photo5

菜单6:
photo6

菜单7:
photo7

菜单8:
photo8

以上便是全部代码,如有错误,请指出。

借鉴书籍《数据结构 c语言第二版》

posted @ 2019-09-02 22:47  野生的Lemon柠檬  阅读(524)  评论(0编辑  收藏  举报

呱呱呱呱呱🐸