【原始碼】C++實現嚴蔚敏資料結構所有演算法(一)線性表-順序表
阿新 • • 發佈:2019-01-17
日常說明:首先博主也是菜鳥一枚,有錯誤歡迎大家指正。另外本部落格所有的程式碼博主編寫後均除錯
通過。重要提醒!!!!博主使用的是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;
}