数据结构常见题(1)表

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之后,代码省略了,大家可以尝试写下,一起分享下。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值