主题:[讨论]双链表结点按其元素的访问频度由高到低排列的问题,谢谢各位大虾了。
[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;
}
不知是否正确?若有错应怎么修改?或是讲一下您的算法.谢谢各位高手!
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;
}
不知是否正确?若有错应怎么修改?或是讲一下您的算法.谢谢各位高手!