【问题标题】:How to sort an arrays of pointers, without changing the original array in C如何在不更改 C 中的原始数组的情况下对指针数组进行排序
【发布时间】:2019-01-21 00:13:28
【问题描述】:

给定两个数组:int nums[N] 和 int *ptrs[N](N 是一个常数)。 我必须用一些数字初始化第一个数组。之后,我必须初始化第二个数组,所以第二个数组的每个元素都指向与第一个数组具有相同索引的元素。 (ptrs[0] 指向 nums[0],...)。

现在我必须编写一个以“ptrs”作为参数的函数,它以这样的方式修改指针,使第二个数组的第一个元素指向第一个数组中的最小数字,..)

不允许更改“nums-array”,我只能更改“ptrs-array”。

这是我已经拥有的代码,但是当我运行它时,“nums-array”也会发生变化。 我做错了什么?

    #include <stdio.h>
    #define N 6
    void sort(int *ptrs);
    int main()
    {
        int nums[N] = { 1,6,7,8,2,5 };
        int(*ptrs)[N];
        int i;
        ptrs = nums;



        sort(ptrs);

        for (i = 0; i < N; i++)



            printf("nummer is: %d en %d\n", (*ptrs)[i], nums[i]);


         return 0;
      }
      void sort(int *ptrs)
      {
        int i, j, tmp;


        for (i = 0; i < N; i++)

            for (j = i + 1; j < N; j++)

                if ((ptrs)[i] > (ptrs)[j])
                {
                    tmp = (ptrs)[i];
                    (ptrs)[i] = (ptrs)[j];
                    (ptrs)[j] = tmp;
                }

      }

【问题讨论】:

  • ptrs = nums; 并没有按照你的想法去做。
  • 那么我该怎么做才能让它发挥作用?

标签: c arrays sorting pointers numbers


【解决方案1】:

修复第一部分:

int main()
{
    int nums[N] = { 1,6,7,8,2,5 };
    int *ptrs[N];                    // fix
    int i;
    for(i = 0; i < N; i++)           // fix
        ptr[i] = nums+i;             // fix (or ptr[i] = &nums[i])

【讨论】:

    【解决方案2】:

    我找到了解决办法,谢谢大家的帮助!

    #include <stdio.h>
    #define N 6
    void sort(int ptrs[], int nums[]);
    
    int main()
    {
        int nums[N] = { 1,6,7,8,2,5 };
    
        int i,j,*p, *ptrs[N];
    
    
        for (i = 0; i < N; i++) {
                   ptrs[i] = &nums[i];
        }
    
    
    
    
        sort(ptrs, nums);
    
    
    
            return 0;
    }
    void sort(int *ptrs[], int nums[])
    {
        int i, j, tmp, p[N];
    
    
        for (i = 0; i < N; i++)
            p[i] = *ptrs[i];
    
    
    
    
        for(j = 0; j < N; j++)
            for (i = 0; i <= N; i++)
    
    
                if (p[i] > p[i+1])
                {
                    tmp = (ptrs)[i];
                    (ptrs)[i] = (ptrs)[i+1];
                    (ptrs)[i+1] = tmp;
                    for (i = 0; i < N; i++)
                        p[i] = *ptrs[i];
    
               }
    
    
            for (i = 0; i < N; i++)
                printf("nummer is: %d en %d\n", *ptrs[i], nums[i]);
            return;
    
    }
    

    【讨论】:

    • 欢迎您,很抱歉没有提供完整的解决方案,因为这是一个学校项目。但是,您的代码还有一个问题:您已经从糟糕的排序算法 N 平方变为 N 立方。尝试将最后一个循环移到 i 和 j 循环之外。
    猜你喜欢
    • 2012-03-24
    • 2013-04-13
    • 2018-01-12
    • 2021-06-09
    • 2016-04-24
    • 1970-01-01
    • 2019-10-26
    • 2012-08-25
    • 2021-12-02
    相关资源
    最近更新 更多