给定一个带表头结点的双向链表L,每个结点有4个数据成员:前驱结点的指针LLink、后继结点的指针RLink、数据的成员Data、和访问频度Freq:且已知双向链表L中结点一直按访问频度递减的顺序排列,即频繁访问的结点总是靠近表头:初始状态L中所有结点的Freq都为0.
对双链表L的Locate(x)操作:每操作一次,将数据值为x的结点访问频度Freq加1.请设计一个算法实现对双链表L的Locate(x)操作,要求操作后L中结点仍按照访问频度的递减顺序排列。
解题思路:jt
1.双向链表结构体
2.建立一个双向链表且按频度递减排列。如何保证改变一次频度就排列依次嘛?用什么排列方法呢?不即丢了qaq
注意事项:ab可以与2020.4比较一下,再排序过程中这道题不需要交换整个结点再修改指针,只需要交换data和freq即可。2020.4需要交换整个是因为除了score还有其他的信息。
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct Node
{
int data;
Node *LLink;
Node *RLink;
int Freq;
}Node,*List;
int n=5;
List build()//头插法建立双向链表
{
Node *head=(Node *)malloc(sizeof(Node));
head->LLink=NULL;
head->RLink=NULL;
int k;
while(n--)
{
scanf("%d",&k);
Node *p=(Node *)malloc(sizeof(Node));
p->data=k;
p->RLink=head->RLink;
head->RLink=p;
p->LLink=head;
p->Freq=0;
}
return head;
}
//按freq递减排序,那就按照老规矩写冒泡吧
List Bubblesort(List head)//按Freq值递减冒泡排序
{
Node *p=head->RLink;
Node *q=p->RLink;
while(p)
{
while(q)
{
if(p->Freq < q->Freq)
{
int td=p->data;//交换data值
p->data=q->data;
q->data=td;
int tf=p->Freq;//交换Freq值 话说我这算不算偷懒啊
p->Freq=q->Freq;
q->Freq=tf;
}
q=q->RLink;
}
p=p->RLink;
}
return head;
}
void Locate(List head,int x)
{
Node *p=head->RLink;
while(p->data!=x)
{
p=p->RLink;
}
p->Freq++;
Bubblesort(head);
return;
}
void print(List head)
{
Node *p=head->RLink;
while(p!=NULL)
{
printf("data:%d freq:%d\n",p->data,p->Freq);
p=p->RLink;
}
}
int main()
{
List head=build();
print(head);
Locate(head,3);
Locate(head,3);
print(head); //soeasy!!!全程自己写的哦!!!!!
return 0;
}