我正在为类做一个项目,我在其中创建一个包含两个随机1-6卷及其总数的结构的有序链表。我正在尝试创建一个包含两列的表。左栏将是数字1-13(所有可能的总数加上两个不可能的值1和13),右栏将是每个可能总数的出现次数。
这是我为执行此任务而写的一个函数。
void table(struct node * roll_list){
int i;
int count;
int total;
for(i = 1; i < 14; i++){
count = 0;
while(roll_list){
total=roll_list->total;
if(i==total){
count++;
roll_list = roll_list->next;
}else{
roll_list = roll_list->next;
}
}
printf("%d : %d\n",i,count);
}
}
该函数包含一个执行13次的for循环。对于每个i
值,变量count
设置为0,并执行贯穿列表的while
循环。 while
循环内部是if else
语句。如果i
等于当前节点总数,则count
变量会递增,然后我们将移动到下一个节点。否则,我们移动到下一个节点而不增加i
变量。
完成while
循环后,print语句将打印两列中每一列的行。然后for
循环重新开始下一个i
值等。
我遇到的问题是出现次数列的输出始终为零,这表明count变量没有递增。
我有另一个函数可以打印一个稍微不同的表,并且工作正常。
void print_list(struct node * roll_list){
while(roll_list){
printf("Roll one: Dice01: %d, Dice02: %d, Total: %d\n", roll_list->dice01, roll_list->dice02, roll_list->total );
roll_list = roll_list->next;
}
}
所以这些值都在列表和所有内容中。
答案 0 :(得分:0)
您无法为每个循环初始化roll_list
。
您应该使用另一个变量来循环迭代。
void table(struct node * roll_list){
struct node * roll;
int i;
int count;
int total;
for(i = 1; i < 14; i++){
count = 0;
roll = roll_list;
while(roll){
total=roll->total;
if(i==total){
count++;
roll = roll->next;
}else{
roll = roll->next;
}
}
printf("%d : %d\n",i,count);
}
}
替代方式:如果最大数量是固定的,为什么不在一个循环中计算所有count
?
void table(struct node * roll_list){
int i;
int count[14] = {0}; /* initialize all elements to zero */
int total;
while(roll_list){
total=roll_list->total;
if(1 <= total && total < 14){
count[total]++;
}
roll_list = roll_list->next;
}
for (i = 1; i < 14; i++){
printf("%d : %d\n",i,count[i]);
}
}
答案 1 :(得分:0)
您需要再次将roll_list指向头指针;
void table(struct node * roll_list){
int i;
int count;
int total;
struct node *head = roll_list;
for(i = 1; i < 14; i++){
count = 0;
roll_list = head;
while(roll_list){
total=roll_list->total;
if(i==total){
count++;
roll_list = roll_list->next;
}else{
roll_list = roll_list->next;
}
}
printf("%d : %d\n",i,count);
}
}