C 指针数组第二个最大值

Posted

技术标签:

【中文标题】C 指针数组第二个最大值【英文标题】:C Pointers Array 2nd Max 【发布时间】:2022-01-22 07:17:45 【问题描述】:

我正在尝试从数组中查找第二个最大数。出于某种原因,我的输出一直为零。

int main()

    int i,j;
    int arr[5],max=0,max2=0;
    int *(ptr)=arr;
    printf("Enter Array Elements: ");
    for(i=0;i<5;i++)
    
        scanf("%d",ptr+i);
    
        for(j=0;j<5;j++)
            if(max<*(ptr+j)&&max>max2)
            
                max=*(ptr)+j;
            
            else if(max2<*(ptr+j)&&max2<max)
            
                max2=*(ptr)+j;
            
        
    printf("\n2nd Maximum: %d",max2);

    

【问题讨论】:

OT:放下指针,这里没用。使用scanf("%d", &amp;a[i])a[j] 代替不可读的*(ptr)+j 【参考方案1】:

您的两个条件都将maxmax2 进行比较。由于它们都被初始化为0,因此这些条件都不满足。 相反,您需要先将当前值 (*(ptr+j)) 与最大数量进行比较,如果不满足该条件,则与第二个最大值进行比较:

for (j = 0; j < 5; j++) 
    int curr = *(ptr+j);
    if (curr >= max)
    
        max2 = max;
        max = curr;
    
    else if(curr > max2)
    
        max2 = curr;
    

【讨论】:

【参考方案2】:

最初maxmax2 彼此相等,因为它们设置为0

int arr[5],max=0,max2=0;

所以这两个 if 语句都不会将它们的条件评估为 true

        if(max<*(ptr+j)&&max>max2)
                         ^^^^^^^^ 
        //...

        else if(max2<*(ptr+j)&&max2<max)
                               ^^^^^^^^

因为max 不大于max2

此外,将 maxmax2 初始设置为零是错误的方法,因为用户只能向数组元素输入负值。在这种情况下,您将得到错误的最大值。

如果您想找到两个彼此不相等的最大值,除非数组包含所有彼此相等的元素,那么这种方法并不像您想象的那么简单。

首先你需要在数组中找到两个不相等的元素。例如

int max  = arr[0];
int max2 = arr[0];

i = 1;

while ( i < 5 && arr[i-1] == arr[i] ) ++i;

if ( i != 5 )

    if ( max < arr[i] )
    
        max = arr[i];
    
    else
    
        max2 = arr[i];
    

    for ( ; i < 5; i++ )
    
        if ( max < arr[i] )
        
            max2 = max;
            max = arr[i];
        
        else if ( max2 < arr[i] )
        
            max2 = arr[i];
        
    
   

if ( max != max2 )

    printf("\n2nd Maximum: %d\n", max2 );  

else

    printf("\nAll elements are equal to %d\n", max2 );

【讨论】:

【参考方案3】:

你把事情复杂化了。在不使用指针的情况下先编写它可能会有所帮助,这样您就可以可视化正在发生的事情然后重写它。

如果您不想要可以相等的值,请删除 if 语句中的等号。

其次,这仍然存在潜在问题。 如果你有所有负数并且第一个是最高的。 max2 永远不会被设置。 为避免该问题,您需要将所有值从低到高排序,或者运行两个循环,一个用于 max,一个用于 max2。它甚至比这更复杂一些。 最好的选择是排序然后运行循环以避免问题。

如果你做的很好,你的工作大部分就完成了。如果您允许相等的值,则从顶部开始的第二个值将是最大值 2。 如果不是,您只需要继续下去,直到找到下一个不同的值。

int main()

    int arr[5],max=0,max2=0;
    int *(ptr) = arr;
    printf("Enter Array Elements: ");
    for (int i=0;i<5;i++)
        scanf("%d",ptr+i);
    
    /*
    max = arr[0];
    for (int j=1;j<5;j++)
        if(arr[j]>=max)
            max2 = max;
            max = arr[j];
        
    */
    max = *(ptr);
    for(int j = 1;j<5;j++)
        if(*(ptr+j)>=max)
            max2 = max;
            max = *(ptr+j);
        
    
    printf("\n2nd Maximum: %d",max2);
    return 0;

【讨论】:

以上是关于C 指针数组第二个最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何增加 C 中的指针(二维数组)

二维数组数组指针以及指针数组

c ++对象数组+带有引用和指针的参数

C语言学习指针补充

C语言指针进阶第二站:指针数组!

调整数组中的顺序使奇数位于偶数前边