“随机”值的链接列表,程序挂起

时间:2015-11-07 06:22:35

标签: c linked-list

我正在努力学习一点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,但它仍然挂起。

删除对唯一值的检查让我填写并打印列表,但我仍然遇到异常“访问冲突读取位置0xCDCDCDD9。”。

1 个答案:

答案 0 :(得分:3)

<强>问题

你有一个逻辑错误。

使用以下命令向列表中添加几个值:

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

然后检查它们是否存在于列表中。他们当然会这样做。 unique的返回值始终为false。因此,j永远不会增加,尽管j没有增加,但列表仍在增长。

<强>修正

  1. 获取随机数。
  2. 在将它们添加到列表之前检查它们是否是唯一的。
  3. 以下是我的看法。

    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.