题目
设计一个双向链表,除了基本的prior、data以及next三个指针外还有一个访问频度freq,freq初始化为0,每当进行LocateNode(h,x)运算时,令元素为x的结点中的freq值加一,并调整表中结点次序,使其按访问频度序列递减
代码
#include <iostream>
using namespace std;
typedef char ElemType;
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
int freq;
}DNode,*DLinkList;
void createDLinkList(DLinkList &L){
L=(DNode *)malloc(sizeof(DNode));
ElemType e;
DNode *p,*r=L;
cin>>e;
while(e!='#'){
p=(DNode *)malloc(sizeof(DNode));
p->data=e;
p->freq=0;
r->next=p;
p->prior=r;
r=p;
cin>>e;
}
r->next=NULL;
}
void dispDLinkList(DLinkList L){
if(L==NULL)
return;
DNode *p=L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//算法主体
void LocateNode(DLinkList &L,ElemType x){
if(L==NULL)
return;
DNode *p;
for(p=L->next;p!=NULL;p=p->next){
if(p->data==x){
p->freq++;
break;
}
}
if(p==NULL){
cout<<"没有该结点!";
return;
}
DNode *q=p->prior;
do{
if(q->freq<p->freq)
q=q->prior;
}while(q!=L);
//找到了插入点
p->prior->next=p->next;
p->next->prior=p->prior;
p->next=q->next;
q->next->prior=p;
q->next=p;
p->prior=q;
}
int main() {
DLinkList L;
createDLinkList(L);
dispDLinkList(L);
LocateNode(L,D');
dispDLinkList(L);
return 0;
}