字符串的C结构快速排序



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

#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...nn");
      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(实际上(在我的代码中做了什么,因为我不确定我是否正确地使用了它们。

谢谢!

有一些小问题和困惑:

1( 您缺少strcmp#include <string.h>

2( 你正在分配一个指针数组,这可能不是你想要做的。C中的数组是指向数组第一个元素的指针,因此,如果你使用(struct book*) malloc(n * sizeof(struct book))进行分配,那么你已经分配了一个完整的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 datan");
    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...nn");
  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;
}

3( 最后,测试malloc的结果并在不再需要时调用free是一个很好的做法。

显示要更改的点(对于指向结构指针数组的指针(但不需要双指针((如下

  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);


也许版本是你想要的

#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...nn");
    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;
}

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

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

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));
}

相关内容

  • 没有找到相关文章

最新更新