准備數據
#define MAXLEN 100 //定義順序表的最大長度
struct DATA
{
char key[10]; //結點的關鍵字
char name[20];
int age;
};
struct SLType //定義順序表結構
{
DATA ListData[MAXLEN+1];//保存順序表的結構數組
int ListLen; //順序表已存結點的數量
};
定義了順序表的最大長度MAXLEN、順序表數據元素的類型DATA以及順序表的數據結構SLType。
在數據結構SLType中,Listen為順序表已存結點的數量,也就是當前順序表的長度,ListData是一個結構數組,用來存放各個數據結點。
我們認為該順序表是一個班級學生的記錄。其中,key為學號,name為學生的名稱,age為年齡。
因為數組都是從下標0開始的,為了使用方便,我們從下標1開始記錄數據結點,下標0的位置不可用。
初始化順序表
在使用順序表之前,首先創建一個空的順序表,也就是初始化順序表。這裡,在程序中只需設置順序表的結點數量ListLen為0即可。這樣,後面需要添加的數據元素將從順序表的第一個位置存儲。
示例代碼:
void SLInit(SLType * SL) //初始化順序表
{
SL->Listlen=0;
}
計算線性表的長度
計算線性表的長度也就是計算線性表中結點的個數,由於我們在SLType中定義了ListLen來表示結點的數量,所以我們只需要獲得這個變量的值即可。
int SLLenght(SLType *SL)
{
return(SL->ListLen); //返回順序表的元素數量
}
插入結點
插入節點就是在線性表L的第i個位置上插入一個新的結點,使其後的結點編號依次加1。
這時,插入一個新節點之後,線性表L的長度將變為n+1。插入結點操作的難點在於隨後的每個結點數據都要向後移動,計算機比較大,示例代碼如下:
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->ListLen>=MAXLEN) //順序表結點數量已超過最大數量
{
cout<<"順序表已滿,不能插入結點!"<<endl;
return 0; //返回0表示插入不成功
}
if(n<1||n>SL->ListLen) //插入結點的序號不合法
{
cout<<"插入序號錯誤!"<<endl;
return 0;
}
for(i=SL->ListLen;i>=n;i--) //將順序表中的數據向後移動
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
SL->ListLen++;
return 1;
}
在程序中首先判斷順序表結點數量時候已超過最大數量,以及插入點的序號是否正確。前面條件都瞞住以後,便將順序表中的數據向後移動,同時插入結點,並更新結點數量ListLen。
追加結點
追加結點就是在順序表的尾部插入結點,因此不必進行大量數據的移動,代碼實現與插入結點相比就要簡單的多。
int SLAdd(SLType * SL,DATA data)
{
if(SL->ListLen>=MAXLEN)
{
cout<<"順序表已滿,不能再添加結點了!"<<endl;
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}