0

编写程序以使用动态内存分配查找最大数。我已经
编写了以下代码,
排序部分存在一些问题我正在按指针进行选择排序。但是排序没有正确完成.....我们可以通过指针进行选择排序我是否应用了正确的方法?

         #include<stdio.h>
         #include<stdlib.h>  
         main()
         {

            int i,j,n,temp;
            int *data;
            printf("enter total no of elements:");
            scanf("%d",&n);
            data=(int*)calloc(n,sizeof(int));
            printf("\n");
            for(i=0;i<n;i++)
            {
                         printf("enter number %d:",i+1);
                         scanf("%d",data+i);
            }
           for(i=0;i<n;i++)
           {
                   printf("%d\t",*(data+i));
            }
           printf("\n");
           for(i=0;i<n;i++)
           {
                   for(j=i+1;j<n;j++)
               {
                       if(*(data)>*(data+j))
                   {
                        temp=*(data);
                        *(data)=*(data+j);
                        *(data+j)=temp;
                    }
               }


            }
            for(i=0;i<n;i++)
            {
                 printf("%d\t",*(data+i));
            } 
            printf("largest element is %d\t",*(data+n-1));
         } 

输出:

         enter total no of elements:5

         enter number 1:2
         enter number 2:10
         enter number 3:12
         enter number 4:1
         enter number 5:0
         2  10  12  1   0   
         0  10  12  2
4

6 回答 6

2

您需要对代码进行少量修改

   for(i=0;i<n-1;i++) //change here
       {
               for(j=i+1;j<n;j++)
           {
                   if(*(data+i)>*(data+j)) //here
               {
                    temp=*(data+i);      //here
                    *(data+i)=*(data+j); //here
                    *(data+j)=temp;
                }
           }  

您总是将 first element( *data) 与*(data+j). 你需要*(data+i)比较*(data+j)

于 2013-10-23T14:48:26.267 回答
1

本节:

if(*(data)>*(data+j))
{
    temp=*(data);
    *(data)=*(data+j);
    *(data+j)=temp;
}

只考虑第一个元素 ( data[0]) 和元素 j ( data[j])。

我认为您真的是要考虑data[i]与。data[j]


要问自己的问题

  • 为什么我要写for(i)循环?
  • i实际使用的变量在哪里?
于 2013-10-23T14:49:42.433 回答
1

这是因为您总是将它与第一个元素进行比较。它应该是

for(i=0;i<n;i++)
       {
               for(j=i+1;j<n;j++)
           {
                   if(*(data+i)>*(data+j))
               {
                    temp=*(data+i);
                    *(data+i)=*(data+j);
                    *(data+j)=temp;
                }
           }


        }
于 2013-10-23T15:09:25.497 回答
0

请注意,在 C 中,您可以使用data[i]而不是*(data + i). 该算法将找到最大的(如果您的问题假设这个)数字。让data成为您的数组,n将是您的数组的大小,并且temp将是最大的数组。

temp = data[0];
for(i = 1; i < n; ++i)
{
    if (data[i] > temp)
        temp = data[i];
}

或绝对

i = 0;
temp = data[i++];
while(i < n)
{
    if (data[i] > temp)
        temp = data[i];
}

你已经实现了排序算法。如果您只想找到最大的数字,请使用我的代码段而不是您的两个嵌套 for 循环。

于 2013-10-23T14:52:24.903 回答
0
       for(i=0;i<n;i++)
       {
               for(j=i+1;j<n;j++)
           {
                   if(*(data)>*(data+j))
               {
                    temp=*(data);
                    *(data)=*(data+j);
                    *(data+j)=temp;
                }
           }


        }

您通过运行到 n-1 的外部 for 循环实现了什么?

于 2013-10-23T14:56:56.047 回答
0
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i, num;
    float *data;
    printf("Enter total number of elements(1 to 100): ");
    scanf("%d", &num);
    // Allocates the memory for 'num' elements.
    data = (float*) calloc(num, sizeof(float));
    if(data == NULL)
    {
        printf("Error!!! memory not allocated.");
        exit(0);
    }
    printf("\n");
    // Stores the number entered by the user.
    for(i = 0; i < num; ++i)
    {
       printf("Enter Number %d: ", i + 1);
       scanf("%f", data + i);
    }
    // Loop to store largest number at address data
    for(i = 1; i < num; ++i)
    {
       // Change < to > if you want to find the smallest number
       if(*data < *(data + i))
           *data = *(data + i);
    }
    printf("Largest element = %.2f", *data);
    return 0;
}
于 2019-07-08T17:19:25.947 回答