自考本科-算法設計題(持續更新)


本文章代碼全爲僞代碼

線性表

線性表包含順序表和鏈表,鏈表包含單鏈表、循環鏈表、雙向鏈表

已知一個長度爲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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章