经典C语言扑克牌问题
解决时间 2021-04-14 21:07
- 提问者网友:且恨且铭记
- 2021-04-14 09:51
有13张扑克牌,A,2,3,4,5,6,7,8,9,10,J,Q,K
扑克牌先按他预先设计的方法排序,只见他从上边拿出一张放到最下面,又从最上边拿出一张放到桌上是A,然后又从上边拿出一张放到最下面,又从最上边拿出一张放到桌上是2 ……依此类推,直到手里只有一张牌,翻开放到桌上正好为K。
以下是我写的程序:
#include
typedef struct node
{
int value;
struct node* next;
}node;
node *front, *rear;
void insert(node* temp, int value)
{
temp = rear->next;
temp->value = value;
temp->next = front;
}
void move()
{
rear = front;
front = front->next;
}
int main()
{
int b[13] = {13,12,11,10,9,8,7,6,5,4,3,2,1};
node* a[13];
int i;
for(i = 0; i < 13; i++)
{
a[i] = malloc(sizeof(node));
}
front = a[0], rear = a[0];
a[0]->value = b[0];
for(i = 1; i < 13; i++)
{
insert(a[i],b[i]);
move();
}
for(i = 0; i < 13; i++)
{
printf("%d ",front->value);
front = front->next;
}
printf("\n");
free(a[0]);
return 0;
}
编译通过,运行,段错误!
请问,到底哪里出了问题?
最佳答案
- 五星知识达人网友:一叶十三刺
- 2021-04-14 11:13
数组加循环DEBUG最烦了,建议你先单步调试试试,观察到底是哪一步导致错误的
全部回答
- 1楼网友:话散在刀尖上
- 2021-04-14 12:15
其实这是典型的利用链表求解的问题,但是此题用链表的话还需要应用一个长度为13的数组做辅助,所以我直接用数组来进行演示,将在手中的牌进行标记,将放到桌子上的牌进行赋值。
我在很小的时候我的姥爷就曾给我表演过这个魔术,当时我自己用扑克牌弄了将近两个小时才终于知道了这13张牌的顺序是什么,有兴趣的话你可以自己试一试,很有意思。
下面的代码你可以进行调试来帮助理解整个过程
#include
void main()
{
int poker[13];//十三张扑克牌
for(int i = 0;i<13;i++)//初始化
poker[i] = 0;//0代表牌还在手中,不为0代表放到了桌子上
int remain = 13;//手中剩余的扑克数
int j = 12;//从最下边开始抽牌
int order = 1;//当order为2时,将此时的牌放到桌子上
int number = 1;//从a开始
while(remain != 0)
{
if(j == -1)
{
j = 12;//返回最后一张牌
continue;
}
if(poker[j] != 0)//如果牌已不在手中,则到下一张牌
{
j--;
continue;
}
if(order == 2)
{
poker[j]= number++;//将扑克赋值
remain--;//手中剩余的牌数减1
order = 1;
continue;
}
order++;
j--;
}
//输出一开始小明手中扑克牌的顺序
for(i = 0; i < 13;i++)
printf("%d ",poker[i]);
}
想要写出一个程序重点在于理解这个过程,只有对这个过程熟悉了才有可能把它用代码来演示出来。
我要举报
大家都在看
推荐资讯