我正在努力学习一点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,但它仍然挂起。
删除对唯一值的检查让我填写并打印列表,但我仍然遇到异常“访问冲突读取位置0xCDCDCDD9。”。
答案 0 :(得分:3)
<强>问题强>
你有一个逻辑错误。
使用以下命令向列表中添加几个值:
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.