Code5

逻辑部分

#include <bits/stdc++.h>
using namespace std;

struct Node{
    int value;
    int deleteTag; //1 表示删除
    struct Node* next;
};

struct LinkList{
    Node* head;
    int deleteNum;
    int unDeleteNum;
} myList;

void tureDelete(LinkList* list){
    Node* now = list->head;
    Node* dummyHead = (Node*) malloc(sizeof(Node));
    Node* pre = dummyHead; //虚拟头节点, pre 为上一个 **有效** 的节点

    while(now){
        Node* next = now->next;
        if(now->deleteTag == 1){
            pre->next = next;
            free(now);
            now = next; //不需要更新 pre
        }else{
            pre = now;  //更新pre
            now = next;
        }
    }
    list->head = dummyHead->next;
}
void lazyDelete(LinkList* list, Node* node){
    node->deleteTag = 1;   //lazyDelete
    list->deleteNum++;
    list->unDeleteNum--;
    if(list->deleteNum == list->unDeleteNum){
        list->deleteNum = 0;
        tureDelete(list); // 真正删除
    }
}

测试部分

//-----------------测试代码--------------------
int main(){
    myList.deleteNum = myList.unDeleteNum = 0;
    myList.head = NULL;

    for(int i = 1;i <= 10;i++){
        Node* node = (Node*) malloc(sizeof(Node));
        node->value = i; node->deleteTag = 0;
        node->next = myList.head;
        myList.head = node;
        myList.unDeleteNum++;
    }
    Node* now = myList.head;
    vector<Node*> nodes;
    while(now){
        cout << now->value << '\n';
        nodes.push_back(now);
        now = now->next;
    }

    for(int i = 0;i < 10;i += 2){
        lazyDelete(&myList, nodes[i]);
    }
    cout << "After deletion\n";
    now = myList.head;
    while(now) {
        cout << now->value << '\n';
        now = now->next;
    }
}

逻辑部分

#include <bits/stdc++.h>
using namespace std;

struct Node{
    int data;
    int frequent;
    Node* pre,* next;
};

struct Ring{
    Node* head;
}*myDeque;
void Adjust(Ring*);
void Locate(Ring* ring, int x){
    Node* now = ring->head;
    //遍历整个循环链表, 对值为 x 的节点 frequent 加 1
    do{
        Node* next = now->next;
        if(now->data == x) now->frequent++;
        now = next;
    }while(now != ring->head);

    Adjust(ring); //进行调整
}

void Adjust(Ring* ring){
    Node* now = ring->head, *head = ring->head;

    do{
        Node* next = now->next;
      	//向上冒
        while(now != head && now->frequent > now->pre->frequent){
            swap(now->frequent, now->pre->frequent);
            swap(now->data, now->pre->data);
            now = now->pre;
        }
        now = next;
    }while(now != head);
}

测试部分

//TEST_CODE

void printRing(Ring* ring){
    Node* now = ring->head;

    do{
        cout << now->data << '\n';
        now = now->next;
    }while(now != ring->head);
}
int main(){
    myDeque = (Ring*)malloc(sizeof(Ring));

    vector<Node*> Nodes;
    for(int i = 1;i <= 10;i++){
        Node* node = (Node*) malloc(sizeof(Node));
        node->data  = i; node->frequent = 0;
        Nodes.push_back(node);
    }
    for(int i = 0;i < 10;i++){
        Nodes[i]->pre = Nodes[(i+9)%10];
        Nodes[i]->next = Nodes[(i+1)%10];
    }

    myDeque->head = Nodes[0];

    printRing(myDeque);

    cout << "------------------------------------\n";
    Locate(myDeque, 10);    cout << "Locate 10\n";
    Locate(myDeque, 5);     cout << "Locate 5\n";
    Locate(myDeque, 5);     cout << "Locate 5\n";
    cout << "------------------------------------\n";
    printRing(myDeque);
}

posted @ 2021-11-06 17:44  usr_void  阅读(87)  评论(0)    收藏  举报