线性表——链式存储结构之双链表的应用

题目:

设有一个双链表对象L,每个结点中除有prior、data和next这3个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零。每当进行LocateElem1(e)运算时,令元素值为e的结点中freq域的值加1,并调整表中结点的次序,使其按访问频度的递减序排列,以便使频繁访问的结点总是靠近表头。设计满足上述要求的LocateElem1算法和完整的程序,并用相关数据进行测试。

代码示例:

#include <iostream>
using namespace std;
template <typename T>
struct DLinkList1						//双链表结点类型
{
	T data;							//存放数据元素
	int freq;						//结点访问频度
	DLinkList1<T> *prior;					//指向前一个结点的域
	DLinkList1<T> *next;					//指向下一个结点的域
};
template <typename T>
class DLinkListClass1						//双链表类模板
{
	DLinkList1<T> *dhead;					//双链表头结点
public:
	DLinkListClass1<T>(); 					//构造函数,创建一个空双链表
	~DLinkListClass1<T>(); 					//析构函数,销毁双链表
	void CreateListR(T a[], int n);				//尾插法建立双链表
	void DispList();					//输出双链表所有结点值
	bool LocateElem1(T e);					//查找值为e的结点
	void Find(T e);						//输出查找结果
};
template <typename T>
DLinkListClass1<T>::DLinkListClass1<T>() 	//构造函数,创建一个空双链表
{
	dhead = new DLinkList1<T>();
	dhead->prior = dhead->next = NULL;
}
template <typename T>
DLinkListClass1<T>::~DLinkListClass1<T>() 	//析构函数,销毁双链表
{
	DLinkList1<T> *pre, *p;
	pre = dhead; 
	p = pre->next;
	while (p != NULL)
	{
		delete pre;
		pre = p; 
		p = p->next;
	}
	delete pre;
}
template <typename T>
void DLinkListClass1<T>::CreateListR(T a[], int n)	//尾插法建立双链表
{
	DLinkList1<T> *s, *r; 
	int i;
	r = dhead;							
	for (i = 0; i<n; i++)				
	{
		s = new DLinkList1<T>();
		s->data = a[i];					
		s->freq = 0;
		r->next = s;						
		s->prior = r;
		r = s;
	}
	r->next = NULL;						
}
template <typename T>
void DLinkListClass1<T>::DispList()		//输出双链表所有结点值
{
	DLinkList1<T> *p;
	p = dhead->next;						
	while (p != NULL)						
	{
		cout << p->data << "[" << p->freq << "] ";
		p = p->next;						
	}
	cout << endl;
}
template <typename T>
bool DLinkListClass1<T>::LocateElem1(T e)	//查找值为e的结点
{
	T tmpd; 
	int tmpf;
	DLinkList1<T> *p, *pre;
	p = dhead->next;						
	while (p != NULL && p->data != e)
		p = p->next;
	if (p == NULL)						
		return false;
	p->freq++;
	pre = p->prior;
	while (pre != dhead && pre->freq<p->freq)	
	{
		tmpd = pre->data; 
		pre->data = p->data;
		p->data = tmpd;
		tmpf = pre->freq; 
		pre->freq = p->freq; 
		p->freq = tmpf;
		p = pre; 
		pre = p->prior;			
	}
	return true;						
}
template <typename T>
void DLinkListClass1<T>::Find(T e)		//输出查找结果
{
	cout << "查找值为" << e << "的结点\n";
	if (LocateElem1(e))
	{
		cout << "查找后的双链表L:";
		DispList();
	}
	else cout << "未找到值为" << e << "的结点\n";
}
void main()
{
	int n = 4;
	char e;
	char a[] = { 'a', 'b', 'c', 'd' };
	DLinkListClass1<char> L;			//建立元素类型为char的顺序表对象
	//===
	cout << "创建双链表L" << endl;
	L.CreateListR(a, n);
	cout << "双链表L:";
	L.DispList();
	//===
	e = 'd';	L.Find(e);
	e = 'a';	L.Find(e);
	e = 'x';	L.Find(e);
	e = 'd';	L.Find(e);
	e = 'c';	L.Find(e);
	e = 'b';	L.Find(e);
	cout << "销毁双链表L" << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值