数据结构(一):线性表的顺序存储结构-顺序表的实现
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语言实现小游戏代码………… **
相关文章推荐
- 【数据结构】顺序线性表的插入、删除、合并实现
- 数据结构教程 第六课 线性表的顺序表示和实现
- 数据结构(1)--线性表顺序表的主要操作的实现
- 数据结构2----线性表顺序存储和链式存储的实现(霜之小刀)
- 【数据结构之线性表顺序存储】简单的数组的方式实现
- 数据结构二:线性表的顺序结构实现
- 数据结构(严蔚敏)C语言实现---线性表的顺序存储
- 线性表的顺序表示和实现 - 数据结构
- 数据结构1:线性表的顺序表示和实现
- 线性表的顺序表示和实现 - 数据结构
- 线性表顺序存储结构实现(线性表-数据结构作业)
- 数据结构(3)线性表之顺序表C++实现
- 数据结构之线性表的顺序表示和实现
- [数据结构一]线性表:顺序实现
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)
- 数据结构之线性表――顺序存储结构(php代码实现)
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 数据结构之:线性表的顺序表示和实现
- 数据结构实现顺序线性表的一些小应用
- 数据结构之线性表顺序实现