buuoj [RoarCTF 2019]Easy Calc(利用PHP的字串解析特性)
阿新 • • 發佈:2022-03-24
#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; }