冒泡排序和交换最大排序的C语言编程问题

冒泡排序和交换最大排序的C语言编程问题ps:最好能有必要的代码注释,谢谢大神!!
(题目要求将两个排序相关代码函数化)
题目如图

input.txt

6
Japan
USA
China
Germany
England
India

main.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

// è¯»å–文件函数  
char* read(char* acDirAndFileName)
{
    FILE* pFile = fopen(acDirAndFileName, "rb");
    if(pFile == NULL)
    {
        printf("read() å‡½æ•°æŠ¥é”™ï¼Œæ–‡ä»¶è¯»å–失败,该文件为:%s\n", acDirAndFileName);
        return NULL;
    }

    fseek(pFile, 0, SEEK_END);
    int iByteNum = ftell(pFile);
    rewind(pFile);

    char* acFile = (char*)malloc(iByteNum + 1);
    fread(acFile, 1, iByteNum, pFile);
    acFile[iByteNum] = '\0';

    fclose (pFile);
    return acFile;
}

// åˆ¤æ–­å­—符串是不是整数(小于 '9' å¤§äºŽ '0' çš„字符),如果不是返回0,如果是,返回有几个这样的字符。
int isInt(char* acStr)
{
    int iSize = 0;
    if(acStr[0] >= '0' && acStr[0] <= '9')
    {
        iSize ++; acStr ++;
        while(acStr[0] >= '0' && acStr[0] <= '9') {iSize ++; acStr ++;}
    }

    return iSize;
}

// åˆ¤æ–­å­—符串是不是一整行字符,如果不是返回0,如果是,返回有几个这样的字符。
int isStrLine(char* acStr)
{
    int iSize = 0;
    if(acStr[0] != '\n' && acStr[0] != '\r')
    {
        iSize ++; acStr ++;
        while(acStr[0] != '\n' && acStr[0] != '\r') {iSize ++; acStr ++;}
    }

    return iSize;
}

// å­—符串转整型
int strToInt(char* acStr, int iSize)
{
    int i, iIndex = 0, iNum = 0;
    if(acStr[0] < '0' || acStr[0] > '9')
        iIndex = 1;

    for(i=iIndex; i<iSize; i++)
        iNum += (int)pow(10, iSize - i - 1) * (acStr[i] - 48);
 
    if(acStr[0] == '-')
        iNum = - iNum;
 
    return iNum;
}

// å­—符串比较
_Bool comStr(char* acStrA, char* acStrB)
{
    int i, iSize, iA = strlen(acStrA), iB = strlen(acStrB);
    iSize = (iA > iB)?(iA):(iB);
    for(i=0; i<iSize; i++)
    {
        if(acStrA[i] == acStrB[i])
            continue;
        else if(acStrA[i] < acStrB[i])
            return 0;
        else
            return 1;
    }
    return 1;
}

// å†’泡排序
void bubbleSort(char** ppcArray, int iSize)
{
    char* acMin;
    int i, j, iIndex;
    for(i=0; i<iSize - 2; i++)
    {
        // æ‰¾åˆ°æœ€å°çš„字符串
        acMin = ppcArray[i];
        for(j=i+1; j<iSize; j++)
        {
            if(comStr(acMin, ppcArray[j]) == 1)
            {
                acMin = ppcArray[j];
                iIndex = j;
            }
        }
        // å†’泡
        for(j=iIndex; j>i; j--)
            ppcArray[j] = ppcArray[j - 1];
        ppcArray[i] = acMin;
    }
}

// äº¤æ¢æœ€å¤§æŽ’序
void swapSort(char** ppcArray, int iSize)
{
    char* acMax; char* acSwap;
    int i, j, iIndex;

    for(i=1; i<iSize; i++)
    {
        // æ‰¾åˆ°æœ€å¤§çš„字符串
        acMax = ppcArray[iSize - i];
        for(j=iSize-i-1; j>=0; j--)
        {
            if(comStr(acMax, ppcArray[j]) == 0)
            {
                acMax = ppcArray[j];
                iIndex = j;
            }
        }
        // æŠŠæœ€å¤§çš„字符串交换到底部
        acSwap = ppcArray[iSize - i];
        ppcArray[iSize - i] = acMax;
        ppcArray[iIndex] = acSwap;
    }
}

int main(void)
{
    // è¯»å–文件字符串
    char* pcStr = read("input.txt");
    //printf("%s\n", pcStr);

    int i, j, iSize, iNum, iIndex;
    char* pcStrA;
    // èŽ·å–文件开头的数字
    for(pcStrA=pcStr; pcStrA[0] != '\0'; pcStrA++)
    {
        iSize = isInt(pcStrA);
        if(iSize != 0)
            break;
    }
    iNum = strToInt(pcStrA, iSize);
    //printf("%d\n", iNum);

    // åˆ›å»ºäºŒçº§æŒ‡é’ˆåˆ†é…å†…存空间
    char** ppcArray = (char**)malloc(sizeof(char**)*(iNum + 1));
    ppcArray[iNum] = NULL;

    // è·³è¿‡æ–‡ä»¶å¼€å¤´çš„æ•°å­—
    pcStrA=pcStr + iSize;
    // ä¸ºæŒ‡é’ˆæ•°ç»„的元素分配内存空间,并把文件字符串中的每行字符串,复制到指针数组的元素指向的空间
    iIndex = 0;
    for(; pcStrA[0] != '\0'; pcStrA++)
    {
        iSize = isStrLine(pcStrA);
        if(iSize != 0)
        {
            ppcArray[iIndex] = (char*)malloc(iSize + 1);
            ppcArray[iIndex][iSize] = '\0';
            for(i=0; i<iSize; i++)
                ppcArray[iIndex][i] = pcStrA[i];
            iIndex ++;
            pcStrA += iSize;
        }
    }
    iSize = iIndex;

    // å†’泡排序
    //bubbleSort(ppcArray, iSize);

    // äº¤æ¢æœ€å¤§æŽ’序
    swapSort(ppcArray, iSize);

    // æ‰“印排序结果
    for(i=0; i<iSize; i++)
        printf("%s\n", ppcArray[i]);

    // é‡Šæ”¾å­—符串数组的内存空间
    for(i=0; i<iSize; i++)
        free(ppcArray[i]);
    free(ppcArray);
    // é‡Šæ”¾è¯»å–文件的内存空间
    free(pcStr);

    return 0;
}

温馨提示:答案为网友推荐,仅供参考
相似回答