1. 程式人生 > 其它 >buuoj [RoarCTF 2019]Easy Calc(利用PHP的字串解析特性)

buuoj [RoarCTF 2019]Easy Calc(利用PHP的字串解析特性)

#include <iostream>

using namespace std;

typedef int Datatype;

typedef struct LNode {
    Datatype elem;
    struct LNode * next;
}LNode, *LinkList; // LinkList 為指向結構體LNode的指標型別

void InitList(LinkList &L) {
    //構造一個空的單鏈表L
    L = new LNode; //生成頭節點
    L->next = NULL; //頭節點先指向空,還沒有元素
    printf("單鏈表初始化成功!\n");
}

LNode* LocateElem(LinkList L, Datatype x) {
    //在帶頭結點的單鏈表中查詢值為 x 的元素
    LNode* p = L->next;
    while(p != NULL && p->elem != x)
        p = p->next;
    return p;
}

void ListInsert(LinkList &L, int i, Datatype e) {
    LNode* p = L;
    int j = 0;
    while(p != NULL && j < i-1){
        p = p->next;
        ++j;
    }
    if(p == NULL || j > i-1) {
        puts("ERROR");
    }
    else{
        LNode* s = new LNode;
        s->elem = e;
        s->next = p->next;
        p->next = s;
        puts("插入成功!");
    }
}

void ListDelete (LinkList &L, int i) {
    //在帶頭結點的單鏈表L中刪除第 i 個元素
    LNode* p = L;
    int j = 0;
    while((p->next) && j < i-1){
        p = p->next;
        ++j;
    }

    if(!(p->next) || j > i-1) {
        puts("刪除失敗,此位置不合理");
    }
    else {
        LNode* q = p->next;
        p->next = q->next;
        delete q;
        puts("刪除成功");
    }
}

void LinkListDelete(LinkList &L) {
    L->next = NULL;
    delete L;
    puts("刪除成功!");
}

void showList (LinkList &L) {
    LNode* p = L->next;
    if(p == NULL) cout << "空";
    while(p != NULL) {
        cout << p->elem << ' ';
        p = p->next;
    }
    cout << endl;
}

void MergeLiskList(LinkList &L1, LinkList &L2, LinkList &L3) { //合併L1,L2儲存在L3中
    LinkList t1 = L1->next, t2 = L2->next, p = L3;

    while(t1 != NULL && t2 != NULL) { //如果兩個都不是 NULL 就進入迴圈
        LNode* s = new LNode;
        if(t1->elem < t2->elem){
            s->elem = t1->elem;
            t1 = t1->next;
        }
        else{
            s->elem = t2->elem;
            t2 = t2->next;
        }
        p->next = s;
        p = s;
    }
    while(t1 != NULL) {
        LNode* s = new LNode;
        s->elem = t1->elem;
        p->next = s;
        t1 = t1->next;
    }
    while(t2 != NULL) {
        LNode* s = new LNode;
        s->elem = t2->elem;
        p->next = s;
        t2 = t2->next;
    }
}

void showMenu() {

    printf("***********************************************\n");
    printf("***********************************************\n");
    printf("****    請輸入操作前面的數字,執行操作    *******\n");
    printf("****1.初始化一個單鏈表                   *******\n");
    printf("****2.查詢值為x的元素                    *******\n");
    printf("****3.在第 i 個位置插入元素              *******\n");
    printf("****4.刪除第i個元素                      *******\n");
    printf("****5.刪除單鏈表                         *******\n");
    printf("****6.歸併兩個有序的單鏈表                *******\n");
    printf("****7.顯示連結串列                           *******\n");
    printf("****8.退出                               *******\n");
    printf("***********************************************\n");
    printf("***********************************************\n");
}

int a[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

int main() {
    showMenu();
    bool flag = true;
    LinkList L1, L2,L3;

    InitList(L2);
    LNode* p = L2; //初始化L2,儲存好元素,此後操作只針對 L1
    for(int i = 0; i < 10; i++) {
        LNode* q = new LNode;
        q->elem = a[9-i];
        q->next = p->next;
        p->next = q;
    }
    int i,x,e;
    char c;

    while(flag) {
        cout <<"請輸入操作:" ;
        int select;
        cin >> select;
        switch (select)
        {
        case 1 : InitList(L1);
            break;
        case 2 :
            cout << "請輸入一個元素的值:"; cin >> x;
             p = LocateElem(L1, x);
            if(p != NULL) cout << "該元素的地址為:" << p << endl;
            else {cout << "未找到元素x" << endl; break;}
            break;
        case 3 :
            cout << "請輸入要插入的位置:"; cin >> i;
            cout << "請輸入要插入的元素值:"; cin >> e;
            ListInsert(L1, i, e);
            break;
        case 4 :
            cout << "請輸入要刪除元素的位置:"; cin >> i;
            ListDelete(L1, i);
            break;
        case 5 :
            cout << "確定要刪除連結串列嗎?(y/n): "; cin >> c;
            if(c == 'Y' || c == 'y') LinkListDelete(L1);
            break;
        case 6 :
            InitList(L3);
            MergeLiskList(L1, L2, L3);
            cout << "歸併後的連結串列為:";
            showList(L3);
            break;
        case 7 :
            cout << "當前連結串列為:";
            showList(L2);
            break;
        default: flag = false;
            break;
        }
    }

    return 0;
}