试设计一个实现下述要求的Locate运算的函数。设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate(L,x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

区块链毕设网qklbishe.com为您提供问题的解答

试设计一个实现下述要求的Locate运算的函数。设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate(L,x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

typedef struct OneNode{   int x;   int freq;   struct OneNode *rlink;   struct OneNode *llink; } Node,*LinkList;  void initCircleLinkList(LinkList *linkList){     *linkList=(Node *)malloc(sizeof(Node));     (*linkList)->rlink=(*linkList);     (*linkList)->llink=(*linkList);     (*linkList)->x=-1;     (*linkList)->freq=-1; }  /**  * 尾插法  * @param linkList  * @param x  */ void insertTailCirCleData(LinkList linkList,int x){     Node *headNode=linkList;     Node *node= (Node *)malloc(sizeof(Node));     node->freq=0;     node->x=x;      Node *tailNode=headNode->llink;     node->llink=tailNode;     node->rlink=headNode;     headNode->llink=node;     tailNode->rlink=node; }  /**  * 头插法  * @param linkList  * @param x  */ void insertHeadCirCleData(LinkList linkList,int x){     Node *headNode=linkList;     Node *node= (Node *)malloc(sizeof(Node));     node->freq=0;     node->x=x;     //链表连接     Node *nextNode=headNode->rlink;     node->rlink=nextNode;     node->llink=headNode;     nextNode->llink=node;     headNode->rlink=node; }   void printCirCleData(LinkList linkList){     Node *node=linkList->rlink;     while (node!=linkList){         printf("x->%d fre->%dn",node->x,node->freq);         node=node->rlink;     } }  void Locate(LinkList linkList,int x){     Node *node=linkList->rlink;     //空链表不处理     if(node==linkList){         return;     }     while (node!=linkList) {         if(node->x==x){             node->freq=node->freq+1;             break;         }         node=node->rlink;     }     //重新排序     Node *current=node;     node=node->llink;     while (node!=linkList){         //交换两个结点位置         if(node->freq<current->freq){             Node *nextNode=current->rlink;             Node *preNode=node->llink;              preNode->rlink=current;             current->llink=preNode;              node->rlink=nextNode;             nextNode->llink=node;              node->llink=current;             current->rlink=node;              node=preNode;         } else {             node=node->llink;         }     } }  int main(){     //头结点不使用     LinkList linkList;     initCircleLinkList(&linkList);     for (int i = 0; i < 5; ++i) {         //头插法         insertTailCirCleData(linkList,i);         //尾插法 //        insertHeadCirCleData(linkList,i);     }      printf("old:n");     printCirCleData(linkList);     Locate(linkList,3);     Locate(linkList,3);     Locate(linkList,2);     Locate(linkList,2);     Locate(linkList,2);     Locate(linkList,2);     Locate(linkList,0);     Locate(linkList,0);     Locate(linkList,4);     Locate(linkList,4);     Locate(linkList,4);     printf("new:n");     printCirCleData(linkList); }

运行结果
试设计一个实现下述要求的Locate运算的函数。设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate(L,x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

24:00

以上就是关于问题试设计一个实现下述要求的Locate运算的函数。设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate(L,x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。的答案

欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。

区块链NFT链游项目方科学家脚本开发培训

从业7年-专注一级市场


微信:btc9767
TELEGRAM :https://t.me/btcok9

具体资料介绍

web3的一级市场千万收益的逻辑


进群点我



qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台-javagopython毕设 » 试设计一个实现下述要求的Locate运算的函数。设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate(L,x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。