数据结构作业-5

题目:试设计一个实现下述要求的Locate运算的函数。设有一个带头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freg。所有结点的freg初始都为0。每当在链表上进行一次Locate(L,x)操作时,令元素值为x的结点的访问频度freg1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

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.附录

源程序文件清单。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值