Description
设有一个双向循环链表,每个结点中除有pre,data和next三个域外,还增设了一个访问频度域freq。在链表被起用之前,频度域freq的值均初始化为零,而每当对链表进行一次LOCATE(L,x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域freq的值便增1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序排列,以便始终保持被频繁访问的结点总是靠近表头结点。试编写符合上述要求的LOCATE操作的程序。
Input
第一行输入双向循环链表的节点数m和被访问的节点数n,
第二行输入双向循环链表各节点的值,
第三行依次输入被访问的节点。
Output
输出符合上述要求的双向循环链表。
输出经过n次LOCATE后的链表。
Sample Input
7 1
a b c d e f g
d
Sample Output
d a b c e f g
Code:
#include <stdio.h>
#include <stdlib.h>
#include <cassert>
#define TRUE 1
#define OK 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -1
typedef struct node {
char data;
struct node * next;
struct node * prior;
int freq;
}DuNode,* DuList;
int Print(DuList head)
{
DuNode * p=head->next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
DuList Sort(DuList head,int m)
{
int i,j;
DuNode *p=head->next;
DuNode *q;
for(i=1;i<m;i++)
{
p=head->next;
for(j=1;j<=m-i && p->next;j++)
{
if(p->freq < p->next->freq)
{
if(p->next->next==0)
{
q=p->next;
p->prior->next=q;
q->prior=p->prior;
p->prior=q;
p->next=NULL;
q->next=p;
continue;
}
q=p->next;
p->prior->next=q;
q->prior=p->prior;
p->prior=q;
p->next=q->next;
q->next->prior=p;
q->next=p;
}
p=p->next;
}
}
}
DuList Locate(DuList head,char e)
{
DuNode *p=head->next;
while(p!=NULL)
{
if(p->data==e)
{
return p;
}
p=p->next;
}
return NULL;
}
DuList Insert(DuList head,char n)
{
int i;
DuNode *s= (DuNode *)malloc(sizeof(DuNode));
if(head==NULL)
{
head=(DuList)malloc(sizeof(DuNode));
assert(head!=NULL);
head->data=0;
head->next=NULL;
head->prior=NULL;
head->freq=0;
}
DuNode *newnode=(DuList)malloc(sizeof(DuNode));
assert(newnode!=NULL);
newnode->data=n;
newnode->next=NULL;
newnode->prior=NULL;
newnode->freq=0;
DuNode *p=head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=newnode;
newnode->prior=p;
return head;
}
int main()
{
DuNode *q,*head=NULL;
char e,p;
int m,n,i;
scanf("%d %d",&m,&n);
getchar();
for(i=0;i<m;i++)
{
scanf("%c",&p);
getchar();
head=Insert(head,p);
}
for(i=n;i>0;i--)
{
scanf("%c",&e);
getchar();
q=Locate(head,e);
q->freq++;
}
Sort(head,m);
Print(head);
return 0;
}