回 帖 发 新 帖 刷新版面

主题:[讨论]双链表结点按其元素的访问频度由高到低排列的问题,谢谢各位大虾了。

[em10]  一个双链表每个结点除data,prior,next数据域外还有一个访问频度域fre.在链表启用之前都初始为"0".每当链表进行一次locate(l,x)运算时,令元素值为x的节点中fre加一,并使结点按访问频度递减排列,使频繁访问的节点总是靠近表头.  本小生的算法如下

typedef struct dnode
{int data;struct dnode *prior,*next;int fre;}dlink;

dlink *locate(l,x)
dlink *l;int x;
{dlink *p,*q;
 p=q=l->next;
 while(p!=null)  \在已知链表中查找所使用的值\
 {if(p->data!=x)
   p=p->next;
 else {p->fre++;break;}  \在结点p找到所用值并使频率加1\
 }
 while(p->fre<q->fre&&q!=null)
  q=q->next;
 if(q=null)    \把结点p调整到链表尾\
  {p->prior->next=p->next;p->next->prior=p->prior;
   q->next=p;p->prior=q;p->next=null;}   
 else{p->prior->next=p->next;p->next->prior=p->prior; \把结点p调整到链表中间\
     q->prior->next=p;p->prior=q->prior;p->next=q;q->prior=p;}
  return l;
}

  不知是否正确?若有错应怎么修改?或是讲一下您的算法.谢谢各位高手!

回复列表 (共2个回复)

沙发

这个程序应该有问题把:
   else {p->fre++;break;}  \在结点p找到所用值并使频率加1\
这个似乎将结点里面数据相同的情况给排除掉了,应该将break删掉。 
    p->prior->next=p->next 
这个不知道你是什么意思啊p->prior->next不就是p吗?
我认为后面排序的地方就用一般的办法排就可以  首先将p and q都指向连表开头然后再比较结点里面的数据并调整p和q

板凳

 非常谢谢一楼!我根据你说的在看一下~~~呵呵

我来回复

您尚未登录,请登录后再回复。点此登录或注册