已知一个带头结点单链表的结点类型nextNode定义为 struct nextNode{int data;int freq;struct nextNode*next;}; 其中,data为结点值域,freq为该结点元素的访问计数,初始为0;next

admin2017-11-20  30

问题 已知一个带头结点单链表的结点类型nextNode定义为
    struct nextNode{int data;int freq;struct nextNode*next;};
其中,data为结点值域,freq为该结点元素的访问计数,初始为0;next为指向链表中该结点后继结点的指针域,设该链表所有结点按照freq值从大到小链接。请实现一个时间和空间上尽可能高效率的算法,编写一个查找函数Search,从链表首结点开始查找结点data值与给定值相等的结点。如果找到,则将该结点的freq值加1,然后把它前移到与结点freq值相等的结点的后面,使得所有结点仍然都保持按照freq值从大到小链接。
根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。

选项

答案算法描述如下: boo1 selforganizationList(nextNode *f,int value,nextNode *&p); nextNode *pre,*q; p=f->next; q=pre=f; while(p!=NULL&&p->data!=value){ //出现次数改变的时候记录q if(pre!=f&&pre->freq>p->freq) q=pre; pre=p; p=p->next; } //找不到的时候返回 if(p==NULL) return false; p->freq++; pre->next=p->next; p->next=q->next; q->next=p; return true, };

解析
转载请注明原文地址:https://kaotiyun.com/show/JNRi777K
0

最新回复(0)