循环链表问题
魔术师发牌,第n张牌空n个位置,假定一共13张牌编译器没报错,可能是循环写错了?{:10_266:}
看看有什么地方错了?
#include <stdio.h>
#include <stdlib.h>
#define CardNumber 13
typedef struct node
{
int data;
struct node *next;
} sqlist, *linklist;
linklist CreateLinkList();
void Magician(linklist);
void DestoryList(linklist p);
int main(void)
{
linklist p;
int i;
p = CreateLinkList();
Magician(p);
printf("按如下顺序排列:\n");
for (i = 0; i < CardNumber; i++)
{
printf("黑桃%d", p->data);
p = p->next;
}
DestoryList(p);
return 0;
}
linklist CreateLinkList()
{
linklist head = NULL;
linklist p = NULL;
head->next = p;
int i, n;
n = CardNumber;
for (i = 0; i < n; i++)
{
p = (linklist)malloc(sizeof(sqlist));
p->data = 0;
p = p->next;
}
p->next = head;
return head;
}
void Magician(linklist p)
{
int n, count, i;
p->data = 1;
count = 2;
while (1)
{
for (i = 0; i < count; i++)
{
p = p->next;
if (p->data != 0)
{
p = p->next;
i--;
}
}
if (p->data == 0)
{
p->data = count;
count++;
}
if (count == 14)
{
break;
}
}
p = p->next;
}
void DestoryList(linklist p)
{
linklist temp = p;
for (int j = 0; j < CardNumber; j++)
{
temp = p;
p = p->next;
free(temp);
}
} linklist head = NULL;
linklist p = NULL;
head->next = p;
head 没有指向对象
head->next 访问 next 是错误的
linklist CreateLinkList()
{
// linklist head = NULL;
linklist head = malloc(sizeof(*head));
linklist p = NULL;
head->next = p;
int i, n;
n = CardNumber;
for (i = 0; i < n; i++)
{
p = (linklist)malloc(sizeof(sqlist));
p->data = 0;
p = p->next;
}
p->next = head;
return head;
} 人造人 发表于 2021-8-13 16:45
按照你的改啦,还是跑不出来啊
linklist head = malloc(sizeof(*head));是不是应该写成
linklist head = (linklist)malloc(sizeof(sqlist)); 焦糖橙子 发表于 2021-8-13 17:04
按照你的改啦,还是跑不出来啊
linklist head = malloc(sizeof(*head));是不是应该写成
linklist head...
不是这样 linklist head = (linklist)malloc(sizeof(sqlist));
是这样 linklist head = malloc(sizeof(*head));
错误太多了
#include <stdio.h>
#include <stdlib.h>
#define CardNumber 13
typedef struct node
{
int data;
struct node *next;
} sqlist, *linklist;
linklist CreateLinkList();
void Magician(linklist);
void DestoryList(linklist p);
int main(void)
{
//linklist p;
linklist p, q;
int i;
//p = CreateLinkList();
q = p = CreateLinkList();
Magician(p);
printf("按如下顺序排列:\n");
for (i = 0; i < CardNumber; i++)
{
//printf("黑桃%d", p->data);
printf("黑桃: %d, ", p->data);
p = p->next;
}
//DestoryList(p);
DestoryList(q);
return 0;
}
linklist CreateLinkList()
{
linklist head = NULL;
//linklist p = NULL;
//head->next = p;
//int i, n;
int i;
//n = CardNumber;
//for (i = 0; i < n; i++)
for (i = 0; i < CardNumber; i++)
{
linklist p = malloc(sizeof(*p));
p->data = 0;
p->next = head;
head = p;
//p = p->next;
}
//p->next = head;
return head;
}
void Magician(linklist p)
{
//int n, count, i;
int count, i;
p->data = 1;
count = 2;
// 下面这个循环看不懂
// 不知道你要做什么
/*
while (1)
{
for (i = 0; i < count; i++)
{
p = p->next;
if (p->data != 0)
{
p = p->next;
i--;
}
}
if (p->data == 0)
{
p->data = count;
count++;
}
if (count == 14)
{
break;
}
}
p = p->next;
*/
}
void DestoryList(linklist p)
{
//linklist temp = p;
linklist temp;
for (int j = 0; j < CardNumber; j++)
{
temp = p;
p = p->next;
free(temp);
}
}
没有掌握 C 的指针
指针的使用上基本全错
本帖最后由 焦糖橙子 于 2021-8-13 19:51 编辑
人造人 发表于 2021-8-13 17:25
错误太多了
我重新修改了一下CreateLinkList函数,已经输出成功了,
那个while循环是为了判断当前位置是否有牌
{:10_266:}又去补了一遍结构体指针
#include <stdio.h>
#include <stdlib.h>
#define CardNumber 13
typedef struct node
{
int data;
struct node *next;
} sqlist, *linklist;
linklist CreateLinkList();
void Magician(linklist);
void DestoryList(linklist p);
int main(void)
{
linklist p;
int i;
p = CreateLinkList();
Magician(p);
printf("按如下顺序排列:\n");
for (i = 0; i < CardNumber; i++)
{
printf("黑桃%d ", p->data);
p = p->next;
}
DestoryList(p);
return 0;
}
linklist CreateLinkList()
{
linklist head = (linklist)malloc(sizeof(sqlist));
linklist p = head;
int i, n;
n = CardNumber;
for (i = 0; i < n; i++)
{
p->next = (linklist)malloc(sizeof(sqlist));
p->data = 0;
p = p->next;
}
p->next = head;
return head;
}
void Magician(linklist p)
{
int count, i;
p->data = 1;
count = 2;
while (1)
{
for (i = 0; i < count; i++)
{
p = p->next;
if (p->data != 0)
{
p = p->next;
i--;
}
}
if (p->data == 0)
{
p->data = count;
count++;
}
if (count == 14)
{
break;
}
}
p = p->next;
}
void DestoryList(linklist p)
{
linklist temp = p;
for (int j = 0; j < CardNumber; j++)
{
temp = p;
p = p->next;
free(temp);
}
}
焦糖橙子 发表于 2021-8-13 17:55
我重新修改了一下CreateLinkList函数,已经输出成功了,
那个while循环是为了判断当前位置是否有牌
{ ...
这个程序死循环
人造人 发表于 2021-8-13 18:16
这个程序死循环
我在里面加了一个break,满足条件就出来了{:10_297:} 焦糖橙子 发表于 2021-8-13 19:17
我在里面加了一个break,满足条件就出来了
我当然看到你写了 break
我说你的程序死循环了,是我真的运行你的程序,然后发现程序死循环了
PS D:\Code\S2E20> cd "d:\Code\S2E20\" ; if ($?) { g++ S2E20.cpp -o S2E20 } ; if ($?) { .\S2E20 }
按如下顺序排列:
黑桃1 黑桃11 黑桃2 黑桃12 黑桃5 黑桃3 黑桃6 黑桃0 黑桃9 黑桃4 黑桃10 黑桃7 黑桃13
PS D:\Code\S2E20>
我这边可以跑啊,我用的vscode
页:
[1]