1、设以带头结点的双向循环链表表示的线性表L=(a1,a2,…,an),试写一算法,将L改造为L=(a1,a3,…,an…,a4,a2)。
void Exchange_DLinkList(DLinkList &L){
DLinkList p,q,tail;
int count=0; //count记录数组下标;当数组下标为偶数时,当前结点移动到an后
p=L->next;
tail=L->prior; //tail指向表尾结点an
while(p!=tail){
count++;
if(count%2==0){ //count是偶数
q=p; //q指向p所指结点
p=p->next; //p后移
q->prior->next=q->next; //q的前驱结点的next指针指向q的后继
q->next->prior=q->prior; //q的后继结点的prior指针指向q的前驱 (也就是将ai删除)
q->next=tail->next; // 将ai插入到an后
tail->next->prior=q;
q->prior=tail;
tail->next=q;
}
else //count不是偶数,p继续向后移
p=p->next;
}
}
2、设计判断单链表中结点是否关于中心对称算法。
bool D(LinkList &L){
char a[MaxSize]; //定义数组存放链表中元素
int len=0,i,j;
LinkList p=L->next;
while(p){
a[len++]=p->data;
p=p->next;
}
for(i=0,j=len-1;i<j;i++,j--){ //比较对称位置结点值是否相等,不相等则报错
if(a[i]!=a[j])
return 0;
}
return 1; //全部相等,关于中心对称
}
3、设计一个求结点x在二叉树中的双亲结点算法。
//利用先序遍历非递归算法寻找x的双亲结点 (递归不是很会)
Btree Find_Parent(BTree T,BTree x){
BTree p=T;
SeqStack S;
S=Init_SeqStack();
while(p||!Empty_Stack(S)){
if(p){ //p不为空检测是否是x的双亲结点
if(p->lchild==x||p->rchild==x)
return p;
Push_SeqStack(S,p); //不是双亲结点则进栈
p=p->lchild; //访问左子树
}
else{
Pop_SeqStack(S,&p);
p=p->rchild; //访问右子树
}
}
}
4、试写一算法,判断以邻接表方式存储的有向图中是否存在由顶点Vi到顶点Vj的路径
//基于广度优先遍历算法实现
int Exist_Path(ALGraph G,int i,int j){
EdgeNode *P;
int w;
PSeqQueue Q;
Q=Init_SeqQueue(); //初始化队列Q
visited[i]=true; //访问标志置为true
In_SeqQueue(Q,i); //i入队列
while(!Empty_SeqQueue(Q)){ //如果Q不为空,循环
Out_SeqQueue(Q,&i); //队头元素出队
for(p=G->adjlist[i].firstedge;p;p=p->next){ //检查所以i的邻接点
w=p->adjvertex; //w为边结点p对应的顶点域(边结点p对应的顶点下标)
if(w==j) return 1; //已找到vj
if(!visited[w]) { //w!=j,检查是否访问过,未访问则访问标志置为true,且入队列
visited[w]=true;
In_SeqQueue(Q,w);
}
}
}
return 0;
}
5、试写一算法,知L1、L2分别为两循环单链表的头结点指针,m,n分别为L1、L2表中数据结点个数。要求设计一算法将两表合并成一个带头结点的循环单链表。
void HB(LinkList &L1,int m,LinkList &L2,int n){
LinkList r1=L1->next;
LinkList r2=L2->next;
int i;
for(i=1;i<m;i++) //r1移动到L1的尾部结点
r1=r1->next;
for(i=1;i<n;i++) //r2移动到L2的尾部结点
r2=r2->next;
r1->next=L2->next; //r1的next指针指向L2的第一个结点
r2->next=L1; //r2的next指针指向L1的头结点
free(L2);
}