LOCATE操作(数据结构)

#include <stdio.h>

 

#include <stdlib.h>

typedef struct DNode

{

    char elem;

    int freq;

    struct DNode *pre, *next;

} DNode, *Doublelist;

void CreateFromTail(Doublelist head, int length); // 后插法建表

void LOCATE(Doublelist head, char Lelem);         // 进行LOCATE操作

void Visit(Doublelist head, int num);             // 对节点进行访问

int main()

{

    Doublelist head, sign;

    int length, num; // length是双链表的长度,num是访问节点的次数

    head = (DNode *)malloc(sizeof(DNode));

    scanf("%d %d", &length, &num);

    CreateFromTail(head, length);

    Visit(head, num);

    sign = head; // sign用来遍历双链表

    for (int i = 0; i < length; i++)

    {

        sign = sign->next;

        printf("%c ", sign->elem);

    }

    return 0;

}

void CreateFromTail(Doublelist head, int length) // 后插法建表

{

    DNode *end = head, *insert;

    for (int i = 0; i < length; i++)

    {

        char Celem;

        char c = getchar(); // 用c来清空缓冲区

        scanf("%c", &Celem);

        insert = (DNode *)malloc(sizeof(DNode));

        insert->freq = 0; // 起始访问频率为0

        insert->elem = Celem;

        end->next = insert; // 进行双链表的连接

        insert->pre = end;

        end = insert;

    }

    end->next = head; // 尾节点与头结点进行连接

    head->pre = end;

}

void LOCATE(Doublelist head, char Lelem) // 进行LOCATE操作

{

    DNode *start = head->next;

    while (start->elem != Lelem)

    {

        start = start->next; // 不是所访问的节点便询问下一个节点

    }

    start->freq++;

    while (start->freq > start->pre->freq && start->pre != head)

    {

        DNode *prior = start->pre, *before = prior->pre, *after = start->next; // before为要换位的start节点的前第两个节点,after是start的后一个节点

        after->pre = prior;                                                    // 进行交换

        start->next = prior;

        start->pre = before;

        prior->next = after;

        prior->pre = start;

        before->next = start;

    }

}

void Visit(Doublelist head, int num) 对节点进行访问

{

    for (int i = 0; i < num; i++)

    {

        char Velem;

        char c = getchar();

        scanf("%c", &Velem);

        LOCATE(head, Velem);

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光焰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值