使用C中的字符串升序插入排序时遇到问题

时间:2014-06-20 15:12:46

标签: c string strcpy insertion-sort

我无法在c中整理出一个名单。我有用于对名称进行排序的代码,但是当我将它们打印出来时,它们仍然与它们在开头时的顺序相同,所以有些东西是不正确的。所以我需要帮助的功能是sort_data函数。我将发布我的所有代码,以便它们可以帮助你们帮助我!非常感谢,这个功能整个早上一直在杀我。

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

#define MAX_STRING_LEN 25

void insert_data(char **strings, const char* filename, int size);
void allocate(char ***strings, int size);
void sort_data(char **strings, int size);

int main(int argc, char* argv[]){

    if(argc != 4){
            printf("Wrong number of args");
    }

    char **pointer;
    int size = atoi(argv[1]);


    allocate(&pointer, size);
    insert_data(pointer, argv[2], size);
    sort_data(pointer,size);
}

void sort_data(char **strings, int size){

    int i, j;
    char temp[MAX_STRING_LEN];

    for( i = 1; i < size; i++){
            strcpy(temp, strings[i]);
            j = i - 1;
            while( j >= 0 && strcmp(strings[i], temp) > 0)
            {
                    strcpy(strings[j+1], strings[j]);
                    j = j - 1;
            }
            strcpy(strings[j+1], temp);

    }

    int z;
    for(z = 0; z < size; z++){
    printf("\n%s", strings[z]);
    }
}

void allocate(char ***strings, int size){

    int i;
    *strings =  malloc(sizeof(**strings) * size);

    for( i = 0; i < size; i++)
    {
    (*strings)[i] = malloc(sizeof(char) * MAX_STRING_LEN);
    }
}

void insert_data(char **strings, const char* filename, int size){

    FILE *input;
    input = fopen(filename, "r");

    int i;
    for (i = 0; i < size; i++){

    fscanf(input,"%24s", strings[i]);

    }

    fclose(input);
}

我正在阅读的列表如下:

  • matt
  • susan
  • 标记
  • david
  • aden
  • phil
  • erik
  • john
  • caden
  • mycah

所以我需要按字母顺序获取这个列表,但是当我运行我的代码并在运行sort函数后打印出这个列表时,它们仍然按此顺序排列。非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

你输入的是什么&#39; size&#39;这里吗?

在sort_data()中,您似乎将其用作最大字符串大小:

char temp[size];

还有列表中的字符串数量:

for( i = 1; i < size; i++)

我不知道这是否是你唯一的问题,但它肯定会在某些时候咬你。

ETA:你的while循环需要工作。请注意,在每次迭代中,您都在比较字符串[i]&#39;到了“临时”,在循环之前将它们设置为彼此相等。内部循环内部没有任何内容会被执行,最后你只需要复制“临时”内容。回到&#39;字符串&#39;中的相同位置。

花几分钟时间确定每次运行循环时需要发生的事情。在纸上运行它,并写下数组的内容和'i&#39;的值。和&#39; j&#39;。