题目:试设计一个实现下述要求的Locate运算的函数。设有一个带头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freg。所有结点的freg初始都为0。每当在链表上进行一次Locate(L,x)操作时,令元素值为x的结点的访问频度freg加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
1.需求分析
假设双向连表中没有元素值重复的节点。
用户输入链表中的元素,然后访问元素。
程序计算每个元素所在节点被访问的此时,并按此排序,输出给用户。
2.概要设计
节点定义
Node* prior;//指向前一个节点的指针
Node* next;//只想后一个节点的指针
DataType data;//数据域
int freq;//访问频度
链表定义
Node* head;//头结点
总体流程为:
3.详细设计
创建双向链表:
关键函数和代码:
int locate(dnodetype* head,DatType x)
{
dnodetype *p=head;//p是目标点,它de阈值为x。调整的也是它
while(p!=NULL && x!=p->data)
{
p=p->next;
}
if (p==NULL)
{
return 0;//未找到
}
p->freq++;//频度加
dnodetype *q=p->prior;//向左找。q是指针,p指向的节点需要前挪
while(q!=head && q->freq<p->freq)
{
p->prior=q->prior;
p->prior->next=p;
q->next=p->next;
if (q->next!=NULL)
{
q->next->prior=q;
}
p->next=q;
q->prior=p;
q=p->prior;
}
return 1;
}
4.调试分析
链表的元素以0开始,出现异常。
只能处理int型和char型。
5.使用说明
运行程序,按照提示。
6.测试结果
单位数整数:
建立双向连表,元素类型为int,以0结束输入,不能以0开始
输入第1个节点值:1
输入第2个节点值:2
输入第3个节点值:3
输入第4个节点值:4
输入第5个节点值:5
输入第6个节点值:6
输入第7个节点值:7
输入第8个节点值:0
链表创建完毕
输入要访问的值:9
未找到x节点
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:3 ,访问频度=0
元素值为:4 ,访问频度=0
元素值为:5 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:5
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:5 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:3 ,访问频度=0
元素值为:4 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:3
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:5 ,访问频度=1
元素值为:3 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:4 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:3
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:3 ,访问频度=2
元素值为:5 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:4 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:4
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:3 ,访问频度=2
元素值为:5 ,访问频度=1
元素值为:4 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:4
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:3 ,访问频度=2
元素值为:4 ,访问频度=2
元素值为:5 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:4
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:4 ,访问频度=3
元素值为:3 ,访问频度=2
元素值为:5 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:
4
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:4 ,访问频度=4
元素值为:3 ,访问频度=2
元素值为:5 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:2 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:2
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:4 ,访问频度=4
元素值为:3 ,访问频度=2
元素值为:5 ,访问频度=1
元素值为:2 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:6 ,访问频度=0
元素值为:7 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:7
链表重排后从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:4 ,访问频度=4
元素值为:3 ,访问频度=2
元素值为:5 ,访问频度=1
元素值为:2 ,访问频度=1
元素值为:7 ,访问频度=1
元素值为:1 ,访问频度=0
元素值为:6 ,访问频度=0
继续查找吗?(1继续,其他退出)
多位数整数:
建立双向连表,元素类型为int,以0结束输入,不能以0开始
输入第1个节点值:632
输入第2个节点值:753
输入第3个节点值:693
输入第4个节点值:419
输入第5个节点值:355
输入第6个节点值:810
输入第7个节点值:478
输入第8个节点值:0
链表创建完毕
输入要访问的值:466
未找到x节点!! 排序也没有发生变化
继续查找吗?(1继续,其他退出)1
输入要访问的值:419
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:419 ,访问频度=1
元素值为:632 ,访问频度=0
元素值为:753 ,访问频度=0
元素值为:693 ,访问频度=0
元素值为:355 ,访问频度=0
元素值为:810 ,访问频度=0
元素值为:478 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:419
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:419 ,访问频度=2
元素值为:632 ,访问频度=0
元素值为:753 ,访问频度=0
元素值为:693 ,访问频度=0
元素值为:355 ,访问频度=0
元素值为:810 ,访问频度=0
元素值为:478 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:753
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:419 ,访问频度=2
元素值为:753 ,访问频度=1
元素值为:632 ,访问频度=0
元素值为:693 ,访问频度=0
元素值为:355 ,访问频度=0
元素值为:810 ,访问频度=0
元素值为:478 ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:478
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为:-1 ,访问频度=0
元素值为:419 ,访问频度=2
元素值为:753 ,访问频度=1
元素值为:478 ,访问频度=1
元素值为:632 ,访问频度=0
元素值为:693 ,访问频度=0
元素值为:355 ,访问频度=0
元素值为:810 ,访问频度=0
继续查找吗?(1继续,其他退出)
Char型
建立双向连表,元素类型为char,以#结束输入,不能以#开始
输入第1个节点值:q
输入第2个节点值:w
输入第3个节点值:g
输入第4个节点值:l
输入第5个节点值:;
输入第6个节点值:#
链表创建完毕
输入要访问的值:r
未找到x节点!! 排序也没有发生变化
继续查找吗?(1继续,其他退出)1
输入要访问的值:l
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为: ,访问频度=0
元素值为:l ,访问频度=1
元素值为:q ,访问频度=0
元素值为:w ,访问频度=0
元素值为:g ,访问频度=0
元素值为:; ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:W
未找到x节点!! 排序也没有发生变化
继续查找吗?(1继续,其他退出)1
输入要访问的值:;
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为: ,访问频度=0
元素值为:l ,访问频度=1
元素值为:; ,访问频度=1
元素值为:q ,访问频度=0
元素值为:w ,访问频度=0
元素值为:g ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:;
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为: ,访问频度=0
元素值为:; ,访问频度=2
元素值为:l ,访问频度=1
元素值为:q ,访问频度=0
元素值为:w ,访问频度=0
元素值为:g ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:w
找到了,链表重排后
从左往右,双向链表的元素为:
元素值为: ,访问频度=0
元素值为:; ,访问频度=2
元素值为:l ,访问频度=1
元素值为:w ,访问频度=1
元素值为:q ,访问频度=0
元素值为:g ,访问频度=0
继续查找吗?(1继续,其他退出)1
输入要访问的值:W
未找到x节点!! 排序也没有发生变化
继续查找吗?(1继续,其他退出)
7.附录
源程序文件清单。