`
hulianwang2014
  • 浏览: 745306 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

用C++ DIY自己的线性存储的线性表

 
阅读更多

转载请注明出处,谢谢~http://blog.csdn.net/hongkangwl/article/details/21802073

线性表可以说是最简单的数据结构,它的描述为:n个数据元素的有限序列

记为:L=(a1,a2,...,an)

按照存储结构它又可以分为顺序存储结构和链式存储结构。

而其中线性表的顺序存储结构是最简单最常用的数据结构:用一段连续地址依次存储表中的数据元素

看到这里,我们会自然的联想到C语言中的数组。

下面我要实现的是线性表中的元素为整型的顺序存储结构,及它的主要运算:增删查。

线性存储有个很大的问题,就是在头部插入元素需要把所有的元素往后移动,非常的消耗资源。

这个问题可以通过链式存储解决。

首先,建立线性表的类

class seqlistclass
{
private:
	static int num;  //线性表元素的个数
	static int capacity;//线性表的容量
	int *ptr_member;//指向线性表中用来存储数据的数组的指针
public:
	seqlistclass() //默认构造函数
	{
		ptr_member = NULL;
		num = 0;
		capacity = 0;
	}
	seqlistclass(int n)//带参数的构造函数
	{
		ptr_member = new int[n];
		num = 0;
		capacity = n;
	}
	~seqlistclass()//析构函数,不知道delect为什么不成功,擦
	{
		//delect []  ptr_member;
	}
	void seqlist_setnum(seqlistclass* ptrclass, int pos,int member);//对某个位置上的节点赋值
	int seqlist_getnum(seqlistclass* ptrclass);//得到线性表的元素个数
	int seqlist_getcapacity(seqlistclass* ptrclass);//得到线性表的容量
	int seqlist_getpos(seqlistclass* ptrclass, int pos);	//得到某个位置上的元素
	int seqlist_erasepos(seqlistclass* ptrclass, int pos);//删除某个位置上的元素
	int seqlist_insertmember(seqlistclass* ptrclass, int pos,int member);//在某个位置上插入元素
	void seqlist_display(seqlistclass* ptrclass);//输出线性表中的所有元素
//	void seqlist_setcapacity(seqlistclass* ptr,int capacity);
};
上面的几种成员函数式我们对基本线性表的操作,当然,我们还可以对其进行封装成STL中的push_back 、push_front,如下:

void seqlistclass::pop_back(seqlistclass* ptrclass)
{
	ptrclass->seqlist_erasepos(ptrclass,ptrclass->seqlist_getnum(ptrclass)-1);
}
void seqlistclass::pop_front(seqlistclass* ptrclass)
{
	ptrclass->seqlist_erasepos(ptrclass,0);
}
void seqlistclass::push_front(seqlistclass *ptrclass,int num)
{
	ptrclass->seqlist_insertmember(ptrclass,0,num);
}
void seqlistclass::push_back(seqlistclass *ptrclass,int num)
{
	ptrclass->seqlist_insertmember(ptrclass,ptrclass->seqlist_getnum(ptrclass),num);
}
实际上,他们只是披着别的操作的马甲而已,他们更像是适配器,而不是算法。

几种基本操作里面,最难的就是插入和删除了,代码分别如下:

//插入元素,需要判断几种情况
int seqlistclass::seqlist_insertmember(seqlistclass* ptrclass, int pos,int member)
{
	if(pos > ptrclass->capacity - 1)
	{
		cout<<"位置超出容量,放在顺序表的末尾"<<endl;
		pos = ptrclass->seqlist_getcapacity(ptrclass) - 1;
		seqlist_insertmember(ptrclass,pos,member);
		return 0;
	}
	else
		if(ptrclass->num == ptrclass->capacity)
		{
			cout<<"线性表已满,返回"<<endl;
			return -1;
		}
		else
		{  
			if(pos >= ptrclass->seqlist_getnum(ptrclass))
			{
				pos = ptrclass->num;
				ptrclass->ptr_member[pos] = member;
				ptrclass->num++;
				return 0;
			}
			else
			{
				for(int i = ptrclass->seqlist_getnum(ptrclass); i >pos; i--)
				{
					ptrclass->seqlist_setnum(ptrclass,i,ptrclass->seqlist_getpos(ptrclass,i-1));
				}
				ptrclass->ptr_member[pos] = member;
				ptrclass->num++;
			}
		}

}

删除的代码如下:

//删除后需要把后面的元素往前移动
int seqlistclass::seqlist_erasepos(seqlistclass* ptrclass, int pos)
{
	if(pos > ptrclass->capacity)
	{
		cout<<"越界"<<endl;
		return -1;
	}
	else
	{
		if(pos > ptrclass->seqlist_getnum(ptrclass))
		{
			cout<<"此位置没有放置"<<endl;
			return -1;
		}
		else
		{
			for(int i = pos; i < ptrclass->seqlist_getnum(ptrclass)-1; i++ )
			{
				ptrclass->seqlist_setnum(ptrclass,i,ptrclass->seqlist_getpos(ptrclass,i+1));
			}
			ptrclass->num = ptrclass->num - 1 ;
			return 0;
		}
	}
}

全部的实现代码及其测试代码如下:

#include <iostream>
using namespace std;
class seqlistclass
{
private:
	static int num;  //线性表元素的个数
	static int capacity;//线性表的容量
	int *ptr_member;//指向线性表中用来存储数据的数组的指针
public:
	seqlistclass() //默认构造函数
	{
		ptr_member = NULL;
		num = 0;
		capacity = 0;
	}
	seqlistclass(int n)//带参数的构造函数
	{
		ptr_member = new int[n];
		num = 0;
		capacity = n;
	}
	~seqlistclass()//析构函数,不知道delect为什么不成功,擦
	{
		//delect []  ptr_member;
	}
	void seqlist_setnum(seqlistclass* ptrclass, int pos,int member);//对某个位置上的节点赋值
	int seqlist_getnum(seqlistclass* ptrclass);//得到线性表的元素个数
	int seqlist_getcapacity(seqlistclass* ptrclass);//得到线性表的容量
	int seqlist_getpos(seqlistclass* ptrclass, int pos);	//得到某个位置上的元素
	int seqlist_erasepos(seqlistclass* ptrclass, int pos);//删除某个位置上的元素
	int seqlist_insertmember(seqlistclass* ptrclass, int pos,int member);//在某个位置上插入元素
	void seqlist_display(seqlistclass* ptrclass);//输出线性表中的所有元素
	void push_back(seqlistclass* ptrclass,int num);
	void push_front(seqlistclass* ptrclass,int num);
	void pop_back(seqlistclass* ptrclass);
	void pop_front(seqlistclass* ptrclass);
//	void seqlist_setcapacity(seqlistclass* ptr,int capacity);
};
int seqlistclass::capacity = 0;
int seqlistclass::num = 0;
void seqlistclass::pop_back(seqlistclass* ptrclass)
{
	ptrclass->seqlist_erasepos(ptrclass,ptrclass->seqlist_getnum(ptrclass)-1);
}
void seqlistclass::pop_front(seqlistclass* ptrclass)
{
	ptrclass->seqlist_erasepos(ptrclass,0);
}
void seqlistclass::push_front(seqlistclass *ptrclass,int num)
{
	ptrclass->seqlist_insertmember(ptrclass,0,num);
}
void seqlistclass::push_back(seqlistclass *ptrclass,int num)
{
	ptrclass->seqlist_insertmember(ptrclass,ptrclass->seqlist_getnum(ptrclass),num);
}
//void seqlistclass::seqlist_setcapacity(seqlistclass* ptrclass , int capacity)
//{
//	ptrclass->capacity = capacity;
//}
void seqlistclass::seqlist_display(seqlistclass *ptrclass)
{
	for(int i = 0; i < ptrclass->seqlist_getnum(ptrclass); i++)
	{
		cout<<ptrclass->seqlist_getpos(ptrclass,i)<<" ";
	}
	cout<<endl;
}
int seqlistclass::seqlist_getpos(seqlistclass* ptrclass, int pos)
{
	return ptrclass->ptr_member[pos];
}

void seqlistclass::seqlist_setnum(seqlistclass* ptrclass,int pos, int member)
{
	ptrclass->ptr_member[pos] = member;
}
//删除后需要把后面的元素往前移动
int seqlistclass::seqlist_erasepos(seqlistclass* ptrclass, int pos)
{
	if(pos > ptrclass->capacity)
	{
		cout<<"越界"<<endl;
		return -1;
	}
	else
	{
		if(pos > ptrclass->seqlist_getnum(ptrclass))
		{
			cout<<"此位置没有放置"<<endl;
			return -1;
		}
		else
		{
			for(int i = pos; i < ptrclass->seqlist_getnum(ptrclass)-1; i++ )
			{
				ptrclass->seqlist_setnum(ptrclass,i,ptrclass->seqlist_getpos(ptrclass,i+1));
			}
			ptrclass->num = ptrclass->num - 1 ;
			return 0;
		}
	}
}
//插入元素,需要判断几种情况
int seqlistclass::seqlist_insertmember(seqlistclass* ptrclass, int pos,int member)
{
	if(pos > ptrclass->capacity - 1)
	{
		cout<<"位置超出容量,放在顺序表的末尾"<<endl;
		pos = ptrclass->seqlist_getcapacity(ptrclass) - 1;
		seqlist_insertmember(ptrclass,pos,member);
		return 0;
	}
	else
		if(ptrclass->num == ptrclass->capacity)
		{
			cout<<"线性表已满,返回"<<endl;
			return -1;
		}
		else
		{  
			if(pos >= ptrclass->seqlist_getnum(ptrclass))
			{
				pos = ptrclass->num;
				ptrclass->ptr_member[pos] = member;
				ptrclass->num++;
				return 0;
			}
			else
			{
				for(int i = ptrclass->seqlist_getnum(ptrclass); i >pos; i--)
				{
					ptrclass->seqlist_setnum(ptrclass,i,ptrclass->seqlist_getpos(ptrclass,i-1));
				}
				ptrclass->ptr_member[pos] = member;
				ptrclass->num++;
			}
		}

}


int seqlistclass::seqlist_getcapacity(seqlistclass* ptrclass)
{
	return ptrclass->capacity;
}
int seqlistclass::seqlist_getnum(seqlistclass* ptrclass)
{
	return ptrclass->num;
}

int main()
{
	cout<<"请输入线性表的容量"<<endl;
	int m ;
	cin>>m;
	seqlistclass *seq =new seqlistclass(m);
	
	
//	seq->seqlist_setcapacity(seq,m);
	int *seqlist = new int[m];
	int n;
	cout<<"请输入你想要插入线性表的元素的个数"<<endl;
	cin>>n;
	cout<<"请输入线性表的元素"<<endl;
	for(int i = 0; i < n ; i++)
	{
		cin>>seqlist[i];
	}
	for(int i =0 ; i < n ; i++)
	{
		seq->seqlist_insertmember(seq,i,seqlist[i]);
	}  
	seq->seqlist_display(seq);	
	seq->seqlist_insertmember(seq,1,8);
	seq->seqlist_display(seq);
	seq->seqlist_erasepos(seq,3);
	seq->seqlist_display(seq);
	seq->push_front(seq,44);
	seq->seqlist_display(seq);
	seq->push_back(seq,22);
	seq->seqlist_display(seq);
	seq->pop_back(seq);
	seq->seqlist_display(seq);
	seq->pop_front(seq);
	seq->seqlist_display(seq);
	seq->~seqlistclass();
	return 0;
}

输出结果如下:


比较完整的实现了用C++实现了线性了线性表的顺序存储,当然了,现在还只能存储整形元素,晚上加上泛型编程,让她更完整的跑起来~~嘎嘎,当然了,限于个人水平,有问题的话请留言~~饿死了,先吃饭去了。

分享到:
评论

相关推荐

    数据结构-C++在dev C++平台运行 线性表 链接存储结构

    数据结构-C++在dev C++平台运行 线性表 链接存储结构,程序正常运行,用于教学 ,便于交流

    链表的C++实现(线性表的链式存储C++实现)

    使用C++类模板实现了线性表的链式存储结构(链表),类中包含了线性表的常用方法:向线性表中插入一个元素、删除一个元素、清空线性表、获取一个元素、获取线性表长度等。大致实现了STL中的链表的基本功能,通过对比...

    基于c++语言模板实现的线性表

    本项目聚焦于使用C++语言的模板机制来实现基于链表结构的线性表,这为处理不同类型的元素提供了灵活性。 C++的模板是一种泛型编程技术,它允许我们编写通用的代码,这些代码可以处理多种数据类型。在实现线性表时,...

    数据结构-C++程序 线性表的线性存储例子-在dev c++平台运行正常

    数据结构-C++程序 线性表的线性存储例子-在dev c++平台运行正常,用于教学使用

    C++线性表合并,数据结构作业

    在这个场景下,我们关注的是如何使用C++语言来实现线性表的合并操作。C++作为一种强类型、静态类型的编程语言,以其高效性和灵活性在系统编程和应用编程中广泛应用。 线性表的合并通常涉及到两个或更多线性表的组合...

    线性表的顺序存储实现

    线性表的顺序存储的c语言实现,带有注释,简洁明了,一看即懂

    C++线性表相关知识

    在C++中,线性表通常通过两种方式实现:顺序存储结构和链式存储结构。 1. **顺序存储结构**:线性表的顺序表示是通过数组来实现的。数组中的每个元素代表线性表中的一个节点,元素之间的顺序关系由数组的索引位置...

    头歌C++数据结构与算法 - 线性表

    头歌C++数据结构与算法 - 线性表

    线性表的顺序存储 线性表的顺序存储

    在C++中实现线性表的顺序存储,通常会定义一个结构体或类来封装数组和相关的操作。这个结构体或类通常包含以下几个部分: 1. **数据成员**:一个大小固定的数组,用于存储线性表的元素。例如,可以声明一个整型数组...

    c++实现多种线性表排序的算法(插入排序,希尔,冒泡,快速,堆排序,归并排序)

    本篇将详细阐述标题和描述中提到的几种线性表排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、堆排序以及归并排序。 1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个...

    C++数据结构线性表003

    数据对象的实例。在C++中,数据结构是用来...总结来说,C++数据结构中的线性表是编程中基础且重要的概念,它涵盖了多种描述方式,每种方式都有其优势和应用场景。理解并熟练掌握这些知识对于开发高效的程序至关重要。

    线性表C++源码.rar

    在C++中实现线性表,通常有两种方式:顺序存储和链式存储。这个名为"线性表C++源码.rar"的压缩包包含了这两种结构的C++实现,同时使用了模板类,使其具有通用性,适用于多种数据类型。 首先,我们来看顺序存储结构...

    线性表的链式表示C++代码

    本问题涉及的是链式存储的实现,具体是用C++语言编写线性表的链式表示,包括插入、删除等基本操作。 首先,链式存储结构是一种动态存储结构,它通过节点间的指针链接来表示元素之间的逻辑关系。在这个例子中,...

    C++通过类实现线性表

    C++ 通过类实现线性表 本文详细介绍了 C++ 通过类实现线性表的知识点,包括线性表的基本概念...通过这种方式实现线性表,可以方便地使用 C++ 语言实现线性表,并且可以根据需要添加或修改成员函数,以满足不同的需求。

    线性表(c++代码)

    数据结构:线性表的创建、插入、查找、删除 vector的简单应用

    线性表的顺序存储C++实现(类模板实现)

    使用C++类模板实现了线性表的顺序存储结构,类中包含了线性表的常用方法:向线性表中插入一个元素、删除一个元素、清空线性表、获取一个元素、获取线性表长度、获取线性表的容量等。大致实现了STL中的线性表基本功能...

    线性表的链式存储结构c++模板类实现

    在提供的C++代码中,实现了一个基于链式存储的线性表类`reacl`,使用了模板(template)以支持不同数据类型的元素。模板类使得这个线性表可以用于存储整型、浮点型等任意类型的数据。 类`reacl`包含以下成员函数: ...

    数据结构与算法之线性表基础——单链表(C与C++双人打) 定义线性表节点的结构.pdf

    "数据结构与算法之线性表基础——单链表(C与C++双人打)定义线性表节点的结构.pdf" 数据结构与算法之线性表基础——单链表(C与C++双人打)定义线性表节点的结构是数据结构与算法的重要基础。单链表是一种链式存储...

    数据结构——线性表顺序存储结构(C++代码)

    1. **动态数组**:由于线性表的长度可能变化,因此我们需要使用C++中的`new`运算符动态分配内存,而不是固定大小的数组。这样可以确保数组大小能够根据需要扩展或收缩。 2. **类设计**:通常我们会创建一个名为`...

    线性表的链式存储 C++

    在C++编程中,线性表的链式存储通常通过链表来实现,这里的链表可以是单链表或者双向链表。本实验主要关注的是单链表,特别是带头结点的单链表。 链表是一种动态数据结构,它不像数组那样需要预先分配连续的内存...

Global site tag (gtag.js) - Google Analytics