- 设计一个算法,通过一趟遍历确定长度为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;
}
- 设计一个算法,将链表中所有结点的链表方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为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;
}
}
- 已知长度为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;
}
- 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符序列是否是回文。(提示:将一半的字符入栈)
具体算法请看:https://blog.csdn.net/weixin_43790779/article/details/105311772
- 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的置空队列、判断队列是否为空、入队和出队等算法。
具体算法请看:https://blog.csdn.net/weixin_43790779/article/details/105311881
- 假设一个数组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;
}
}
- 设任意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结束.
- 交换二叉树的每个结点的左孩子和右孩子。
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的结点数目。
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);
}
- 深度优先遍历图的非递归过程。
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
}
}
}
}