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

主要实现算法

    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语言实现小游戏代码………… **

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值