日常说明:首先博主也是菜鸟一枚,有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试
通过。重要提醒!!!!博主使用的是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;
}