我正在尝试学习一点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的随机值,检查该对是否已经存在于列表中,如果不存在,则在末尾插入。它编译得很好,但运行程序会使它挂起。我在这里看不到任何无限循环。我尝试过num
等于2,但它仍然挂起。
删除对唯一值的检查可以填充和打印列表,但我仍然会遇到异常"读取位置0xCDCDD9的访问冲突"。
问题
你有一个逻辑错误。
您可以使用将几个值添加到列表中
q->next->xVal = rand() % 100;
q->next->yVal = rand() % 100;
然后检查它们是否存在于列表中。当然,unique
的返回值总是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.