順序表

順序表的特點:隨機存取,存儲密度大。以元素在計算機內“物理位置相鄰”來表示線性表中數據元素之間的邏輯關係;所謂隨機存取就是隻要確定了起始位置,線性表中的任一元素都可以隨機存取。

存取地址:假設順序表中的每個元素需要佔用L個存儲單元,線性表中第i個元素的存儲位置爲LOC(ai)=Loc(a1)+(i-1)xL.

算法分析:刪除與插入元素的平均時間複雜度都爲O(n)。


#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
#define MAXSIZE 100
class SqList
{
private:
int* data;
int length;
public:
SqList(){data=new int[MAXSIZE];length=0;};         //構造函數
~SqList();     //析構函數
int GetLength();    //獲取鏈表的長度
void CreateList();   //建立一個鏈表
bool Insert(int &e,int i);                                        //向鏈表第i位置插入元素e
bool Delete_1(int &e);  //刪除所有值爲e的元素
bool Delete_2(int i);  //刪除第i個元素
int Search(int e);//查找值爲e的元素,返回位置
bool Modify(int i,int &e);//修改第i個元素的值使其爲e
friend void Reverse(SqList &L);//轉置順序表中的元素
friend void Merge(SqList &L1,SqList &L2,SqList &L3);//二路合併
void Display();//打印鏈表中的元素
};
SqList::~SqList()
{
delete[] data;
}
int SqList::GetLength()
{
return length;
}
void SqList::CreateList()
{
length=0;
cout<<"輸入順序表的長度:";
int n;
cin>>n;
cout<<"輸入"<<n<<"個數據:";
for(int i=0;i<n;i++)
{
cin>>data[i];
length++;
}
}
bool SqList::Insert(int &e,int i)
{
if(length==MAXSIZE)return false;
if(i<0||i>length)return false;
for(int j=length;j>=i-1;j--)
{
data[j]=data[j-1];
}
data[i-1]=e;
length++;
return true;
}
bool SqList::Delete_1(int &e)
{
if(length==0)return false;
for(int i=0;i<length;)
{
if(data[i]==e)
{
for(int j=i;j<length;j++)
data[j]=data[j+1];
length--;
}
else 
{
i++;
}
}
return true;
}
bool SqList::Delete_2(int i)
{
if(length==0)return false;
if(i<1||i>length)return false;
for(;i<=length;i++)
{
   data[i-1]=data[i];
 length--;
}    
return true;
}
int SqList::Search(int e)
{
for(int i=0;i<length;i++)
{
if(data[i]==e)return i+1;
}
}
bool SqList::Modify(int i,int &e)
{
if(i<1||i>length)return false;
data[i-1]=e;
return true;
}
void Reverse(SqList &L)
{
for(int i=0;i<L.length/2;i++)
{
int tmp=L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]=tmp;
}
}
void Merge(SqList &L1,SqList &L2,SqList &L3)
{
int i,j,k=0;
for(i=0,j=0;i<L1.length&&j<L2.length;)
{
if(L1.data[i]<L2.data[j])
{
L3.data[k]=L1.data[i];
k++;i++;
}
else
{
L3.data[k]=L2.data[j];
k++;j++;
}
}
while(i<L1.length)
{
L3.data[k]=L1.data[i];
k++;i++;
}
while(j<L2.length)
{
L3.data[k]=L2.data[j];
k++;j++;
}
L3.length=k;
}
void SqList::Display()
{
cout<<"顯示順序表中的所有元素:"<<endl;
for(int i=0;i<length;i++)
cout<<data[i]<<" ";
cout<<endl;
}
int main()
{
SqList L;
string menu[11]={"1:顯示順序表的長度:",
"2:創建一個順序表:",
"3:顯示錶中的所有元素:",
"4:向表中插入數據:",
"5:刪除表中的特定值:",
"6:刪除表中特定位置的值:",
"7:修改表中的元素:",
"8:查找元素:",
"9:逆置順序表中的元素:",
"10:二路合併:",
"0:退出。"
};
for(int i=0;i<11;i++)
cout<<menu[i]<<endl;
int k;
while(1)
{
cout<<"輸入菜單選項:";
cin>>k;


switch(k)
{
case 0:exit(0);break;
case 1:
system("cls");
cout<<L.GetLength()<<endl;break;
case 2:system("cls");
L.CreateList();break;
case 3:system("cls");
L.Display();break;
case 4:system("cls");
int e,i;
cout<<"輸入需要插入的元素和位置:";
cin>>e>>i;
L.Insert(e,i);break;
case 5:system("cls");
cout<<"輸入需要刪除的元素:";
cin>>e;
L.Delete_1(e);break;
case 6:system("cls");
cout<<"輸入需要刪除元素的位置:";
cin>>i;
L.Delete_2(i);break;
case 7:system("cls");
cout<<"輸入需要修改的位置和修改後的值:";
cin>>i>>e;
L.Modify(i,e);break;
case 8:system("cls");
cout<<"輸入需要查找的值:";
cin>>e;
cout<<L.Search(e)<<endl;break;
case 9:system("cls");
Reverse(L);break;
case 10:system("cls");
SqList L1,L2;
cout<<"創建兩個表:"<<endl;
L.CreateList();L1.CreateList();
Merge(L,L1,L2);L2.Display();
}
for(int i=0;i<11;i++)
cout<<menu[i]<<endl;
}
return 0;
}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章