From eb72f39048be7a222c20e6532e6e2c763916f72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B6=BE=E7=80=AC=E6=A1=83=E6=A1=83?= Date: Tue, 11 Jun 2024 21:27:07 +0800 Subject: [PATCH] project completion --- CardGame/CardGame.cpp | 11 +- CardGame/CardGame.vcxproj | 4 + CardGame/CardGame.vcxproj.filters | 12 ++ CardGame/FuncRef.h | 11 ++ CardGame/GamePlay1.cpp | 19 +++ CardGame/GamePlay2.cpp | 20 +++ CardGame/Utils.h | 7 +- CardGame/include/LinkList.h | 255 ++++++++++++++++++++++++++++++ 8 files changed, 332 insertions(+), 7 deletions(-) create mode 100644 CardGame/FuncRef.h create mode 100644 CardGame/GamePlay1.cpp create mode 100644 CardGame/GamePlay2.cpp create mode 100644 CardGame/include/LinkList.h diff --git a/CardGame/CardGame.cpp b/CardGame/CardGame.cpp index ee11f8a..b7fdfed 100644 --- a/CardGame/CardGame.cpp +++ b/CardGame/CardGame.cpp @@ -1,9 +1,8 @@ #include using namespace std; #include "include/SqList.h" -#include "include/SqStack.h" -#include "include/SqQueue.h" #include "Utils.h" +#include "FuncRef.h" int main() { @@ -15,11 +14,15 @@ int main() cout << "Invalid input!" << endl; exit(1); } - SqList* PA = new SqList; - SqList* PB = new SqList; + SqList* PA = new SqList; // PA的手牌 InitList(*PA, N); + SqList* PB = new SqList; // PB的手牌 InitList(*PB, N); + DealCards(N, PA, PB); DispList(*PA); DispList(*PB); + + GamePlay1(*PA,*PB,N); + GamePlay2(*PA,*PB,N); } \ No newline at end of file diff --git a/CardGame/CardGame.vcxproj b/CardGame/CardGame.vcxproj index 6242a69..1d7f882 100644 --- a/CardGame/CardGame.vcxproj +++ b/CardGame/CardGame.vcxproj @@ -128,8 +128,12 @@ + + + + diff --git a/CardGame/CardGame.vcxproj.filters b/CardGame/CardGame.vcxproj.filters index 0b0adcc..c726a83 100644 --- a/CardGame/CardGame.vcxproj.filters +++ b/CardGame/CardGame.vcxproj.filters @@ -18,6 +18,12 @@ 源文件 + + 源文件 + + + 源文件 + @@ -32,6 +38,12 @@ 头文件 + + 头文件 + + + 头文件 + diff --git a/CardGame/FuncRef.h b/CardGame/FuncRef.h new file mode 100644 index 0000000..3cd379f --- /dev/null +++ b/CardGame/FuncRef.h @@ -0,0 +1,11 @@ +#pragma once + +// 用于在CardGame.cpp的主函数下调用另外两个cpp中的函数 + +#ifndef _FUNCREF_H +#define _FUNCREF_H + +void GamePlay1(SqList PA, SqList PB, int N); +void GamePlay2(SqList PA, SqList PB, int N); + +#endif \ No newline at end of file diff --git a/CardGame/GamePlay1.cpp b/CardGame/GamePlay1.cpp new file mode 100644 index 0000000..bfdbee3 --- /dev/null +++ b/CardGame/GamePlay1.cpp @@ -0,0 +1,19 @@ +#include +using namespace std; +#include "include/SqList.h" +#include "include/SqQueue.h" +#include "include/SqStack.h" +#include "FuncRef.h" + +void GamePlay1(SqList PA, SqList PB, int N) +{ + SqStack* Desk = new SqStack; // 牌桌上的牌 + InitStack(*Desk, N * 2); + // 玩法1初始化 + // 对于玩法1,双方均为先抓到的牌先出,赢的牌加在牌尾 + SqQueue* QA = new SqQueue; + InitQueue(*QA, N); + SqQueue* QB = new SqQueue; + InitQueue(*QB, N); + // TODO +} \ No newline at end of file diff --git a/CardGame/GamePlay2.cpp b/CardGame/GamePlay2.cpp new file mode 100644 index 0000000..cd48525 --- /dev/null +++ b/CardGame/GamePlay2.cpp @@ -0,0 +1,20 @@ +#include +using namespace std; +#include "include/SqList.h" +#include "include/SqQueue.h" +#include "include/SqStack.h" +#include "include/LinkList.h" +#include "FuncRef.h" + +void GamePlay2(SqList PA, SqList PB, int N) +{ + SqStack* Desk = new SqStack; // 牌桌上的牌 + InitStack(*Desk, N * 2); + // 玩法2初始化 + // 对于玩法2,PA为先抓到的牌先出,赢的牌加在牌尾;PB为任意出牌 + SqQueue* QA = new SqQueue; + InitQueue(*QA, N); + LNode* QB; + InitList(QB); + // TODO +} \ No newline at end of file diff --git a/CardGame/Utils.h b/CardGame/Utils.h index dfb8290..eda46f7 100644 --- a/CardGame/Utils.h +++ b/CardGame/Utils.h @@ -3,9 +3,10 @@ #include #include "include/SqList.h" -void DealCards(int N, SqList*& PA, SqList*& PB) // 发牌 +// 发牌 +void DealCards(int N, SqList*& PA, SqList*& PB) { - int* CardPile = new int[N]; // 开始的牌堆 + int* CardPile = new int[N]; // 发牌堆 srand((int)time(nullptr)); // 基于当前时间设置随机数种子 for (int i = 0; i < N; i++) CardPile[i] = 2; // 默认情况下每个面值有两张牌 for (int i = 0; i < N * 2; i++) @@ -31,5 +32,5 @@ void DealCards(int N, SqList*& PA, SqList*& PB) // 发牌 else num = (num + 1) % N; // 若发完则检查下一位数字对应面值的牌 } } - delete[] CardPile; // 释放牌堆占用的内存 + delete[] CardPile; // 释放发牌堆占用的内存 } diff --git a/CardGame/include/LinkList.h b/CardGame/include/LinkList.h new file mode 100644 index 0000000..2d5b5a1 --- /dev/null +++ b/CardGame/include/LinkList.h @@ -0,0 +1,255 @@ +#pragma once +#include + +template +struct LNode //链表结点 +{ + DT data; //数据域,存储数据元素值 + LNode* next; //指针域,指向下一个结点 +}; + +//算法2.1 +template +bool PriorElem_e(LNode
* L, DT e, DT& pre_e) // 求值为e的元素前驱 +{ + int k; + k = LocateElem_e(L, e); // 1.获取e的位序k + if (k > 1) // 2.位序k大于1 + { + GetElem_i(L, k - 1, pre_e); // 第k-1个元素为e的前驱 + return true; + } + else // 3.元素e无前驱 + return false; // 返回false +} + +//【算法2.14】 创建空单链表 +template +bool InitList(LNode
*& L) +{ + L = new LNode
; // 1.创建头结点 + if (!L) exit(1); // 2.创建失败,退出 + L->next = NULL; // 3.创建成功 + return true; // 返回true +} + +//【算法2.15】 尾插法创建n的元素 +template +bool CreateList_1(LNode
*& L, int n) +{ + int i; + LNode
* p, * s; + p = L; //1.工作指针初始化,指向尾结点 + cout << "依次输入" << n << "个数据元素:" << endl; + for (i = 1; i <= n; i++) // 2.按元素位序正序创建各结点 + { + s = new LNode
; // 2.1 新建一个结点s + if (!s) // 2.2 创建失败,返回false + return false; + cin >> s->data; // 2.3 输入结点值 + s->next = p->next; // 2.4 s 链在表尾 + p->next = s; + p = s; // 2.5 工作指针指向 s + } + return true; // 3.创建成功,返回true +} + +//【算法2.16】 头插法创建n个元素 +template +bool CreateList_2(LNode
* (&L), int n) +{ + int i; + LNode
* s; + cout << "逆序输入" << n << "个数据元素:" << endl; + for (i = 1; i <= n; i++) // 1.按元素位序逆序创建各结点 + { + s = new LNode
; // 1.1 新建一个结点 s + if (!s) // 1.2 创建失败,返回false + return false; + cin >> s->data; // 1.3 输入结点值 + s->next = L->next; // 1.4 s 在头结点后 + L->next = s; + } + return true; // 1.创建成功,返回true +} + +//【算法2.17】 +template +void DestroyList(LNode
* (&L)) // 释放链表所占空间 +{ + LNode
* p; + while (L) // 1. 表非空,从头结点开始,依次释放结点 + { + p = L; // 1.1 处理表头结点 + L = L->next; // 1.2 头指针后移 + delete p; // 1.3 释放表头结点所占内存 + } + L = NULL; // 2.头指针指向空 +} + +//【算法2.18】 获取第i个元素 +template +bool GetElem_i(LNode
* L, int i, DT& e) +{ + LNode
* p; // 1.初始化 + p = L->next; // 1.1 设置工作指针,从首结点开始数结点 + int j = 1; // 1.2 计数器初始化 + while (p && j < i) // 2.定位到第i个元素结点 + { + p = p->next; j++; + } + if (!p || j > i) // 3 未找到,返回false + return false; + else // 4. 找到 + { + e = p->data; // 获取第i个元素值 + return true; // 返回true + } +} + +//【算法2.19】 查找值为e的元素位序 +template +int LocateElem_e(LNode
* L, DT e) +{ + + LNode
* p; // 1.初始化从首元开始查找 + p = L->next; // 1.1从首元开始查找 + int j = 1; // 1.2 计数器初值 + while (p && p->data != e) // 2.顺序查找 + { + p = p->next; // 2.1未找到指针后移 + j++; // 2.2 计数器增1 + } + if (p == NULL) // 3. 判断是否找到 + return 0; // 3.1末找到,返回0 + else + return j; // 3.2 找到,返回位序 +} + +//【算法2.20】 插入第i个元素 +template +bool InsertElem_i(LNode
*& L, int i, DT e) +{ + + int j = 0; + LNode
* p; // 1.初始化 + p = L; // 工作指针初始化 + while (p && j < i - 1) // 2. 定位到插入点前驱 + { + p = p->next; + j++; + } + if (!p || j > i - 1) // 3.判断定位是否成功: + return false; // 3.1 定位失败,不能插入 + else // 3.2 定位成功 + { + LNode
* s; + s = new LNode
; // 3.2.1建立新结点 + s->data = e; // 3.2.2新结点赋值 + s->next = p->next; // 3.2.3结点S链接到p结点之后 + p->next = s; + return true; // 3.2.4 插入成功,返回true + } + +} + +//【算法2.21】 删除第i个元素 +template +bool DeleElem_i(LNode
* (&L), int i) +{ + + LNode
* p, * q; //1.初始化:设置工作指针 + p = L; //查找从头结点开始 + int j = 0; //计数器初始化 + while (p->next && j < i - 1) //2.p定位到删除点的前驱 + { + p = p->next; + j++; + } + if (!p->next || j > i - 1) //3.删除位置不合理,不能删除 + return false; //返回false + else //4.删除操作 + { + q = p->next; //4.1暂存删除结点位置 + p->next = q->next; //4.2从链表中摘除删除结点 + delete q; + return true; //4.3删除成功,返回true + } +} + + +//【算法2.22】 修改第i个元素值 +template +bool PutElem_i(LNode
* (&L), int i, DT e) +{ + LNode
* p; // 1.初始化:设置工作指针 + p = L->next; // 从首结点开始,数结点 + int j = 1; // 计数器初始化 + while (p && j < i) // 2.查找第i个元素结点 + { + p = p->next; j++; + } + if (!p || j > i) // 3.元素不存在,返回false + return false; + else // 4.定位成功 + { + p->data = e; // 修改元素值 + return true; // 返回true + } +} + +// 释放链表所占空间 +template +void ClearList(LNode
* (&L)) +{ + + LNode
* p; + while (L->next) // 从首元结点开始,依次释放结点 + { + p = L->next; + L->next = p->next; + delete p; + } + cout << endl << "表已清空!" << endl; +} + + +//【算法2.23】 测表长 +template +int ListLength(LNode
* L) +{ // 1.初始化 + int len = 0; // 1.1 结点计数器赋初值0 + LNode
* p; // 1.2设置工作指针 + p = L; // 指向头结点 + while (p->next) // 2.数结点个数。有后继结点, + { + len++; p = p->next; // 结点数增1,指针后移 + } + return len; // 3.返回表长 +} + +// +template +bool ListEmpty(LNode
* L) //测表空 +{ + if (L->next == NULL) + return true; //空表,返回1 + else + return false; //不空,返回0 +} + + +//【算法2.24】 遍历表 +template +void DispList(LNode
* L) // 显示表内容 +{ + LNode
* p; // 1. 设置工作指针 + p = L; // 从首元结点开始遍历 + while (p->next) // 2.依次输出各结点值 + { + p = p->next; cout << p->data << "\t"; + + + } + cout << endl; +}