"random" 个值的链表,程序挂起
Linked list of "random" values, program hangs
我正在尝试学习一点 C,现在正在处理链表。我定义了一个链表:
struct data {
int xVal;
int yVal;
struct data *next;
};
我想做的是在链表中插入num
对值,但每一对必须是唯一的。
void addToList(num) {
srand(time(NULL));
struct data *list = NULL;
list = malloc(sizeof(struct data));
struct data *q = list;
list->xVal = rand() % 100;
list->yVal = rand() % 100;
int j = 0;
while (j < num-1) {
q->next = malloc(sizeof(struct data));
q->next->xVal = rand() % 100;
q->next->yVal = rand() % 100;
if (unique(list, q->next->xVal, q->next->yVal)) {
q = q->next;
j++;
}
}
}
bool unique(struct data *list, int x, int y) {
struct data *q = list;
while (q->next != NULL) {
if (q->xVal = x && q->yVal == y) { return false; }
q = q->next;
}
return true;
}
它的作用是为 xVal
和 yVal
生成一个 1-100 的随机值,检查该对是否已存在于列表中,如果不存在则插入到末尾。它编译得很好,但是 运行ning 程序使它挂起。我在这里看不到任何无限循环。我试过 num
等于 2 但它仍然挂起。
取消对唯一值的检查让我可以填写并打印列表,但我仍然 运行 进入异常 "Access violation reading location 0xCDCDCDD9."。
问题
你有逻辑错误。
您使用以下方法向列表中添加了几个值:
q->next->xVal = rand() % 100;
q->next->yVal = rand() % 100;
然后检查它们是否存在于列表中。他们当然知道。来自 unique
的 return 值始终是 false
。因此,j
永远不会递增,并且尽管 j
没有递增,但列表仍在不断增长。
修复
- 获取随机数。
- 在将它们添加到列表之前检查它们是否唯一。
这是我的看法。
void addToList(num) {
srand(time(NULL));
struct data *list = NULL;
list = malloc(sizeof(struct data));
struct data *q = list;
list->xVal = rand() % 100;
list->yVal = rand() % 100;
int j = 0;
while (j < num-1) {
int x = rand() % 100;
int y = rand() % 100;
if ( unique(list, x, y) ) {
q->next = malloc(sizeof(struct data));
q->next->xVal = x;
q->next->yVal = y;
q->next->next = NULL; // Make sure the list has a clean end
q = q->next;
j++;
}
}
}
还有...
您在 unique
中也有错别字。
if (q->xVal = x && q->yVal == y) { return false; }
应该是:
if (q->xVal == x && q->yVal == y) { return false; }
// ^^ Need to compare, not assigh.
我正在尝试学习一点 C,现在正在处理链表。我定义了一个链表:
struct data {
int xVal;
int yVal;
struct data *next;
};
我想做的是在链表中插入num
对值,但每一对必须是唯一的。
void addToList(num) {
srand(time(NULL));
struct data *list = NULL;
list = malloc(sizeof(struct data));
struct data *q = list;
list->xVal = rand() % 100;
list->yVal = rand() % 100;
int j = 0;
while (j < num-1) {
q->next = malloc(sizeof(struct data));
q->next->xVal = rand() % 100;
q->next->yVal = rand() % 100;
if (unique(list, q->next->xVal, q->next->yVal)) {
q = q->next;
j++;
}
}
}
bool unique(struct data *list, int x, int y) {
struct data *q = list;
while (q->next != NULL) {
if (q->xVal = x && q->yVal == y) { return false; }
q = q->next;
}
return true;
}
它的作用是为 xVal
和 yVal
生成一个 1-100 的随机值,检查该对是否已存在于列表中,如果不存在则插入到末尾。它编译得很好,但是 运行ning 程序使它挂起。我在这里看不到任何无限循环。我试过 num
等于 2 但它仍然挂起。
取消对唯一值的检查让我可以填写并打印列表,但我仍然 运行 进入异常 "Access violation reading location 0xCDCDCDD9."。
问题
你有逻辑错误。
您使用以下方法向列表中添加了几个值:
q->next->xVal = rand() % 100;
q->next->yVal = rand() % 100;
然后检查它们是否存在于列表中。他们当然知道。来自 unique
的 return 值始终是 false
。因此,j
永远不会递增,并且尽管 j
没有递增,但列表仍在不断增长。
修复
- 获取随机数。
- 在将它们添加到列表之前检查它们是否唯一。
这是我的看法。
void addToList(num) {
srand(time(NULL));
struct data *list = NULL;
list = malloc(sizeof(struct data));
struct data *q = list;
list->xVal = rand() % 100;
list->yVal = rand() % 100;
int j = 0;
while (j < num-1) {
int x = rand() % 100;
int y = rand() % 100;
if ( unique(list, x, y) ) {
q->next = malloc(sizeof(struct data));
q->next->xVal = x;
q->next->yVal = y;
q->next->next = NULL; // Make sure the list has a clean end
q = q->next;
j++;
}
}
}
还有...
您在 unique
中也有错别字。
if (q->xVal = x && q->yVal == y) { return false; }
应该是:
if (q->xVal == x && q->yVal == y) { return false; }
// ^^ Need to compare, not assigh.