線性表的順序儲存及運算實現

 

////////////////////////////////////////////////////////////////////////////////
//線性表的順序儲存及運算實現-------------順序表

#include <iostream>
//#include <stdlib>

using namespace std;

#define MAXSIZE 100
#define N 30
#define M 40

//若是其他的數據類型,直接修改這裏就可以了
typedef int DataType ;

/////////////////////////////////////////////////////////////////////////////////
//順序表的定義
typedef struct node
{
DataType data[MAXSIZE];
int length; //順序表最後一個單元,表示數據長度
} SeqList ;

//定義指針,實現信息的回送
typedef SeqList* PSeqList;

/////////////////////////////////////////////////////////////////////////////////
//順序表基本運算的實現
//--------------------------------------------------------------------------------
//順序表的初始化
PSeqList Init_SeqList()
{
//返回一個指向順序表的指針,指針爲NULL表示分配空間失敗
PSeqList SeqListPoint=new SeqList;
//若分配成功,設置空表,否則返回NULL
if(SeqListPoint)
{
SeqListPoint->length=0;
return SeqListPoint;
}
else 
{
cout<<"分配空間失敗!"<<endl;
return NULL;
}
}

PSeqList Init_SeqList(DataType dataArray[],int dataArraySize)
{
//返回一個指向順序表的指針,指針爲NULL表示分配空間失敗
PSeqList SeqListPoint=new SeqList;
//若分配成功,設置空表,否則返回NULL
if(SeqListPoint)
{
if(dataArraySize>MAXSIZE)
{
cout<<"填充順序表數據大於最大存放數據,無法完成填充!"<<endl;
return NULL;
}
for(int i=0;i<dataArraySize;i++)
{
SeqListPoint->data[i]=dataArray[i];
}
SeqListPoint->length=dataArraySize;
return SeqListPoint;
}
else 
{
cout<<"分配空間失敗!"<<endl;
return NULL;
}
}

//順序表的銷燬
bool Destory_SeqList(PSeqList* SeqListPoint)
{
//要銷燬順序表指針的地址,無返回值
if(*SeqListPoint)
{
delete(*SeqListPoint);
//*SeqListPoint=NULL;
return true;
}
else
return false;
}

//求順序表的長度
int Length_SeqList(PSeqList SeqListPoint)
{
//入口參數:順序表指針,返回表長,-1表示表不存在
if(SeqListPoint)
{
return (SeqListPoint->length);
}
else 
{
cout<<"表不存在!"<<endl;
return -1;
}

}


//輸出順序表數據元素
void PrintData_SeqList(PSeqList SeqListPoint)
{
//入口參數:順序表指針
if(!SeqListPoint)
{
cout<<"表不存在!"<<endl;
return ;
}
if(SeqListPoint->length==0)
{
cout<<"表中無元素!"<<endl;
return ;
}
for(int i=0;i<SeqListPoint->length;i++)
{
cout<<SeqListPoint->data[i]<<" ";
}
cout<<endl;
return ;
}




//順序表的檢索(查找)操作
int Location_SeqList(PSeqList SeqListPoint ,DataType dataX)
{
//入口參數:要查找的順序表指針,檢索的數據,返回值:-1(表不存在),0(失敗)
int i;
if(!SeqListPoint)
{
cout<<"表不存在!"<<endl;
return -1;
}
else
{
for(i=0;i<SeqListPoint->length;i++)
{
if(SeqListPoint->data[i]==dataX)
{
return (i+1);
}
}
if(i==SeqListPoint->length)
{
cout<<"查找失敗!"<<endl;

}
return 0;
}

}

//順序表的插入操作
int InsertData_SeqList(PSeqList SeqListPoint,int i , DataType dataX)
{
//入口參數:順序表指針,插入位置,插入的元素。返回標誌1成功,0插入位置不合法,-1溢出,-2表示表不存在
if(!SeqListPoint)
{
cout<<"表不存在"<<endl;
return -2;
}
if( i<=0 || i >MAXSIZE)
{
cout<<"插入位置不合法!"<<endl;
return 0;
}

for(int j=SeqListPoint->length-1;j>=i-1;j--)
{
SeqListPoint->data[j+1]=SeqListPoint->data[j]; // 注意:一定不能是j++,而必須是j+1
}
SeqListPoint->data[i-1]=dataX;
SeqListPoint->length++;

if(SeqListPoint->length>MAXSIZE)
{
cout<<"表滿,溢出!"<<endl;
return -1;
}
return 1;
}

//順序表的刪除運算
int Del_SeqList(PSeqList SeqListPoint,int i)
{
//入口參數:順序表指針,刪除元素的位置。返回參數:1成功,0刪除位置不合法,-1表不存在
if(!SeqListPoint)
{
cout<<"表不存在!"<<endl;
return -1;
}
if(i<0||i>SeqListPoint->length)
{
cout<<"刪除位置不合法!"<<endl;
return 0;
}
for(int j=i-1;j<=SeqListPoint->length-1;j++)
{
SeqListPoint->data[j]=SeqListPoint->data[j+1]; // 注意:一定不能是j++,而必須是j+1
}
SeqListPoint->length--;
return 1;
}

//對順序表數據元素降序排列
int SortDec_SeqList(PSeqList SeqListPoint)
{
//入口參數:順序表指針,成功返回1,表不存在返回-1。
if(!SeqListPoint)
{
cout<<"表不存在!"<<endl;
return -1;
}

//用選擇法排序
for(int i=0;i<SeqListPoint->length-1;i++)
{
DataType Temp;
DataType MAX=SeqListPoint->data[i];
int iMAX=i;

for(int j=i+1;j<SeqListPoint->length;j++)
{
if(SeqListPoint->data[j]>MAX)
{
MAX=SeqListPoint->data[j];
iMAX=j;
}
}
Temp=SeqListPoint->data[iMAX];
SeqListPoint->data[iMAX]=SeqListPoint->data[i];
SeqListPoint->data[i]=Temp;
}
return 1;
}

//對順序表數據元素升序排列
int SortInc_SeqList(PSeqList SeqListPoint)
{
//入口參數:順序表指針,成功返回1,表不存在返回-1。
if(!SeqListPoint)
{
cout<<"表不存在!"<<endl;
return -1;
}

//用選擇法排序
for(int i=0;i<SeqListPoint->length-1;i++)
{
DataType Temp;
DataType MIN=SeqListPoint->data[i];
int iMIN=i;

for(int j=i+1;j<SeqListPoint->length;j++)
{
if(SeqListPoint->data[j]<MIN)
{
MIN=SeqListPoint->data[j];
iMIN=j;
}
}
Temp=SeqListPoint->data[iMIN];
SeqListPoint->data[iMIN]=SeqListPoint->data[i];
SeqListPoint->data[i]=Temp;
}
return 1;
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//順序表應用舉例
//-------------------------------------------------------------------------------------------

// 1、 將一線性表逆置,有一線性表的順序表示(a1,a2,a3,.....an),設計一算法將該線性表逆置爲逆線性表(an,an-1,....a3,a2,a1),要求用
// 最小輔助空間
int Reverse_SeqList(PSeqList SeqListPoint)
{
//入口參數:一順序表指針。返回值:1成功,-1表不存在,0爲空表
if(!SeqListPoint)
{
cout<<"表不存在!"<<endl;
return -1;
}
if(SeqListPoint->length==0)
{
cout<<"爲空表!"<<endl;
return 0;
}
for(int i=0;i<=(SeqListPoint->length/2);i++) //注意不是length+1/2;
{
DataType Temp;
Temp=SeqListPoint->data[i];
SeqListPoint->data[i]=SeqListPoint->data[SeqListPoint->length-1-i]; //注意是length-1-i
SeqListPoint->data[SeqListPoint->length-i-1]=Temp;
}
return 1;
}

// 2. 有順序表A和B,其元素均按從小到大升序排列,編寫一算法將他們合併成一個表C,要求C的元素也是從小到大排列
int Merge_SeqList(PSeqList SeqListPointA,PSeqList SeqListPointB,PSeqList SeqListPointC)
{
//入口參數:順序表A,B,C指針。返回值,-1A或B表不存在,-2C溢出,1成功
//算法思想:依次掃描AB,並比較它們的大小,將他們較小值賦值給C
if(!SeqListPointA || !SeqListPointB)
{
cout<<"A或B表不存在!"<<endl;
return -1;
}
if(SeqListPointA->length+SeqListPointB->length>MAXSIZE)
{
cout<<"溢出!"<<endl;
return -2;
}
SortInc_SeqList(SeqListPointA);
SortInc_SeqList(SeqListPointB); //應想對他們進行升序排列
int i=0,j=0,k=0;
//循環比較
while(i<=SeqListPointA->length-1&&j<=SeqListPointB->length-1)
{
if(SeqListPointA->data[i] < SeqListPointB->data[j])
{
SeqListPointC->data[k++]=SeqListPointA->data[i++];
}
else
{
SeqListPointC->data[k++]=SeqListPointB->data[j++];
}
}
//將餘下的部分直接賦值給表C
while(i<SeqListPointA->length)
{
SeqListPointC->data[k++]=SeqListPointA->data[i++];
}
while(j<SeqListPointB->length)
{
SeqListPointC->data[k++]=SeqListPointB->data[j++];
}
//k的值即爲表長
SeqListPointC->length=k;
return 1;
}


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