數據結構期末算法複習

  1. 設計一個算法,通過一趟遍歷確定長度爲n的單鏈表中值最大的結點。
int MaxElem(LinkList &L)  
{  
    LNode *p = L->next;  
    int maxElem = p->data;  

    while(p != NULL)  
    {  
        if(p->data > maxElem)  
        	maxElem = p->data;  
        p = p->next;  
    } 
    return maxElem;
}

  1. 設計一個算法,將鏈表中所有結點的鏈表方向“原地”逆轉,即要求僅利用原表的存儲空間,換句話說,要求算法的空間複雜度爲O(1)。
//利用前插法
void Inverse(LinkList &L)
{
	LinkList p,q;
	p = L->next;
	L->next = NULL;
	while(p != NULL)
	{
		q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
	}
}
  1. 已知長度爲n的線性表A採用順序存儲結構,請寫一個時間複雜度爲O(n)、空間複雜度爲O(1)的算法,該算法可刪除線性表中所有值爲item的數據元素。
void DeleteList(SqList &L,ElemType item)
{
	int j=0;
	for(int i=0;i<L.length;i++)
	{
		if(L.elem[i] != item)
		{
			L.elem[j] = L.elem[i];
			j++;
		}
	}
	L.length = j;
}
  1. 迴文是指正讀反讀均相同的字符序列,如“abba”和“abdba”均是迴文,但“good”不是迴文。試寫一個算法判定給定的字符序列是否是迴文。(提示:將一半的字符入棧)

具體算法請看:https://blog.csdn.net/weixin_43790779/article/details/105311772

  1. 假設以帶頭結點的循環鏈表表示隊列,並且只設一個指針指向隊尾元素結點(注意不設頭指針),試編寫相應的置空隊列、判斷隊列是否爲空、入隊和出隊等算法。

具體算法請看:https://blog.csdn.net/weixin_43790779/article/details/105311881

  1. 假設一個數組Q[m]存放循環隊列的元素。同時設置一個標誌tag,以tag==0或tag==1來區別隊頭指針和隊尾指針值相等時,隊列的狀態是“空”還是“滿”。試編寫相應的入隊和出隊的算法。
//隊列初始化
void InitQueue(SqQueue &Q)
{
	Q.front = 0;
	Q.rear = 0;
	Q.tag = 0;
}

//入隊
void EnQueue(SqQueue &Q,QElemType e)
{
	if(Q.tag == 1 && Q.rear == Q.front)
		return ERROR;
	else
	{
		Q.base[Q.rear] = e;
		Q.rear = (Q.rear + 1) % MAXSIZE;
	}
}

//出隊
void DeQueue(SqQueue &Q,QElemType e)
{
	if(Q.tag == 0 && Q.rear == Q.front)
		return ERROR;
	else
	{
		e = Q.base[Q.front];
		Q.front = (Q.front+1)%MAXSIZE;
	}
}


  1. 設任意n個整數存放於數組A(1:n)中,試編寫算法,將所有正數排在所有負數前面(要求算法複雜性爲O(n))。
void Arrange(int A[],int n) 
//n個整數存於數組A中,本算法將數組中所有正數排在所有負數的前面
{
	int i=0,j=n-1,x; //用類C編寫,數組下標從0開始
	while(i<j)
	{
		while(i<j && A[i]>0)  i++;
		while(i<j && A[j]<0)  j--;
		if(i<j) 
		{
			x=A[i];
            A[i++]=A[j]; 
            A[j--]=x; 
        }//交換A[i] 與A[j]
	}
}//算法Arrange結束.

  1. 交換二叉樹的每個結點的左孩子和右孩子。
void ChangeLR(BiTree &T){  
	BiTree temp;  
	if(T->lchild==NULL&&T->rchild==NULL)    
		return;  
	else{  
		temp = T->lchild;  
		T->lchild = T->rchild;  
		T->rchild = temp;  
	}  
	ChangeLR(T->lchild);  
	ChangeLR(T->rchild);   
} 

  1. 按層次順序遍歷二叉樹的方法,統計樹中度爲1的結點數目。
int isEmpty(BiTree bt) {  
	int num=0;   
	if(bt){  
		QueueInit(Q);         //初始化隊列  
		Push(Q,bt);             
		while(!QueueEmpty(Q)){  
			p = Pop(Q);   
			cout << p->data;   
			if(p->lchild && !p->rchild ||!p->lchild && p->rchild) num++;  
			if(p->lchild) Push(Q,p->lchild);   
			if(p->rchild) Pop(Q,p->rchild);   
		}  
	}  
	return(num);  
} 

  1. 深度優先遍歷圖的非遞歸過程。
Void DFSn(Graph G,int v)  
{   
	Stack S;  
	InitStack(S);  
	Push(S,v);  
	While(!StackEmpty(S))  
	{   
		Pop(S,p);  
		If(!visited[p]){   
			visited[p] = TRUE;  
			cout << p;  
			w = G.vertices[p].firstarc;  
			while(w!=NULL){  
				if(!visited[w]&&w!=GetTop(s))   
					Push(s,w);    
				w = w->nextarc  
			}    
		}  
	}  
}  

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