lun1ght 2024-03-16 05:27 采纳率: 75%
浏览 3
已结题

为什么从小到大排序是正常的,从大到小就会丢失第0项的地址

为什么如果if(strcmp(p[i],p[j])>0),就是正常从小到大输出的结果,但是如果是if(strcmp(p[i],p[j])<0),那么指针数组name[0]就会丢失,name[1]-name[4]没有丢失正常输出


#include <stdio.h>
#include <string.h>
int main()
{
    void px(char *p[],int n);
    char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
    px(name,5);
    int i;
    for(i=0;i<5;i++)
        printf("%s\n",name[i]);
    return 0;
}

void px(char *p[],int n)
{
    int i,j;
    char *t;
    for(i=0;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(strcmp(p[i],p[j])<0)
            {
                t=p[i];
                p[i]=p[j];
                p[j]=t;
            }
        }
    }
}
    

  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 2024-03-16 05:27
    关注

    lun1ght 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    问题出现在排序算法的实现上:

    在你的排序算法中,你使用的是冒泡排序的方法,从小到大排序的代码是正确的,但是从大到小排序时出现了问题。

    原因是在内层循环中,你使用的是strcmp(p[i],p[j])<0作为判断条件,这时候每次遇到相邻的元素需要交换位置时,你将较小的元素放在了较大的元素的位置上,这样会导致在后续的循环中会出现指针丢失的问题。

    解决方案:

    1. 在内层循环中,将判断条件改为strcmp(p[i],p[j])>0,这样可以保证按从大到小的顺序进行排序。

      • 修改后的排序算法代码如下所示:

        void px(char *p[],int n) {
            int i,j;
            char *t;
            for(i=0;i<=n;i++)
            {
                for(j=i+1;j<=n;j++)
                {
                    if(strcmp(p[i],p[j])>0)
                    {
                        t=p[i];
                        p[i]=p[j];
                        p[j]=t;
                    }
                }
            }
        }
        
    2. 在调用排序函数时,将数组大小改为n-1,因为数组下标是从0开始的。

      • 修改后的主函数代码如下所示:

        int main() {
            void px(char *p[],int n);
            char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
            px(name,4);
            int i;
            for(i=0;i<5;i++)
                printf("%s\n",name[i]);
            return 0;
        }
        

    这样修改后,无论是从小到大排序还是从大到小排序都能够正确输出结果,并且不会出现指针丢失的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月19日
  • 已采纳回答 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 晶体塑性有限元——Damask求解
  • ¥15 写出这个有没有人能写一下今天中午就要
  • ¥30 设计一个图形用户界面来控制你机械臂的运动
  • ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
  • ¥15 RPG游戏架构设计和开发方法
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变