【发布时间】:2021-09-08 13:58:31
【问题描述】:
我的任务是生成 50 到 80 范围内的随机数,如果生成的数字是偶数,则将其添加到偶数列表中,如果是奇数,则将其添加到奇数列表中。程序应该一直运行到两个列表都填满 10 个数字。列表中不允许重复。此代码打印 20 个不同的数字,并将重复项存储在列表中。所以我认为问题出在 count_odd、count_even 和检查重复项上,但我找不到解决方案。我还必须打印所有生成的数字以及最后的两个列表。链表中的数字应按降序排列
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
typedef struct list numbers;
typedef struct list* Pos;
int PrintRandom();
Pos CreateNew();
int PrintList(Pos);
struct list {
int number;
Pos next;
};
int PrintList(Pos P) {
if (P == NULL)
printf("Empty list.\n");
while (P != NULL) {
printf("%d\n", P->number);
P = P->next;
}
return 0;
}
Pos CreateNew() {
Pos q = NULL;
q = (Pos)malloc(sizeof(struct list));
if (q == NULL) return NULL;
q->next = NULL;
return q;
}
int PrintRandom() {
int x = 0, max = 80, min = 50;
x = (rand() % (max - min + 1) + min);
printf("Random number is : %d\n", x);
return x;
}
int main() {
srand(time(0));
Pos even, odd, q = NULL;
even = malloc(sizeof(numbers));
odd = malloc(sizeof(numbers));
even->next = odd->next = NULL;
int count_even = 0, count_odd = 0, j;
Pos head_p =even, head_n=odd;
while (count_even < 10 & count_odd < 10) {
j = PrintRandom();
if (j % 2 == 0) {
q = CreateNew();
if (q == NULL) return -1;
q->number = j;
while (even->next != NULL && even->next->number > q->number) {
even = even->next;
}
if (even->number== q->number)
free(q);
else
q->next = even->next;
even->next = q;
even =head_p;
count_even++;
}
else {
q = CreateNew();
if (q == NULL) return -1;
q->number = j;
while (odd->next != NULL && odd->next->number > q->number) {
odd = odd->next;
}
if (odd->number == q->number)
free(q);
else
q->next = odd->next;
odd->next = q;
odd = head_n;
count_odd++;
}
}
printf("Even numbers in list are:\n");
PrintList(head_p->next);
printf("Odd numbers in list are:n");
PrintList(head_n->next);
return 0;
}
【问题讨论】:
-
在你的问题中,你写的是:
"Program should run till both lists are filled with 10 numbers." 这句话不清楚。如果奇数列包含10个数字,偶数列包含9个数字,然后又生成一个奇数,应该怎么办?将其添加到奇数列表中,使其包含 11 个数字?还是应该丢弃该数字? -
如果奇数列表包含 10 个数字,偶数列表包含 9 个数字,然后生成另一个奇数,则应该跳过它,因为奇数列表“已满”
-
这是错误的:
while (count_even < 10 & count_odd < 10) {&运算符是按位与运算符,但您需要逻辑与运算符,即&&。 -
从一个预设值为 50 到 80 的数组开始。随机选择一个 index,将其替换为最上面的元素,并减少元素数。
-
有这么多选择,我认为Fisher-Yates shuffle 将是一个有效的算法。
标签: c list random duplicates