双链表按访问频度域freq的值的递减序排列
来源:互联网 发布:统计学 软件 编辑:程序博客网 时间:2024/06/10 15:01
问题及代码:
/**Copyright (c)2016,烟台大学计算机与控制工程学院*All rights reserved.*文件名称:table.cpp*作 者:单昕昕*完成日期:2016年3月23日*版 本 号:v1.0**问题描述:设有一个双链表,每个结点中除有piror,data,next三个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零.每当进行LocateNode(h,x)运算时,令元素值为x的结点中freq域的值加1,并调整表中结点的次序,使其按访问频度的递减序排列,以便使频繁访问的结点总是靠近表头。试写一符合上述要求的LocateNode运算的算法。*程序输入:无。*程序输出:双链表。*/#include <iostream>#include <malloc.h>using namespace std;typedef struct DNode{ int data; int freq; struct DNode *next; struct DNode *prior;} DinkList;DinkList *h;void sort(DinkList *&h)//根据freq降序排列,写成一个函数,下面没有调用只是当做测试用,因为作业要求只写一个函数{ DinkList *p,*q,*pre; p=h->next->next; h->next->next=NULL; while(p!=NULL) { q=p->next; pre=h; while(pre->next!=NULL&&pre->next->freq>p->freq)//根据freq降序 pre=pre->next; p->next=pre->next; if(pre->next!=NULL) pre->next->prior=p; pre->next=p; p->prior=pre; p=q; }}void LocateNode(DinkList *&h,int x){ DinkList *p; p=h->next; int i=0; //查找x所在的位置 while(p!=NULL&&p->data!=x) { p=p->next; ++i; } p->freq++;//x元素的freq++ //sort(h);//下面是sort DinkList *q,*pre; p=h->next->next; h->next->next=NULL; while(p!=NULL) { q=p->next; pre=h; while(pre->next!=NULL&&pre->next->freq>p->freq) pre=pre->next; p->next=pre->next; if(pre->next!=NULL) pre->next->prior=p; pre->next=p; p->prior=pre; p=q; }}int main(){ DinkList *s; h=(DinkList *)malloc(sizeof(DinkList)); int a[10]; int i; for(i=0; i<10; ++i)//初始化a数组 a[i]=i; h->prior=h->next=NULL; for(i=0; i<10; ++i)//头插法 { s=(DinkList *)malloc(sizeof(DinkList)); s->data=a[i]; s->freq=0; s->next=h->next; if(h->next!=NULL) h->next->prior=s; h->next=s; s->prior=h; }//下面是测试代码 cout<<"原来:"; DinkList *p; p=h->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; cout<<"x=3:"; LocateNode(h,3); p=h->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; cout<<"x=5:"; LocateNode(h,5); p=h->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; cout<<"x=3:"; LocateNode(h,3); p=h->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; return 0;}
运行结果:
直接根据freq的值用排序做。
0 0
- 双链表按访问频度域freq的值的递减序排列
- 双向链表L每次访问元素后,元素按访问频度递减次序排列
- 双向链表实现访问频度递减
- 链表中元素被访问的频度大的放在前面
- 链表 4:(双链表的一个用途)访问频度调整
- 一道求频度的题
- 统计单词出现的频度
- 设单链表以非递减有序排列,设计算法实现在单链表中删去值相同的多余结点。
- 设单链表以非递减有序排列,设计算法实现在单链表中删除值相同的多余结点
- 哈希表实现的统计关键字频度
- 打印各个字符出现频度的直方图
- 统计序列中元素出现的频度
- c实现按访问频度非递增有序的带头节点的双向链表检索关键字
- 算法与数据结构--实现线性表的合并操作(合并后按非递减排列)--算法2.6
- 全排列的算法(三)——递减进位法
- 非递减排列 非递增排列 递减排列 递增排列
- 如何统计序列中元素的出现的频度
- 字符串递增/递减的处理
- app整个应用生命周期管理ActivityLifecycleCallbacks,registerActivityLifecycleCallbacks
- 《21天学通C++》读书笔记,名字很奇怪,但写的还蛮好,
- C++的|、||、&、&&、异或、~、!运算
- SQLite的架构(The Architecture Of SQLite)
- [Play!] play jpa、原生jpa、jdbc使用注意
- 双链表按访问频度域freq的值的递减序排列
- 关于不小心删掉Xcode系统文件的问题
- 【攻略】Sql常用语句
- 配置JAVA环境变量
- HOW TO USE SWIG
- Android清除本地数据缓存代码
- 2005年-2015年十年回忆篇之序
- 图像低频高频区域分离
- FTP使用教程之Filezilla使用教程