文章目錄
本文章代碼全爲僞代碼
線性表
線性表包含順序表和鏈表,鏈表包含單鏈表、循環鏈表、雙向鏈表
已知一個長度爲n的順序存儲的線性表,試寫一算法將該線性表逆置
思路:a,b值互換,需要一箇中間變量x,x=a,a=b,b=x
SeqList Converts(SeqList L)
{
DataType x; //模糊定義一個x數據類型變量,用來存儲逆序時的值
int i,k; //i爲順序表的下標,k爲順序表長度的一半
k=L.length/2;
for(i=0;i<k;i++){
L.data[i]=L.data[L.length-i-1]
L.data[L.length-i-1]=x;
}
return L;
}
假設有兩個線性表LA和LB分別表示兩個集合A和B,現要求一個新的集合A=A∪B(集合的並)
思路:在LB中循環得出值x,判斷x是否在LA中,不存在則添加到LA中
void union(Linner_List LA,Linner_List LB)
{
n=ListLength(LA);
int i; //i爲LB的下標
DataType x; //模糊定義x的數據類型
for(i=0;i<=List;i++){
x=GetNode(LB,i); //獲取線性表LB中下標爲i的值
if(LocateNode(LA,x)==0) //獲取x值在LA中的位置,若爲0表示不存在
InsertList(LA,++n,x); //在LA的N+1位置插入x
}
}
刪除線性表L中重複的元素
思路:從表L的第一個元素(i=1)開始,逐個檢查i位置後的任意一位j,若兩值相同,則從L表中移除,直到L表的最後一位爲止。
void purge(Linera_List L)
{
int i,j;
DataType x,y;
i=1;
while(i<=ListLength(L)){ //注意,此處L表的長度只能動態獲取,不能提前獲取
x=GetNode(L,i);
j=i+1;
// 逐個判斷i後每位值是否與i相同
while(j<=ListLength(L)){ //注意,此處L表的長度只能動態獲取,不能提前獲取
y=GetNode(L,j);
if(x==y){
DeleteList(L,j);}
else
j++;
}
}
}
順序表的插入運算
註釋:
結構體成員的引用
- 箭頭(->):左邊必須爲指針
- 點(.):左邊必須爲實體
// L爲結構體的指針,i爲在第i個位置之前插入元素,x爲插入的元素
void InsertList(SeqList *L, int i, DataType x)
{
int j; // 表L最後一個元素索引位
//判斷插入位置是否小於1或者大於最後一位+1
if(i<1 || i>L->length+1){
printf("position error")
return;
}
// 判斷表是否已滿
if(L->length>=ListSize){
printf("overflow")
return;
}
for(j=L->length-1;j>=i-1;j--){
L->data[j+1]=L-data[j]; //將i位之後元素,逐一後移
}
L->data[i-1]=x; //將x插入第i位
L->Length++; //列表長度+1
}
順序表的刪除運算
//L爲結構體指針,i爲刪除i位置的元素
viod DeleteList(SeqList *L, int i){
int j; //j爲刪除元素的下標
DataType x; //定義需要刪除的元素
if(i<1 || i>L-Length){
printf("position error");
return;
}
// 從第i位後元素開始,依次加前移
for(j=i-1;j<=L->Length-1;j++){
L->data[j]=L->data[j+1];
}
L->Length--;
return x;
}