题目:
设有一个双链表对象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;
}

1402

被折叠的 条评论
为什么被折叠?



