转载请注明出处,谢谢~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++类模板实现了线性表的链式存储结构(链表),类中包含了线性表的常用方法:向线性表中插入一个元素、删除一个元素、清空线性表、获取一个元素、获取线性表长度等。大致实现了STL中的链表的基本功能,通过对比...
本项目聚焦于使用C++语言的模板机制来实现基于链表结构的线性表,这为处理不同类型的元素提供了灵活性。 C++的模板是一种泛型编程技术,它允许我们编写通用的代码,这些代码可以处理多种数据类型。在实现线性表时,...
数据结构-C++程序 线性表的线性存储例子-在dev c++平台运行正常,用于教学使用
在这个场景下,我们关注的是如何使用C++语言来实现线性表的合并操作。C++作为一种强类型、静态类型的编程语言,以其高效性和灵活性在系统编程和应用编程中广泛应用。 线性表的合并通常涉及到两个或更多线性表的组合...
线性表的顺序存储的c语言实现,带有注释,简洁明了,一看即懂
在C++中,线性表通常通过两种方式实现:顺序存储结构和链式存储结构。 1. **顺序存储结构**:线性表的顺序表示是通过数组来实现的。数组中的每个元素代表线性表中的一个节点,元素之间的顺序关系由数组的索引位置...
头歌C++数据结构与算法 - 线性表
在C++中实现线性表的顺序存储,通常会定义一个结构体或类来封装数组和相关的操作。这个结构体或类通常包含以下几个部分: 1. **数据成员**:一个大小固定的数组,用于存储线性表的元素。例如,可以声明一个整型数组...
本篇将详细阐述标题和描述中提到的几种线性表排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、堆排序以及归并排序。 1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个...
数据对象的实例。在C++中,数据结构是用来...总结来说,C++数据结构中的线性表是编程中基础且重要的概念,它涵盖了多种描述方式,每种方式都有其优势和应用场景。理解并熟练掌握这些知识对于开发高效的程序至关重要。
在C++中实现线性表,通常有两种方式:顺序存储和链式存储。这个名为"线性表C++源码.rar"的压缩包包含了这两种结构的C++实现,同时使用了模板类,使其具有通用性,适用于多种数据类型。 首先,我们来看顺序存储结构...
本问题涉及的是链式存储的实现,具体是用C++语言编写线性表的链式表示,包括插入、删除等基本操作。 首先,链式存储结构是一种动态存储结构,它通过节点间的指针链接来表示元素之间的逻辑关系。在这个例子中,...
C++ 通过类实现线性表 本文详细介绍了 C++ 通过类实现线性表的知识点,包括线性表的基本概念...通过这种方式实现线性表,可以方便地使用 C++ 语言实现线性表,并且可以根据需要添加或修改成员函数,以满足不同的需求。
数据结构:线性表的创建、插入、查找、删除 vector的简单应用
使用C++类模板实现了线性表的顺序存储结构,类中包含了线性表的常用方法:向线性表中插入一个元素、删除一个元素、清空线性表、获取一个元素、获取线性表长度、获取线性表的容量等。大致实现了STL中的线性表基本功能...
在提供的C++代码中,实现了一个基于链式存储的线性表类`reacl`,使用了模板(template)以支持不同数据类型的元素。模板类使得这个线性表可以用于存储整型、浮点型等任意类型的数据。 类`reacl`包含以下成员函数: ...
"数据结构与算法之线性表基础——单链表(C与C++双人打)定义线性表节点的结构.pdf" 数据结构与算法之线性表基础——单链表(C与C++双人打)定义线性表节点的结构是数据结构与算法的重要基础。单链表是一种链式存储...
1. **动态数组**:由于线性表的长度可能变化,因此我们需要使用C++中的`new`运算符动态分配内存,而不是固定大小的数组。这样可以确保数组大小能够根据需要扩展或收缩。 2. **类设计**:通常我们会创建一个名为`...
在C++编程中,线性表的链式存储通常通过链表来实现,这里的链表可以是单链表或者双向链表。本实验主要关注的是单链表,特别是带头结点的单链表。 链表是一种动态数据结构,它不像数组那样需要预先分配连续的内存...