1、设L为带头结点的单链表,单链表L元素递增有序,编写算法,删除表L中值相同的多余元素。
bool Delete_sort(LinkList *L){
LinkList p,q,temp;
p=L->next; //注意单链表带头结点
if(p==NULL) return 0; //空表
q=p->next; //q指向p的后继
while(q){
if(p->data!=q->data){ //p->data,q->data!!!!!!!!!
p=q;
q=q->next;
}
else{ //若相等则删除
temp=q;
q=q->next;
p->next=q;
free(temp);
}
}
retrun 1;
}
2.设二叉树的存储结构为二叉链表,试写出算法,求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
int depth(BTree T,DataType a[],int *MaxLen,DataType b[],int *CurrentLen){ //**!!!!!!!!!!!!!
//MaxLen,CurrentLen初始值为0
if(T==NULL){ //到达叶子结点
if(CurrentLen>MaxLen){ //当前路径为最长路径
for(int i=0;i<CurrentLen;i++){ //更新最长路径
a[i]=b[i];
}
MaxLen=CurrentLen; //改变最长路径长度
}
}
else{
b[CurrentLen++]=T->data; //把当前结点放到当前数组中
depth(T->lchild,a,&MaxLen,b,&CurrentLen) //&&!!!!!!!!!!!!!!
depth(T->rchild,a,&MaxLen,b,&CurrentLen)
--CurrentLen;
}
}
3、写一算法判别有向图(采用邻接表为存储结构)中是否存在有向环,当有向环存在时,输出构成环的顶点。
//boolean visited[MaxVertexNum]; //访问数组visited[]全局变量
void IsCircle(ALGraph *G){
int count=0,j,i; //count记录已被访问顶点数
SeqStack s;
EdgeNode *p;
s=Init_SeqStack(); //初始化栈保存入度为零的顶点
/*
更细致写法把indegree[]数组和visited[]初始化写出来
int indegree[MaxVertexNum];
for(i=0;i<vexnum;i++){ //初始化入度数组与访问标志数组
indegree[i]=0;
visited[i]=false;
}
for(i=0;i<vexnum;i++){
for(p=G->adjlist[i]->firstedge;p!=NULL;p=p->next)
indegree[p->adjvertex]++;
}
*/
for(i=0;i<G->vexnum;i++){
if(indegree[i]==0) //indegree[]数组表示当前顶点入度
Push_SeqStack(s,i); //度为零的顶点入栈
}
while(!Empty_SeqStack(s)){
Pop_SeqStack(s,&i); //弹出栈顶元素
visited[i]=true; //访问数组visited[]为true标志当前顶点已被访问
count++; //记录当前访问的顶点数
for(p=G->adjlist[i]->firstedge;p!=NULL;p=p->next){ //扫描以vi为弧尾的边
j=p->adjvertex; //j为边结点所对应的顶点号
indegree[j]--; //vj入度减一
if(indegree[j]==0){ //若vj入度为零,进栈
Push_SeqStack(G,j);
}
}
}
if(count<G->vexnum){ //已访问的顶点数小于总顶点数,一定存在环
printf("图中存在环路");
for(i=0;i<vexnum;i++){
if(visited[i]==false){
printf("%c",G->adjlist[i]->data); //输出未被访问的顶点
}
}
}
else printf("图中不存在环路");
}
4、试编写一算法,在给定的二叉排序树上, 找出任意两个不同结点最近的公共祖先(若在两结点A,B中,A是B的祖先,则认为A,B最近的公共祖先就是A)。
BSTree Search_ancestor(BSTree bst,BSTree a,BSTree b){ //在二叉排序树 bst中查找结点a和结点b的公共祖先
BSTree p=bst;
while(1){
if((p->data>a->data)&&(p->data>b->data)){ //p太大,往左子树找,左子树更小
p=p->lchild;
}
else if((p->data<a->data)&&(p->data<b->data)){ //p太小,往右子树找,右子树更大
p=p->rchild;
}
else return p; //p就是最近公共祖先
}
}