当我创建一个链表来复制费用经理时,我陷入了寻找费用最大的一天的问题。我不知何故设法通过遍历找到了total
的最大值,但无法打印与之相关的day
。请帮忙。
我的结构代码:
struct node{
int day;
int movies;
int groceries;
int travel;
int total;
struct node* left;
struct node* right;
};
void find_max()
{
struct node *new1 = start;
int max, c;
if(start == NULL) {
printf("List is emptyn");
return;
}
else {
max = start->total;
while(new1 != NULL) {
if(new1->total > max)
{
max = new1->total;
}
new1 = new1->right;
}
}
printf("The maximum spending was: %d",max);
}
当我尝试打印new1->day
时,这里(我不确定这叫什么。这是一个分支吗?(,它向我显示垃圾值或停止运行。
如何正确显示它?
编辑(代码(:
#include<stdio.h>
#include<stdlib.h>
struct node{
int day;
int movies;
int groceries;
int travel;
int total;
struct node* left;
struct node* right;
};
void maximumNode();
//Main goes here, where I choose the option using switch case. Say the example is case 3
case 3:
{
maximumNode();
break;
}
//End of main
void maximumNode() {
struct node *new1 = start;
struct node *max;
if(start == NULL) {
printf("List is emptyn");
return;
}
else {
max->total = start->total;
while(new1 != NULL) {
if(new1->total > max->total)
{
max->total = new1->total;
}
new1 = new1->right;
}
}
printf("The maximum spending was: %d and the day was: %dnn",max->total, max->day);
}
在这里,一旦我在将其添加到列表中后输入大小写 3,程序甚至无法运行。(当我把max
当作整数值时,它就运行了(。
编辑2:我刚刚重新运行了我的代码,显然即使在插入中我也犯了错误。很抱歉浪费大家的时间,感谢大家的支持。
我的插入码,以防万一:
void Insert(int a, int b, int c, int d)
{
struct node *temp,*t;
int total1=b+c+d;
temp=(struct node*)malloc(sizeof(struct node));
if(start==NULL)
{
start=temp;printf("%d", total1);
start->day=a;
start->movies=b;
start->groceries=c;
start->travel=d;
start->total=total1;
start->left=NULL;
start->right=NULL;
}
else
{
temp=start;
while(temp->right!=NULL)
{
temp=temp->right;
}
t=(struct node*)malloc(sizeof(struct node));
start->day=a;
start->movies=b;
start->groceries=c;
start->travel=d;
start->total=total1;
t->right=NULL;
t->left=temp;
temp->right=t;
}
printf("nnYour expense has been saved successfully!nn");
}
在您发布的代码的第一个版本中,您只是将最大值保留在整数中。如果您想查找值,这很好,但是它所在的节点的信息丢失了。
在评论中,我建议你把max
作为一个节点。您这样做了,但犯了几个错误:
- 你
max
未初始化,这意味着会发生不好的事情。(C-speak is "未定义的行为"。初始化max = start
。(看到没有初始化的指针定义应该会引发危险信号。如果您不知道要初始化什么,至少将其设为NULL
,以便以后可以检查NULL
。只是写struct node *max;
意味着max
有一个不确定的值,你甚至无法检查! -
然后,当你找到一个更好的节点时,不要设置
max->total
。这意味着您只需使用第一个节点作为最大值的存储,从而更改您不想要的列表数据。设置新节点:if (new1->total > max->total) max = new1;
(如果你仔细阅读我的评论,这就是我的建议。
让我们实现它并修复代码的一些语义问题,请参阅下面的注释:
const struct *node maximumNode()
{
const struct node *node = start;
const struct node *max = start;
while (node != NULL) {
if(node->total > max->total) {
max = node;
}
node = node->right;
}
return max;
}
注意事项:
该函数现在返回对具有最大
total
的节点的引用。然后,调用代码可以根据需要打印信息或以其他方式使用节点,例如:const struct node *max = maximumNode(); if (node) { printf("Max. total of %d was on day %d.n", node->totel, node->day; }
这比在函数中正确进行打印更干净。这也允许您在需要最大节点的其他上下文中使用相同的函数。
- 我已经在您的函数中
const struct node *
节点指针。这意味着您无法修改结构的内容。仅找到最大值意味着您只是检查列表,但不会更改它。使用此声明,编译器会抱怨尝试设置max->total
并且您会看到错误。 - 您不需要
NULL
的第一个测试。当start
== NULL, then also
节点 == NULLand
最大值 == NULL. That doesn't change, because the loop isn't entered and we terurn
NULL'时,这是我们在这种情况下能做的最好的事情。 - 我已将节点的名称从
new1
更改为node
.这是一个外观上的更改,但对我来说new
表明正在创建一个节点,但由于我们只是在检查,该名称可能会产生误导。小事很重要。(另外,我是一个吹毛求疵的人。
在花了长时间与@MOehm进行长时间的讨论后,这就是我得出的结论: 这段代码完全是@MOehm的,我做了一些小的更改。(向他致敬(
void maximumNode()
{
const struct node *node = h;
const struct node *max = h;
if (h==NULL)
{
printf("nnThe expense list is empty!nn");
}
else
{
while (node->next != NULL) {
if(node->total > max->total) {
max = node;
}
node = node->next;
}
if (node->next==NULL)
{
if (node->total > max->total)
{
max = node;
}
}
printf("Max. total of %d was on day %d.n",max->total, max->day);
return;
}
}
我什至对插入代码进行了一些更改。我已经使用并修改了从本网站获取的代码的插入部分。
void create()
{
int data;
int d,m,g,t;
int total1=0;
temp =(struct node *)malloc(1*sizeof(struct node));
temp->prev = NULL;
temp->next = NULL;
printf("nnDay: ");
scanf("%d",&d);
printf("nnEnter the expenses:n1. Movies: ");
scanf("%d",&m);
printf("2. Groceries: ");
scanf("%d",&g);
printf("3. Travel: ");
scanf("%d",&t);
total1 = m+g+t;
temp->day=d;
temp->movies=m;
temp->groceries=g;
temp->travel=t;
temp->total=total1;
}
void insert2()
{
if (h == NULL)
{
create();
h = temp;
temp1 = h;
}
else
{
create();
temp1->next = temp;
temp->prev = temp1;
temp1 = temp;
}
}
我没有对其余代码进行任何更改。
编辑1:在代码中编辑列表是否为空,即h==NULL