首页 > 试题广场 >

阅读下列函数说明和C代码,将应填进(n)处的字句写在答题纸的

[填空题]
 阅读下列函数说明和C代码,将应填进(n)处的字句写在答题纸的对应栏内。
【说明】设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向先驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0.每当在链表上进行一次L.Locate(x)操纵时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
【函数】
void Locate(int &x)
{
< 结点类型说明 >
*p = first->next;
while (p != first &&  1 ) p = p->next;
if (p != first)
{
2;
< 结点类型说明 >
*current = p;
current->prior->next = current->next;
current->next->prior = current->prior;
p = current->prior;
while (p != first && 3) p = p->prior;
current->next = 4;
current->prior = p;
p->next->prior = current;
p->next = 5;
}
else
printf(“Sorry. Not find!\n”);  \*没找到*\
}

推荐
这个系统有问题,明明是写对的,给判错了。分析一下:
首先要找到这个x值,所以在1的位置应该填入:p->data!=x
找到x以后,需要对该值对应的频率值加1,也就是应该在2的位置应该对p->freq进行加1操作
然后是进行排序,因为默认前面的是已经排好序的了,所以只要向前遍历找第一个大于当前被更改的freq的结点就行,所以在3的位置应该填入:current->freq > p->freq
接下来进行结点的交换:
在4填入:p->next
在5填入:current

编辑于 2015-09-02 09:01:51 回复(9)
心好累 根本看不懂
发表于 2015-11-26 13:09:54 回复(3)
系统判断有误,p->data != x(错) p->data!=x(对)   p->freq < current->freq(错) current->freq>p->freq(对)
其实这两个是一样的。
发表于 2015-07-31 10:05:40 回复(3)
明显全对,然后全给判错。。。。
发表于 2015-10-04 14:58:52 回复(2)
心累!!!

发表于 2017-07-06 15:04:26 回复(0)
答案判定有问题?
发表于 2017-03-06 20:09:42 回复(0)
发表于 2016-09-13 22:34:03 回复(2)
系统判定做的不好,自己对照一下答案就好;毕竟大家的编程风格不一样;
发表于 2015-09-03 17:19:09 回复(0)
1:p->data != x 2:p->freq++ 3:p->freq < current->freq 4:p->next 5:current
发表于 2014-11-05 23:21:36 回复(2)
正确答案有木有?
发表于 2014-11-05 08:59:12 回复(1)
牛客网的代码排版好垃圾,这题根本看不懂呀,缩进太乱了
发表于 2020-04-18 10:33:59 回复(0)
p->data != x 
p->freq +=1
current->frep>p->frep
p->next
current

发表于 2017-07-31 17:49:56 回复(0)
话说第一空,不用判断p==NULL的情况么?
发表于 2017-07-15 11:58:36 回复(0)
我觉得我是标准答案 :) 我注意格式了啊
发表于 2017-07-08 01:09:44 回复(0)
要是要查找的值在first中,会怎么样?直接输出 sorry not found  函数有问题啊

发表于 2017-06-15 09:27:42 回复(0)
//本人菜鸟,有理解错误求指出
void Locate(int &x)
{

*p = first->next;
while (p != first &&   p->data!=x ) p = p->next; //验证链表里是不是有x
if (p != first)   //只要不是第一个,频率++
{
   p->freq++ ;

  *current = p;
  current->prior->next = current->next;
  current->next->prior = current->prior; //把这个data是x的结构体取出,剩下的衔接上
  p = current->prior;
  while (p != first &&  current->freq>p->freq ) p = p->prior; //把这个结构体的频率 与 在此之前的结构体的频率 依次比较//直到频率不比前面多
  current->next = p->next ;    //在这个p处拆开链表,插入data是x的结构体
  current->prior = p;
  p->next->prior = current;
  p->next = current ;
}
else
printf(“Sorry. Not find!\n”);  \*没找到*\
}

发表于 2017-06-04 11:10:01 回复(0)

有毒,一模一样的给我盘错,我真是怕了这填空题了,希望尽快改正这些BUG

发表于 2017-05-12 11:42:16 回复(0)
excuse me???
发表于 2017-04-22 11:08:41 回复(2)
4、5、6的操作主要是将current节点插入在重新寻找的p节点之后,明白这一点就好操作了
发表于 2017-04-20 09:55:05 回复(0)
这题,我竟然全对了,只不过顺序不对。哈哈哈
发表于 2017-04-11 16:53:14 回复(0)
这是在逗我?
发表于 2017-04-10 14:22:38 回复(0)