1. 程式人生 > >線性鏈表之順序表

線性鏈表之順序表

增加 sea list void pub clas desc over h+

順序表中數據元素的存儲地址是其序號的線性函數,只要確定了存儲順序表的起始地址(即 基地址),計算任意一個元素的存儲地址的時間是相等的,具有這一特點的存儲結構稱為[隨機存儲]。


使用的基本數據結構:數組

特點:順序存取,隨機訪問。

/*
Name: SeqList
Copyright: 1.0
Author: Johnny Zen
Date: 04/06/17 21:51
Description: 線性鏈表之順序表
*/
/*
Chinese:順序(線性)表
English:SeqList
*/
#include<iostream>
using namespace std;

//順序表ADT
const int MAXSIZE = 100;
template<class T>
class SeqList{
public:
SeqList(); //無參構造函數
SeqList(T array[],int length); //有參構造函數
~SeqList() { cout<<"\n析構成功!\n"<<endl; }; //析構函數
bool insertElement(T data,int n); //按位置插入元素
T deleteElementByLocation(int n); //按位置刪除元素
int deleteElementByValue(T data); //按值刪除元素
int searchElement(T data); //按值搜索元素,返回位置
T searchElement(int n); //按位置搜索元素,返回值
void print(); //輸出表內元素
int getLength(); //獲取當前元素個數
public:
T array[MAXSIZE]; //存放元素的數組
int length; //元素個數
};

//無參構造函數
template<class T>
SeqList<T>::SeqList(){
length = 0;
for(int i=0;i<MAXSIZE;i++){
array[i] = 0;
}
}

//構造函數
template<class T>
SeqList<T>::SeqList(T array[],int length){
this->length = length;
for(int i=0;i<length;i++){
this->array[i] = array[i];
}

cout<<"\n初始化成功!\n"<<endl;
}

//按[實際]位置插入元素
//2 8 9 0 3 7
//0 1 2 3 4 5
// ↑
// (n-1)
//比如:插入在第3個位置上
//起始: (從後往前)
//array[length] = array[length-1] //array[length]:增加的1個新結點
//結束:
//array[n] = array[n-1];//array[n-1]:要重置新值的位置
template<class T>
bool SeqList<T>::insertElement(T data,int n){
//防溢出
if(n<1||n>length){
return false;
}

for(int i=length;i>n-1;i--){
array[i] = array[i-1];
}

array[n-1] = data;
length++;

return true;
}

//按[實際]位置刪除元素
//2 8 9 0 3 7
//0 1 2 3 4 5
// ↑
// (n-1)
//比如:插入在第3個位置上
//起始: (從前往後)
//array[n-1] = array[n] //array[n-1]:重置新值的位置
//結束:
//array[length-2] = array[length-1];//array[length-1]:要刪除掉的結點
template<class T>
T SeqList<T>::deleteElementByLocation(int n){
//邊界檢測
if(n<1||n>=length)
return (T)false;
T value = array[n-1];
for(int i=n-1;i<=length-2;i++){
array[i] = array[i+1];
}

//減少表長度
length--;
//恢復刪除掉的結點的默認值(0)
array[length] = 0;
return value;
}

//按值刪除結點,返回實際位置
template<class T>
int SeqList<T>::deleteElementByValue(T data){
array[length] = data;
int i;
for(i=0;array[i]!=data;i++);

if(i!=length){ //found success
deleteElementByLocation(i); //按值刪除
return i+1;
}else{ //found fail
//recover array[length]‘s default value(0)
array[length] = 0;
return -1;
}
}

//按值查找
//算法:順序查找
template<class T>
int SeqList<T>::searchElement(T data){
//array[length] as array‘s guard of border
T array[length] = data;
int i;
for(i=0;array[i]!=data;i++);

//recover array[length]‘s default value(0)
array[length] = 0;

return i==length?(i+1):(-1); //-1 : not found
}

//輸出表的長度
template<class T>
int SeqList<T>::getLength(){
return length;
}

//輸出數組元素
template<class T>
void SeqList<T>::print(){
for(int i=0;i<length;i++){
if(i%10==0){
cout<<endl;
}
cout<<array[i]<<‘\t‘;
}
cout<<"\n****************print end****************\n";
}

int main(){
//輸入數據
const int n = 10;
char arr[n];
for(int i=0;i<n;i++){
cin>>arr[i];
}

//測試
SeqList<char> test(arr,n);
cout<<"表所有元素:"<<endl;
test.print();
test.insertElement(‘f‘,3);
cout<<"在第3個位置上插入元素 f "<<endl;
test.print();
//按位置刪除結點
cout<<test.deleteElementByLocation(3)<<endl;
cout<<"刪除第三個位置的元素後:"<<endl;
test.print();
//獲取表長度
cout<<test.getLength();
return 0;
}

/*
Test Data:
1 0 9 8 6 5 4 3 2 7
*/

線性鏈表之順序表