- 設計一個算法,通過一趟遍歷確定長度爲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
}
}
}
}