2017软专算法题T2 (双向链表,排序)

33 篇文章 5 订阅

给定一个带表头结点的双向链表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; 
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值