"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;
}

它的作用是为 xValyVal 生成一个 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 没有递增,但列表仍在不断增长。

修复

  1. 获取随机数。
  2. 在将它们添加到列表之前检查它们是否唯一。

这是我的看法。

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.