简体   繁体   English

我相信我对程序中的指针感到困惑

[英]I believe I am getting confused with the pointers in my program

Below I created a function that enters a while loop.下面我创建了一个进入 while 循环的函数。 In the while loop an if statement is called to traverse the list and check the numbers to see which one is the largest and which one is the smallest.在 while 循环中,调用 if 语句遍历列表并检查数字以查看哪个最大,哪个最小。 When I run the program only one printf() is called, and prints the same printf() more than once.当我运行程序时,只调用一个printf() ,并且多次打印相同的printf() It seems to pick two numbers and print them under the same printf() function.I know that firstNumber = firstNumber->next;似乎选择两个数字并在同一个printf()函数下打印它们。我知道firstNumber = firstNumber->next; is supposed to traverse the list.应该遍历列表。 Isn't secondNumber = secondNumber->next->next;是不是secondNumber = secondNumber->next->next; supposed to point to the next number in the list?应该指向列表中的下一个数字?

typedef struct A_NewNumber {
    struct A_NewNumber *next;
    double newNum;
} NewNumber;

void NumberSize(NewNumber *start) {

    NewNumber *firstNumber = start;
    NewNumber *secondNumber = start;

    if(start != NULL) {
        while (secondNumber != NULL && secondNumber->next != NULL) {
            secondNumber = secondNumber->next->next;
            firstNumber = firstNumber->next;
            if(secondNumber > firstNumber) {
                printf("The biggest number is:%lf \n",secondNumber->newNum);
            } else {
                printf("The smallest number is:%lf \n",firstNumber->newNum);
            }
            firstNumber = firstNumber->next;
        }
    }
}

Example run of complete program:完整程序的示例运行:

 Please enter a number or
'quit' to stop or 'print' to print/calculate
12
Please enter a number or
'quit' to stop or 'print' to print/calculate
13
Please enter a number or
'quit' to stop or 'print' to print/calculate
14
Please enter a number or
'quit' to stop or 'print' to print/calculate
15
Please enter a number or
'quit' to stop or 'print' to print/calculate
16
Please enter a number or
'quit' to stop or 'print' to print/calculate
17
Please enter a number or
'quit' to stop or 'print' to print/calculate
print
Numbers:12.000000
Numbers:13.000000
Numbers:14.000000
Numbers:15.000000
Numbers:16.000000
Numbers:17.000000

The biggest number is:14.000000
The biggest number is:16.000000
The smallest number is:17.000000

Comparison inside if() should be on value, not on pointer. if()内部的比较应该在值上,而不是在指针上。

if( num1 > num2) {
    // Do something.
} else {
    // Do something else.
}

It is because you are executing this firstNumber = firstNumber->next;那是因为你在执行这个firstNumber = firstNumber->next; statement twice inside while() loop.while()循环中声明两次。

firstNumber = firstNumber->next;
firstNumber = firstNumber->next;

This makes secondNumber == firstNumber;这使得secondNumber == firstNumber;

Can you show what the result is?你能说明结果是什么吗?

I believe that the problem is the assignment of firstNumber and secondNumber .我认为问题在于firstNumbersecondNumber的分配。 They do seem to point to the same object.它们似乎确实指向同一个对象。 As a consequence, modifying one will modify the other.因此,修改一个将修改另一个。 Moreover, I think it is safe to keep track of the head of the list.此外,我认为跟踪列表的头部是安全的。 I would have done something like this:我会做这样的事情:

void NumberSize(NewNumber *start){
   if(start==NULL){
      printf('empty list');
      return;
   }
   double high = start->newNum;
   double small= start->newNum;
   NewNumber *iterator = start->next;

   while(iterator!=NULL){
      if(iterator->newNum > high){
         high = iterator->newNum;
      }
      if(iterator->newNum < small){
         small = iterator->newNum;
      }
      iterator = iterator->next;
   }
   printf("The biggest number is:%lf \n",high);
   printf("The smallest number is:%lf \n",small);
}

I m not sure if that's what you wanted to achieve...我不确定这是否是您想要实现的目标...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM