c语言 - "random"值链表,程序挂起



我正在尝试学习一点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的随机值,检查该对是否已经存在于列表中,如果不存在,则在末尾插入。它编译得很好,但运行程序会使它挂起。我在这里看不到任何无限循环。我尝试过num等于2,但它仍然挂起。

删除对唯一值的检查可以填充和打印列表,但我仍然会遇到异常"读取位置0xCDCDD9的访问冲突"。

问题

你有一个逻辑错误。

您可以使用将几个值添加到列表中

    q->next->xVal = rand() % 100;
    q->next->yVal = rand() % 100;

然后检查它们是否存在于列表中。当然,unique的返回值总是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.

相关内容

  • 没有找到相关文章

最新更新