C struct快速排序字符串

时间:2015-08-22 00:45:25

标签: c struct malloc quicksort

我有快速排序的问题。它应该用作者的名字对书籍进行排序。这是代码

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

struct book {
    char title[80];
    char autor[80];
    int pages;
};

int comparator (const void * a, const void *b)
{
    struct book * ia=(struct book*)a;
    struct book * ib=(struct book*)b;
    return (strcmp(ia->autor,ib->autor));
}

int main(int argc, char ** argv)
{
    int c = 2;
    int i;

    //Pointer to array of struct pointers, malloc for 2 structs
    struct book **ptr = (struct book*)malloc(c*sizeof(struct book));
    for(i=0;i<c;i++) {
            //malloc for every struct
            //also, if I'm doing it right?
            ptr[i] = (struct book*)malloc(sizeof(struct book));
            printf("Title: ");
            scanf("%s",ptr[i]->title);
            printf("Autor: ");
            scanf("%s",ptr[i]->autor);
    }
    for(i=0;i<c;i++) {
            printf("Before Quick sort Autor: %s, Title: %s \n",ptr[i]->autor,ptr[i]->title);
      }
    qsort(ptr,2, sizeof(struct book), comparator);
          printf("QSORT DONe...\n\n");
      for(i=0;i<c;i++) {
            printf("TEST");
            printf("After quick sort: Autor: %s, Title: %s \n",ptr[i]->autor,ptr[i]->title);
      }

    return 0;
}

所以程序编译但它只到达printf("TEST");(屏幕上显示TEST)然后崩溃。 我用那种快速的方法摧毁了我的阵列吗?或者会发生什么?

如果没问题,你也可以查看我的代码吗?特别是mallocs(真的)在我的代码中做了什么,因为我不确定我是否正确使用它们。

谢谢!

3 个答案:

答案 0 :(得分:2)

显示要更改的点(对于指向结构指针数组的指针(但不需要双指针)),作为

  1. #include <string.h>

  2. struct book * ia=*(struct book**)a; struct book * ib=*(struct book**)b;

  3. struct book **ptr = malloc(c*sizeof(struct book*));

  4. qsort(ptr,2, sizeof(struct book*), comparator);

  5. 也许是你想要的版本

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct book {
        char title[80];
        char autor[80];
        int pages;
    };
    int comparator (const void * a, const void *b)
    {
        struct book * ia=(struct book*)a;
        struct book * ib=(struct book*)b;
        return (strcmp(ia->autor,ib->autor));
    }
    
    int main(int argc, char ** argv)
    {
        int c = 2;
        int i;
    
        struct book *ptr = malloc(c*sizeof(struct book));
        for(i=0;i<c;i++) {
                printf("Title: ");
                scanf("%s",ptr[i].title);
                printf("Autor: ");
                scanf("%s",ptr[i].autor);
        }
        for(i=0;i<c;i++) {
                printf("Before Quick sort Autor: %s, Title: %s \n",ptr[i].autor,ptr[i].title);
        }
        qsort(ptr,2, sizeof(struct book), comparator);
              printf("QSORT DONe...\n\n");
        for(i=0;i<c;i++) {
                printf("TEST");
                printf("After quick sort: Autor: %s, Title: %s \n",ptr[i].autor,ptr[i].title);
        }
    
        return 0;
    }
    

答案 1 :(得分:2)

有一些小问题和混淆:

1)您遗失了strcmp

(struct book*) malloc(n * sizeof(struct book))

2)你正在分配一个指针数组,这可能不是你想要做的。 C中的数组是指向数组第一个元素的指针,因此如果使用n进行分配,那么您已经分配了一整套struct book** ptr = (struct book**) malloc(c * sizeof(struct book*));本书。 您还可以为书籍分配指针数组,在这种情况下,您需要将每个指针分配给新分配的书籍。

所以你可以做以下任何一种(你的代码混合了两者):

struct book* ptr = (struct book*) malloc(c * sizeof(struct book));

malloc

在第一种情况下,您需要分配新书(因此循环中的#include <stdio.h> #include <stdlib.h> #include <string.h> struct book { char title[80]; char autor[80]; int pages; }; int comparator(const void * a, const void *b) { struct book * ia = (struct book*)a; struct book * ib = (struct book*)b; return (strcmp(ia->autor, ib->autor)); } int main(int argc, char ** argv) { int c = 3; int i; //Pointer to array of struct pointers, malloc for 2 structs struct book* ptr = (struct book*) malloc(c*sizeof(struct book)); if (ptr == NULL) { printf("Could not allocate data\n"); return 1; } for (i = 0;i<c;i++) { printf("Title: "); scanf("%s", ptr[i].title); printf("Autor: "); scanf("%s", ptr[i].autor); } for (i = 0;i < c;i++) { printf("Before Quick sort Autor: %s, Title : %s \n", ptr[i].autor, ptr[i].title); } qsort(ptr, c, sizeof(struct book), comparator); printf("QSORT Done...\n\n"); for (i = 0;i<c;i++) { printf("TEST"); printf("After quick sort: Autor: %s, Title: %s \n", ptr[i].autor, ptr[i].title); } free(ptr); return 0; } 会有意义)

在第二种情况下,您只需直接使用数组,这就是我更改以下代码所做的事情:

malloc

3)最后,测试free的结果并在您不再需要时致电{{1}}是一种很好的做法。

答案 2 :(得分:0)

我将给你一个答案,它将保留ptr的定义,ptr是指向struct book的指针,并且还会改变最小量的代码。这意味着我们将为struct book分配一个指针数组,然后对于该数组中的每个指针,我们将分配一个实际的对象struct book

第一个malloc将为c分配一个struct book指针数组:

struct book **ptr = (struct book**)malloc(c*sizeof(struct book*));

使用malloc分配对象struct book的for循环是正确的。

第二次更正是在qsort()调用。我们正在排序指向struct book的指针,而非实际对象struct book

qsort(ptr,4, sizeof(struct book*), comparator);

然后比较功能需要修复。由于我们正在排序指针,因此比较函数将返回指向struct book指针的指针。所以我们需要取消引用指向struct book的指针:

int comparator (const void * a, const void *b)
{
    struct book* ia=*(struct book**)a;
    struct book* ib=*(struct book**)b;
    return (strcmp(ia->autor,ib->autor));
}