1. 程式人生 > >【原始碼】C++實現嚴蔚敏資料結構所有演算法(一)線性表-順序表

【原始碼】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;
}

執行結果

相關推薦

no