具有多个元素的链表并找到最大的
Linked List with multiple elements and finding the largest
当我创建一个链接列表来复制一个费用经理时,我被困在寻找费用最高的那一天。我以某种方式设法通过遍历找到 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 empty\n");
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
(我不确定这叫什么。这是 b运行ch 吗?)时,它向我显示垃圾值或停止 运行宁。
如何正确显示?
编辑(代码):
#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 empty\n");
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: %d\n\n",max->total, max->day);
}
在这里,当我在将 case 3 添加到列表后键入它时,程序甚至没有 运行。 (它 运行 当我把 max
当作一个 int 值时)。
编辑 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("\n\nYour expense has been saved successfully!\n\n");
}
在您发布的代码的第一个版本中,您只是将最大值保留为整数。如果您想找到该值,那很好,但是丢失了它是哪个节点的信息。
在评论中,我建议您将 max
设为一个节点。你这样做了,但犯了几个错误:
- 你
max
未初始化,这意味着不好的事情会发生。 (C 表示 "undefined behaviour"。)初始化 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;
}
注意事项:
函数现在 returns 对具有最大值 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
node == NULLand
max == NULL. That doesn't change, because the loop isn't entered and we terurn
NULL` 时,这是我们在这种情况下所能做的最好的事情。
- 我已将节点名称从
new1
更改为 node
。这是一个表面上的变化,但 new
对我来说表明正在创建一个节点,但由于我们只是在检查,该名称可能会产生误导。小事情很重要。 (另外,我是个吹毛求疵的人。)
在与@MOehm 长时间讨论后,我得出了以下结论:
这段代码完全是 @MOehm's,我做了一些小改动。 (向他致敬)
void maximumNode()
{
const struct node *node = h;
const struct node *max = h;
if (h==NULL)
{
printf("\n\nThe expense list is empty!\n\n");
}
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;
}
}
我什至对插入代码做了一些修改。 I have used and modified the insertion part of the code taken from this website.
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("\n\nDay: ");
scanf("%d",&d);
printf("\n\nEnter 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
当我创建一个链接列表来复制一个费用经理时,我被困在寻找费用最高的那一天。我以某种方式设法通过遍历找到 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 empty\n");
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
(我不确定这叫什么。这是 b运行ch 吗?)时,它向我显示垃圾值或停止 运行宁。
如何正确显示?
编辑(代码):
#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 empty\n");
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: %d\n\n",max->total, max->day);
}
在这里,当我在将 case 3 添加到列表后键入它时,程序甚至没有 运行。 (它 运行 当我把 max
当作一个 int 值时)。
编辑 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("\n\nYour expense has been saved successfully!\n\n");
}
在您发布的代码的第一个版本中,您只是将最大值保留为整数。如果您想找到该值,那很好,但是丢失了它是哪个节点的信息。
在评论中,我建议您将 max
设为一个节点。你这样做了,但犯了几个错误:
- 你
max
未初始化,这意味着不好的事情会发生。 (C 表示 "undefined behaviour"。)初始化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;
}
注意事项:
函数现在 returns 对具有最大值
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
node == NULLand
max == NULL. That doesn't change, because the loop isn't entered and we terurn
NULL` 时,这是我们在这种情况下所能做的最好的事情。 - 我已将节点名称从
new1
更改为node
。这是一个表面上的变化,但new
对我来说表明正在创建一个节点,但由于我们只是在检查,该名称可能会产生误导。小事情很重要。 (另外,我是个吹毛求疵的人。)
在与@MOehm 长时间讨论后,我得出了以下结论: 这段代码完全是 @MOehm's,我做了一些小改动。 (向他致敬)
void maximumNode()
{
const struct node *node = h;
const struct node *max = h;
if (h==NULL)
{
printf("\n\nThe expense list is empty!\n\n");
}
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;
}
}
我什至对插入代码做了一些修改。 I have used and modified the insertion part of the code taken from this website.
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("\n\nDay: ");
scanf("%d",&d);
printf("\n\nEnter 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