【源代码】C++实现严蔚敏数据结构所有算法(一)线性表-顺序表

日常说明:首先博主也是菜鸟一枚,有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试
通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴
最好新建空项目将此代码复制上去。

附加说明:最初的代码我没有严格的按照项目规范来分离,希望大家包含。
头文件 list.h

#pragma once
/**********************************
* algorithms.h :线性表的基本操作 *
* author : shilei                 *
* created : 2017.3.12             *
***********************************/

class SqList
{
protected:
    DataType * elem;//首地址
    int length; //当前的顺序表长度
    int listSize; //顺序表的容量
private:
    void init(DataType values[], int n);//初始化线性顺序表
public:
    SqList(int LIST);
    ~SqList(void);
    int Clength();
    void ListInsert(int i, DataType e);
    virtual void ListInsert(DataType e);
    DataType ListDelete(int i);
    DataType GetElem(int i);
    SqList(DataType values[], int n);//构造顺序表,由数组直接提供元素
};
SqList::SqList(int LIST)//构造空顺序表
{
    this->listSize = LIST;
    length = 0;
    this->elem = new DataType[listSize];
}
SqList::SqList(DataType values[], int n)//用数组直接构造顺序表
{
    this->init(values, n);
}
void SqList::init(DataType values[], int n)//初始化顺序表
{
    this->listSize = n * 2;//初始化顺序表的容量为n*2
    this->elem = new DataType[this->listSize];//初始化elem顺序表
    this->length = n;//初始化顺序表的元素个数为变量n
    for (int i = 0; i < length; i++)//将数组中的元素一次赋值到顺序表
    {
        this->elem[i] = values[i];
    }
}
SqList::~SqList(void)//析构函数
{
    delete[]this->elem;
}
int SqList::Clength()
{
    return this->length;
}

void SqList::ListInsert(int i, DataType e)
{
    if (i<1 || i>this->length + 1)
    {
    cout << "i取值有误" << endl;
    exit(0);
    }

    DataType *p = this->elem;
    //if (i < 1)i = 1;
    //if (i > this->length + 1)i = this->length;
    if (length >= listSize)//超容时进行扩容
    {

        this->length += LISTINCREMENT;//宏定义扩容量
        this->elem = new DataType[this->length];//重新申请更大的数组
        for (int j = 0; j <i; j++)//先复制前i-1个元素
        {
            this->elem[j] = p[j];
        }
        for (int j = this->length - 1; j >= i; j--)//将从i位置开始的元素向后移,从后到前依次后移
        {
            this->elem[j + 1] = p[j];
        }
        if (p != this->elem)//释放原数组的空间
        {
            delete[]p;
        }
    }
    this->elem[i-1] = e;
    this->length++;
}
void SqList::ListInsert(DataType e)
{
    ListInsert(this->length, e);
}
DataType SqList::ListDelete(int i)
{
    if (this->length>0 && i >= 1 && i<length)
    {
        DataType e = this->elem[i - 1];
        for (int j = i - 1; j < this->length - 1; j++)
        {
            this->elem[j] = elem[j + 1];
        }
        this->length--;
        return e;
    }
    throw out_of_range("i的数值超出顺序表的范围");
}
DataType SqList::GetElem(int i)
{
    if (i<0 || i>length)
    {
        cout << "i值不合法" << endl;
        exit(0);
    }
    return elem[i - 1];
}
#pragma once

list.cpp


/**********************************
* algorithms.cpp :线性表的基本操作 *
* author : shilei                 *
* created : 2017.3.12             *
***********************************/

#include <string.h>
#include <iostream>
using namespace std;
#include <exception>
typedef int DataType;
#define LISTINCREMENT 10
#define LIST_INIT_SIZE 10
#include "list.h"


void int_type()//进行插入和删除操作
{

    SqList La(LIST_INIT_SIZE);//初始化空顺序表
    for (int i = 1; i <= LIST_INIT_SIZE; i++)//插入10个元素
    {
        La.ListInsert(i, i * 3);
    }
    cout << "La顺序表插入10个数据元素:";
    for (int i = 1; i <= La.Clength(); i++)//依次输出插入操作后的顺序表元素
    {
        cout <<La.GetElem(i)<<"  ";
    }
    La.ListDelete(3);//删除顺序表第三个元素,输出对比
    cout << endl;
    cout << endl;
    cout << "删除第三个元素:";
    for (int i = 1; i <= La.Clength(); i++)
    {
        cout << La.GetElem(i) << "  ";
    }
    La.ListDelete(3);//再次删除顺序表的第三个元素,输出对比
    cout << endl;
    cout << endl;
    cout << "再一次删除第三个元素:";
    for (int i = 1; i <= La.Clength(); i++)
    {
        cout << La.GetElem(i) << "  ";
    }
}

 void MergeList()
{
     SqList LC(15);
     int i = 1;int j = 1; int k = 0;
     int ai;int bi;
     int A[5];
     int B[7];
     //int A[5] = { 2,3,6,7,9 };
     //int B[7] = { 3,4,5,8,9,10,11 };
     cout << endl;
     cout << "\n******顺序表合并操作*******\n";
     cout << endl;
     cout << "请输入顺序表LA的5个非递减元素:";
     for (int n = 0; n < 5; n++)
     {
         cin >> A[n];
     }
     cout << endl;
     cout << "请输入顺序表LB的7个非递减元素:";
     for (int n = 0; n < 7; n++)
     {
         cin >> B[n];
     }
     SqList LA(A, 5);//直接用数组初始化顺序表
     SqList LB(B, 7);
     cout << endl;
    /*
    cout << "输出顺序表LA的所有元素:";
     for (int i = 1; i <= LA.Clength(); i++)
     {
         cout <<LA.GetElem(i) << "  ";
     }
     cout << endl;
     cout << "输出顺序表LB的所有元素:";
     for (int i = 1; i <= LB.Clength(); i++)
     {
         cout << LB.GetElem(i) << "  ";
     }
     */
     while ( (i <= LA.Clength()) && (j <= LB.Clength()) )
     {
         ai = LA.GetElem(i);bi = LB.GetElem(j);
         if (ai <= bi) { LC.ListInsert(++k, ai);++i; }
         else{ LC.ListInsert(++k, bi);++j;}
     }
     while ( i <= LA.Clength())
     {
         ai = LA.GetElem(i++);
         LC.ListInsert(++k, ai);
     }
     while (i <= LB.Clength())
     {
         bi = LB.GetElem(i++);
         LC.ListInsert(++k, bi);
     }
     cout << "输出顺序表LC的所有元素:"<<endl;
     for (int i = 1; i <= LC.Clength(); i++)
     {
         cout << LC.GetElem(i) << "  ";
     }
}



int main()
{
    cout << "\n******顺序表基本操作*******\n";
    cout << endl;
    int_type();
    cout << endl;
    MergeList();
    return 0;
}

运行结果

猜你喜欢

转载自blog.csdn.net/handoking/article/details/79545710