几天来我一直在尝试查找此代码的问题,但仍然找不到。这里的主要问题是,在打印每个节点的值时,它会尝试打印一个额外的节点并组成新值。
代码的工作方式如下,例如:我输入数字 10,11,15,如果节点的所有三个数字的总和大于 20,那么它会在前面添加双精度,因此结果将是:20,22,30 ||10,11,15.
每次我尝试在Visual Studio Code中执行此代码时,程序都会打印: 20,22,30 ||10,11,15 ||0,26345856,301989906。 如您所见,程序尝试打印另一个不存在的节点,以便它组成值。我已经尝试了一些在线编译器,这不是问题,所以我想知道的是我的代码中是否有任何错误,或者它是否是编译器。
#include <stdio.h>
#include <stdlib.h>
typedef struct list{
int num;
int num1;
int num3;
struct list *next;
}node;
void create (node *p){
printf("Input first number: ");
scanf("%d",&p->num);
if (p->num==0)
p->next=NULL;
else{
printf("Input second number: ");
scanf("%d",&p->num1);
printf("Input third number: ");
scanf("%d",&p->num3);
p->next=(node*)malloc(sizeof(node));
create (p->next);
}
}
void show (node *p){
if (p->next !=NULL){
printf ("n%d",p->num);
printf ("n%d",p->num1);
printf ("n%d",p->num3);
show (p->next);
}
}
node* add(node *p){
node *aux;
if((p->num+p->num1+p->num3)>20){
aux=(node *)malloc(sizeof(node));
aux->num=p->num*2;
aux->num1=p->num1*2;
aux->num3=p->num3*2;
aux->next=p;
p=aux;
}
return p;
}
void add2 (node *p){
node *aux=NULL;
while(p->next!=NULL){
if((p->next->num +p->next->num1+ p->next->num3)>20){
aux=(node *)malloc(sizeof(node));
aux->num=p->next->num*2;
aux->num1=p->next->num1*2;
aux->num3=p->next->num3*2;
aux->next=p->next;
p->next=aux;
p=p->next;
}
p=p->next;
}
}
int main(){
node *prin=NULL;
prin=(node*)malloc(sizeof(node));
create(prin);
printf("Input numbers were: ");
show (prin);
prin=add(prin);
add2(prin->next);
printf("nList with added nodes: ");
show(prin);
}
您总是在列表底部创建一个"虚拟"节点。例如,如果输入0
作为第一个输入,则将有一个单条目列表,其中仅初始化num
(设置为该0
)和next
(设置为NULL
)成员。num1
和num3
字段由create
函数保持未初始化状态。同样,如果在给定的测试用例中,您为最后两个字段输入(并初始化)实际值,则在下次调用create
时仍将创建一个新的"foot"节点。
碰巧的是,在您的系统上,这些未初始化的数据字段具有"随机"值,加起来超过 20 个。(这是 C 标准完全允许的,但默认情况下,某些编译器和/或平台会将未初始化的数据设置为零。
因此,在对add
函数的调用中,if
测试条件
if ((p->num + p->num1 + p->num3) > 20) {
//...
将评估为TRUE
,并将添加一个新节点,num1
和num3
的值是原始"随机"值的两倍。
要解决此问题,请在create
函数中将num1
和num3
字段设置为零(或其他一些小/负数),当为num
字段输入"哨兵零"输入结束标记时:
void create(node* p)
{
printf("Input first number: ");
scanf("%d", &p->num);
if (p->num == 0) {
p->next = NULL;
p->num1 = 0; // You MUST ensure that the sum of these two numbers
p->num3 = 0; // is LESS THAN 20 ... or a new node will be created
}
else {
printf("Input second number: ");
scanf("%d", &p->num1);
printf("Input third number: ");
scanf("%d", &p->num3);
p->next = (node*)malloc(sizeof(node));
create(p->next);
}
}
编辑:要查看此"错误"是如何发生的,请尝试将num1
字段设置为特定数字(例如42),并保留未初始化num3
。然后,只有一个"编造"值将无法解释 - 另一个值将是你指定的两倍(所以,84)。恕我直言,这将是一个很好的练习。