LOCATE操作(数据结构)

LOCATE操作(数据结构)_第1张图片#include

 

#include

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);

    }

}

你可能感兴趣的:(数据结构练习,数据结构,算法,c语言,链表)