1.已知A=(a1, a2,..., am)
B=(b1, b2,..., bn)
均为顺序表,编写一个比较A,B大小的算法。
答:
分析:
(1)算法的目标是分析两个表的大小,所以算法中不应当破坏原表。
(2)表的大小指的是“词典次序”,则不应当先比较两个表的长度。当一个表为另外一个表的子集序列时,表的长度大的表自然也大。
(3)算法的基本操作为:同步比较两个表中相应的数据元素。
假设:
int compare(SqList La, SqlList Lb)
主要操作:
if(La.elem[i] == Lb.elem[i]) i++;
else if(La.elem[i] < Lb.elem[i])
return -1;
else
return 1;
循环条件:
(i < La.Length) && (i < Lb.Length)
循环结束后的三种情况:
i > La.Length && i > Lb.Length
return 0;
i <= La.length && i > Lb.Length
return 1;
i > La.Length && i <= Lb.Length
return -1;
2.删除有序表中所有其值大于且小于的数据元素。
答:
分析:
删除的结点的特点:
具体代码:
while(p && p->data <= mink){
pre = p; p = p->next;
}
if(p){
while(p && p->data < maxk) p = p->next;/p/调整到第一个大于等于MAXK的结点
q = pre->next; pre->next = p;//q为第一个要删除的结点,并将最后一个小于等于MINK的结点与p连接
while(q != p){
s = q; q = q->next; free(s);
}
}
3.已知A,B和C三个有序链表,编写算法从A表中删除B表和C表中共有的数据元素。
分析:
被删除的元素的特点为:
其他元素则为:
//重点分析部分
设三个指针pa,pb,和pc分别指向这三个链表中的相应结点,则算法中的主要操作为:(三个指针均不空)
if(pa->data < pb->data){
pre = pa; pa = pa->next;
}else if(pb->data < pc->data) pb = pb->next;
else if(pc->data < pa->data) pc = pc->next;
else{//Delete
pre->next = pa->next; free(pa);
pa = pre->next;
}
//三个指针里有一个为空的时候就不满足题中要求,不用考虑。
4.双向循环列表的结点中,增加一个访问频度的数据域freq,编写算法实现LOCATE(L, x)。
分析:
1)算法的基本操作应该是在链表中进行搜索,直至p->data = x 为止。
2)在访问频度freq增1之后,需将该结点调整到适当位置。向前搜索直至找到一个访问频度大于它的结点为止。
代码:
p = L->next;//L为双向链表的头指针
while(p != L&& p->data != x){
p = p-next;//搜索元素值为X的结点
}
if(p == L) return NULL;//p返回到头结点,没有找到等于X的结点
q = p->priou;//q指向p的前驱
while(q != L && q->freq < p->freq){//向前搜索大于等于p频度的结点(一种为找到头结点,表示没有找到;一种为找到了)
q = q->priou;
}
//接下来删除结点*p
//将结点*p插入在结点*q之后,代码省略了,大家可以尝试写下,一起分享下。