数据结构期末算法复习

  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  
			}    
		}  
	}  
}  

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