c++模擬實現順序表
一、用物件導向的思想模擬實現動態順序表;
寫一個順序表類;該順序表類的成員變數為:_sz記錄順序表實際儲存的元素個數;_capacity記錄順序表的實際儲存容量;_data為一個動態陣列;儲存元素;
二、該順序表類的成員函式有
(1)類的預設成員數;
SeqList()//構造
SeqList(const SeqList& seqlist)//拷貝構造
SeqList& operator=(SeqList seqlist)//賦值運算子過載
~SeqList()//解構函式
(2)對順序表元素的操作函式;
void PushBack(const DataType& x)//尾插
void PopBack()//尾刪
void PushFront(const DataType& x)//頭插
void PopFront()//頭刪
void Insert(int pos,const DataType& x)//某一位置之前插入某個元素
int Find(const DataType& x)//查詢某一元素---二分查詢,返回元素的位置
void Remove(const DataType& x)//刪除第一個出現的元素
void RemoveAll(const DataType& x)//刪除所有出現的元素
void Sort()//排序---冒泡--升序
void CheakCapacity()//檢查並調整容量
三、程式碼實現:
//模擬實現順序表
#include<iostream>
using namespace std;
typedef int DataType;
class SeqList
{
friend ostream& operator<<(ostream& os,const SeqList& seqList);
public:
SeqList()//構造
:_capacity(0)
,_sz(0)
,_data(NULL)
{
cout<<"構造"<<endl;
}
SeqList(const SeqList& seqlist)//拷貝構造
:_capacity(seqlist._capacity)
,_sz(seqlist._sz)
,_data(new DataType[sizeof(DataType)*seqlist._sz])
{
cout<<"拷貝構造"<<endl;
memcpy(_data,seqlist._data,sizeof(DataType)*seqlist._sz);
}
SeqList& operator=(SeqList seqlist)//賦值運算子過載
{
cout<<"賦值運算子過載"<<endl;
std::swap(_data,seqlist._data);
_capacity=seqlist._capacity;
_sz=seqlist._sz;
return *this;
}
~SeqList()//解構函式
{
cout<<"析構"<<endl;
if (_data!=NULL)
{
delete[] _data;
}
_capacity=0;
_sz=0;
}
public:
void PushBack(const DataType& x)//尾插
{
CheakCapacity();
_data[_sz++]=x;
}
void PopBack()//尾刪
{
_sz--;
}
void PushFront(const DataType& x)//頭插
{
CheakCapacity();
for (int i=_sz;i>=1;i--)
{
_data[i]=_data[i-1];
}
_data[0]=x;
_sz++;
}
void PopFront()//頭刪
{
for (int i=0;i<_sz-1;i++)
{
_data[i]=_data[i+1];
}
_sz--;
}
void Insert(int pos,const DataType& x)//某一位置之前插入某個元素
{
CheakCapacity();
if (pos<0||pos>_sz)
{
return ;
}
for (int i=_sz;i>pos;i--)
{
_data[i]=_data[i-1];
}
_data[pos]=x;
_sz++;
}
int Find(const DataType& x)//查詢某一元素---二分查詢,返回元素的位置
{
Sort();//二分查詢的前提是資料已經排序好
int start=0;
int end=_sz-1;
int mid=0;
while (start<end)
{
mid=(start+end)/2;
if (x>_data[mid])
{
start=mid+1;
}
if (x<_data[mid])
{
end=mid-1;
}
if (x==_data[mid])
{
return mid;
}
}
return -1;
}
void Remove(const DataType& x)//刪除第一個出現的元素
{
if (_data==NULL)
{
printf("seqlist empty!");
}
int pos=0;
while(pos<_sz&&_data[pos++]!=x)//找元素
{}
pos-=1;//該元素的位置
if (_data[pos]==x)
{
if (pos==_sz-1)//處理元素為最後一個
{
PopBack();
}
for(int i=pos;i<_sz-1;i++)
{
_data[i]=_data[i+1];
}
_sz--;
}
}
void RemoveAll(const DataType& x)//刪除所有出現的元素
{
//(1),(5);(4);(3);(3);(2);(6);
if (_data==NULL)
{
printf("seqlist empty!");
}
int pos=0;
while (pos<_sz+1)
{
while(pos<=_sz&&_data[pos++]!=x)//找元素
{}
pos-=1;//該元素的位置
if (_data[pos]==x)
{
if (pos==_sz-1)//處理元素為最後一個
{
PopBack();
}
for(int i=pos;i<_sz-1;i++)
{
_data[i]=_data[i+1];
}
_sz--;
}
if (pos==_sz)
{
break;
}
}
}
void Sort()//排序---冒泡--升序
{
if (_data==NULL)
{
printf("seqlist empty!");
}
int mark=0;
for(int i=0;i<_sz-1;i++)//比較趟數
{
for (int j=0;j<_sz-i-1;j++)
{
if (_data[j]>_data[j+1])
{
mark=1;
DataType tmp=_data[j];
_data[j]=_data[j+1];
_data[j+1]=tmp;
}
}
if (mark=0)
{
break;
}
}
}
void Printf()
{
cout<<_capacity<<","<<_sz<<endl;
}
private:
void CheakCapacity()//檢查並調整容量
{
if (_sz>=_capacity)
{
_capacity+=5;
DataType* tmp=new DataType[_capacity];
memcpy(tmp,_data,sizeof(DataType)*_sz);
delete[] _data;
_data=tmp;
}
}
private:
int _capacity;
int _sz;
DataType* _data;
};
ostream& operator<<(ostream& os,const SeqList& seqList)
{
for (int i=0;i<seqList._sz;i++)
{
os<<seqList._data[i]<<" ";
}
return os;
}
void test()
{
SeqList s;
s.PushBack(1);
s.PushBack(5);
s.PushBack(4);
s.PushBack(5);
s.PushBack(2);
s.PushBack(6);
s.PushBack(3);
s.PushBack(3);
s.Printf();
cout<<"s "<<s<<endl;
cout<<"-----"<<endl;
SeqList s1(s);
s1.Printf();
cout<<"s1(s)"<<s1<<endl;
cout<<"-----"<<endl;
SeqList s2;
s2=s;
s2.Printf();
cout<<"s2=s "<<s2<<endl;
/*
//s.PopBack();
//s.PopBack();
//cout<<"尾刪兩個元素:"<<s<<endl;
//s.PushFront(7);
//s.PushFront(8);
//s.PushFront(9);
//cout<<"頭插三個元素:"<<s<<endl;
//s.PopFront();
//s.PopFront();
//cout<<"頭刪兩個元素:"<<s<<endl;
//s.Insert(3,99);
//cout<<"下標為3的位置插入99:"<<s<<endl;
/*s.Sort();*/
//cout<<s.Find(3)<<endl;
//cout<<s.Find(99)<<endl;
/*s.Remove(1);*/
//s.RemoveAll(3);
//cout<<s<<endl;
}
int main()
{
test();
return 0;
}
接下來是用物件導向的思想實現用c++語言實現單連結串列
相關文章
- 【資料結構】實現順序表(c++)資料結構C++
- Java實現順序表Java
- 順序表的實現
- DS順序表--類實現
- 線性表的順序儲存C++程式碼實現C++
- C語言實現順序表C語言
- 線性表的使用——順序實現
- 線性表-順序表C語言實現C語言
- 順序表實現二分排序排序
- 【資料結構】堆排序和模擬實現優先順序佇列!!資料結構排序佇列
- C++ 運算子優先順序表C++
- 資料結構實驗一:順序表的建立與操作實現、順序表實現約瑟夫環問題資料結構
- 【資料結構】順序棧的實現(c++)資料結構C++
- 順序表
- 【資料結構】順序佇列的實現(c++)資料結構佇列C++
- 順序表的基本方法實現C語言版C語言
- 【資料結構】實現順序表(c語言)資料結構C語言
- 順序表應用5:有序順序表歸併
- 順序表應用6:有序順序表查詢
- 實驗二:順序表的基本操作實現及其應用
- c++實現的模擬退火演算法C++演算法
- 靜態順序表和動態順序表 對比
- 順序棧的實現方式
- 資料結構:線性表的順序實現2.2資料結構
- 線性表的順序儲存C++程式碼C++
- 第2章 順序表及其順序儲存
- C++進階(map+set容器模擬實現)C++
- C++ 實現銀行排隊服務模擬C++
- 資料結構c語言實現順序表基本操作資料結構C語言
- PHP實現簡單順序棧PHP
- C++順序容器講解C++
- C++進階(unordered_set+unordered_map模擬實現)C++
- 資料結構_順序表_順序表的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 具體實現程式碼@資料結構探險——順序表資料結構
- 順序表的堆排序排序
- 順序表的學習
- RMAN database plus archivelog實現順序DatabaseHive
- 使用C#實現順序佇列C#佇列