您的位置:首页 > 理论基础 > 数据结构算法

数据结构(一):线性表的顺序存储结构-顺序表的实现

2017-04-18 19:44 716 查看

主要实现算法

void CreateList(T a[], int n);      //建立顺序表
void DispList();                    //显示表元素
int ListLength();                   //查看表长度
bool GetElem(int i , T &e);         //求某序号的元素值
int LocateElem(T e);                //按元素值查找其序号
bool ListInsert(int i, T e);        //插入元素
bool ListDelete(int i);             //删除元素

//友元函数  封闭型
//表逆置
friend void Reverse(SqListClass<T> &L);
//删除第一个值为X的元素
friend bool DeleteElem(SqListClass<T> &L, T x);
//有序表的二路归并
friend void MerGe2(SqListClass<T> &L1, SqListClass<T> &L2, SqListClass<T> &L3);


二路归并

归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。如

设有数列{6,202,100,301,38,8,1}

初始状态:6,202,100,301,38,8,1

第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;

第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;

第三次归并后:{1,6,8,38,100,202,301},比较次数:4;

总的比较次数为:3+4+4=11,;

逆序数为14;

C++中模板类使用友元模板函数 – – 封闭型

指的是在模板类中盛名友元函数并且实现。如

template <class T>
class SqListClass
{
friend void Reverse(SqListClass<T> &L)
{
…………
}
}


要点:友元函数定义在模板类之中

简单的实现代码

#include<iostream>

using namespace std;

#define MaxSize 100

//顺序表类模板
template <class T>
class SqListClass
{
T *data;
int length;

public:
SqListClass();
~SqListClass();
void CreateList(T a[], int n);      //建立顺序表
void DispList();                    //显示表元素
int ListLength();                   //查看表长度
bool GetElem(int i , T &e);         //求某序号的元素值
int LocateElem(T e);                //按元素值查找其序号
bool ListInsert(int i, T e);        //插入元素
bool ListDelete(int i);             //删除元素

//友元函数  封闭型
//表逆置
friend void Reverse(SqListClass<T> &L)
{
int i ;
T temp;
for(i=0; i < L.lenrgth/2; i++)
{
temp = L.data[i];
L.data[i] = L.data[L.length-i-1];
L.data[L.length-i-1] = temp;
}
}

//删除第一个值为X的元素
friend bool DeleteElem(SqListClass<T> &L, T x)
{
int i = 0;
int j;
while(i < L.length && L.data[i] != x) i++;
if(i>= L.length)
return false;
else
{
for(j = i; j < L.length; j++)
L.data[j] = L.data[j+1];
L.length --;
return true;
}
}

//有序表的二路归并
friend void MerGe2(SqListClass<T> &L1, SqListClass<T> &L2, SqListClass<T> &L3)
{
int i = 0, j = 0, k = 0;
while(i<L1.length && j < L2.length)
{
if(L1.data[i] < L2.data[j])
{
L3.data[k] = L1.data[i];
k++;
i++;
}
else
{
L3.data[k] = L2.data[j];
k++;
j++;
}
}
while(i < L1.length)
{
L3.data[k];
i++;
k++;
}
while(j < L2.length)
{
L3.data[k];
j++;
k++;
}
L3.length = k;
}
} ;

//顺序表的初始化和销毁
template<class T>
SqListClass<T>::SqListClass()
{
data = new T[MaxSize];
length = 0;
}

template<class T>
SqListClass<T>::~SqListClass()
{
delete [] data;
}

//建立顺序表
template <class T>
void SqListClass<T>::CreateList(T a[], int n)
{
int i;
for(i = 0; i < n; i++)
data[i] = a[i];
length = i;
}

//求顺序表的长度
template<class T>
int SqListClass<T>::ListLength()
{
return length;
}

//求顺序表中的某个数据元素值
template<class T>
bool SqListClass<T>::GetElem(int i , T &e)
{
if(i <= 1 || i >= length)
return false;
e = data[i-1];
return true;
}

//按元素值查找
template<class T>
int  SqListClass<T>::LocateElem(T e)
{
int i = 0;
while(i < length && data[i] != e)
i++;
if(i >= length)
return 0;
else
return i+1;
}

// 插入数据元素
template<class T>
bool SqListClass<T>::ListInsert(int i, T e)
{
int j ;
if(i < 1 || i > length) return false;
for(j = length; j >= i; j-- )
{
data[j] = data[j-1];
}
data[i-1] = e;
length++;
return true;
}

//删除数据元素
template<class T>
bool SqListClass<T>::ListDelete(int i)
{
int j;
if(i<1 || i > length) return false;
for(j = i ; j < length; j++)
data[i-1] = data[i];
length --;
return true;
}

//输出所有数据元素
template<class T>
void SqListClass<T>::DispList()
{

for(int i = 0; i<length; i++)
{
cout << data[i] << " ";
if((i+1) %5 ==0)
cout << endl;
}
}

int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int a1[5]={5,6,7,9,10};
int a2[5]={1,22,8,9,10};
int a3[5]={1,2,3,4,5};
SqListClass<int> MyClass;
SqListClass<int> MyClass1;
SqListClass<int> MyClass2;
SqListClass<int> MyClass3;
MyClass.CreateList(a, 10);
MyClass1.CreateList(a1, 5);
MyClass2.CreateList(a2, 5);
MyClass3.CreateList(a3, 5);

//Reverse(MyClass);
DeleteElem(MyClass1, 6);

MyClass1.DispList();
return 0;
}


*本人github链接: https://github.com/ITMasterC
欢迎来共同探讨,C++,cocos2dx游戏,数据结构,C语言实现小游戏代码………… **

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: