基于这段代码,按照如图所示的要求,修改代码
#include<iostream>
#include<string>
#include<time.h>
using namespace std;
typedef int Rank;
#define ListNodePosi(T) ListNode<T>*//列表节点位置
template<typename T>struct ListNode//列表节点模板类
{
T data;
ListNode<T>* pred;
ListNode<T>* succ;
ListNode() { pred = NULL; succ = NULL; }//构造
ListNode(T e, ListNode<T>* p = NULL, ListNode<T>* s = NULL)
:data(e), pred(p), succ(s) {}//默认构造器
ListNodePosi(T) insertAsPred(T const& e);//当前节点之前插入新节点
ListNodePosi(T) insertAsSucc(T const& e);//当前节点之后插入新节点
};
template<typename T>class List//列表模板类
{
public:
int _size;
ListNode<T>* header;
ListNode<T>* trailer;//规模,头尾哨兵
void init();//列表创建时的初始化
List() { init(); }//默认
void insertA(ListNode<T>* p, T e);//将e当做节点p的直接后继,前驱插入
void remove(ListNode<T>* p);//删除P处节点,返回其数值
void clear();//清除所有节点
};
template<typename T>void List<T>::init()//列表初始化,在创建列表对象时统一调用
{
header = new ListNode<T>;//创建头哨兵节点
trailer = new ListNode<T>;//尾哨兵节点
header->succ = trailer;
header->pred = NULL;
trailer->succ = NULL;
trailer->pred = header;
_size = 0;//记录规模
}
template<typename T>void List<T>::insertA(ListNode<T>* p, T e)//插入
{
ListNode<T>* x = new ListNode<T>();//创建新节点
x->data = e;
x->pred = p;
x->succ = p->succ;
p->succ->pred = x;
p->succ = x;
_size++;
}
template<typename T>
void List<T>::remove(ListNode<T>* p)//删除节点P,返回其数值
{
T e = p->data;//备份待删除节点的数值
p->pred->succ = p->succ;
p->succ->pred = p->pred;//后继,前驱
delete p;//释放节点
_size--;//更新规模
}
template<typename T>
void List<T>::clear()//清空列表
{
header->succ = trailer;
trailer->pred = header;
_size = 0;
}
void distribute(List<string> L)
{
string num[] = { "A","2","3","4","5","6","7","8","9","10","J","Q","K" };
string type[] = { "黑桃","红桃","梅花","方块" };
ListNode<string>* p = L.header;
for (int i = 0; i < 13; i++)
{
for (int j = 0; j < 4; j++)
{
string e = type[j] + num[i];
L.insertA(p, e);
p = p->succ;
}
}
L.insertA(p, "small joker");
p = p->succ;
L.insertA(p, "big joker");
}
void display(List<string> L)
{
ListNode<string>* n = L.header->succ;
while (n->succ != NULL)
{
cout << n->data << " ";
n = n->succ;
}
cout << endl;
}
void shuffle(List<string>L)
{
int n = 0;
for (int i = 1; i < 55; i++)
{
srand(n);
int j = (rand() % 54) + 1;
while (i == j)
{
j = (rand() % 54) + 1;
}
ListNode<string>* p = NULL, * q = NULL;
ListNode<string>* m = L.header->succ;
for (int count = 1; count < 55; count++)
{
if (count == i)
{
p = m;
}
else if (count == j)
{
q = m;
}
if (p != NULL && q != NULL)break;
m = m->succ;
}
L.insertA(p, q->data);
L.insertA(q, p->data);
L.remove(p);
L.remove(q);
n++;
}
}
int main()
{
List<string> list;
distribute(list);
cout << "原始扑克牌列表为:" << endl;
display(list);
cout << "洗牌请输入1,展示请输入2,发牌请输入3" << endl;
int m;
cin >> m;
while (m == 1 || m == 2)
{
if (m == 1)
{
shuffle(list);
cout << "已完成洗牌!" << endl;
}
else if (m == 2)
{
cout << "当前扑克牌列表为:" << endl;
display(list);
}
cout << "洗牌请输入1,展示请输入2,发牌请输入3" << endl;
cin >> m;
}
List<string> player1, player2, player3;
ListNode<string>* p = list.header->succ;
ListNode<string>* q1 = player1.header;
ListNode<string>* q2 = player2.header;
ListNode<string>* q3 = player3.header;
while (p->succ != NULL)
{
player1.insertA(q1, p->data);
q1 = q1->succ;
p = p->succ;
player2.insertA(q2, p->data);
q2 = q2->succ;
p = p->succ;
player3.insertA(q3, p->data);
q3 = q3->succ;
p = p->succ;
}
list.clear();
cout << "玩家1的牌为:" << endl;
display(player1);
cout << "玩家2的牌为:" << endl;
display(player2);
cout << "玩家3的牌为:" << endl;
display(player3);
while (1) {
cout << "请选择一位玩家(1/2/3):";
int b1 = 1;
int b2 = 1;
int b3 = 1;
int name;
cin >> name;
switch (name)
{
case 1:
cout << "玩家1的牌为:" << endl;
display(player1);
while (b1 == 1)
{
int t = 0;
while (true) {
cout << "请选择要出的牌:";
string e1;
cin >> e1;
ListNode<string>* n1 = player1.header->succ;//获取第一张扑克牌
while (n1->succ != NULL)
{
if (n1->data == e1)
{
player1.remove(n1);
list.insertA(list.header, e1);//插入扑克牌列表
t = 1;
break;
}
n1 = n1->succ;
}
if (t == 0) {
cout << "出牌错误,请重新输入" << endl;
}
else {
break;
}
}
cout << "继续出牌请输入1,输入其他则退出" << endl;
cin >> b1;
}
cout << "玩家1当前的牌为:" << endl;
display(player1);
cout << "弃牌堆:" << endl;
display(list);
break;
case 2:
cout << "玩家2的牌为:" << endl;
display(player2);
while (b2 == 1)
{
int t1 = 0;
while (true) {
cout << "请选择要出的牌:";
string e2;
cin >> e2;
ListNode<string>* n2 = player2.header->succ;
while (n2->succ != NULL)
{
if (n2->data == e2)
{
player2.remove(n2);
list.insertA(list.header, e2);
t1 = 1;
break;
}
n2 = n2->succ;
}
if (t1 == 0) {
cout << "出牌错误,请重新输入" << endl;
}
else {
break;
}
}
cout << "继续出牌请输入1,输入其他则退出" << endl;
cin >> b2;
}
cout << "玩家2当前的牌为:" << endl;
display(player2);
cout << "弃牌堆:" << endl;
display(list);
break;
case 3:
cout << "玩家3的牌为:" << endl;
display(player3);
while (b3 == 1)
{
int t2 = 0;
while (true) {
cout << "请选择要出的牌:";
string e3;
cin >> e3;
ListNode<string>* n3 = player3.header->succ;
while (n3->succ != NULL)
{
if (n3->data == e3)
{
player3.remove(n3);
list.insertA(list.header, e3);
t2 = 1;
break;
}
n3 = n3->succ;
}
if (t2 == 0) {
cout << "出牌错误,请重新输入要输的牌" << endl;
}
else {
break;
}
}
cout << "继续出牌请输入1,输入其他则退出" << endl;
cin >> b3;
}
cout << "玩家3当前的牌为:" << endl;
display(player3);
cout << "弃牌堆:" << endl;
display(list);
break;
}
}
system("pause");
return 0;
}