繁体   English   中英

使用C qsort()在结构中对动态数组进行排序

[英]Sorting dynamic array in a structure with C qsort ()

我在结构中对数组(动态分配)进行排序时遇到问题。 首先,想法是将数组i在结构中以升序排列。 然后,我在考虑对数组i进行排序,以保持数组j与其构造初始结构时所获得的“关系”相同。 我尝试为第一个想法工作,但是使用qsort却没有任何结果。所以这是我的代码...有什么想法吗? 我认为比较功能的构造存在问题。

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

int M =10;
int N =30;
int K = 10;

struct element {
int *i;
int *j;
int k;  
};

struct element *create_structure();
void print_element(struct element *);
int compare (const void *, const void * );
struct element * sort(struct element *);


main()
{
     srand(time(NULL));
     struct element *lista;
     int count;
     lista=create_structure();
     print_element(lista);
     printf("\n");
     lista=sort(lista);
}


 struct element *create_structure()
 {
         int aux1,aux2,count,load;
         struct element *structure;
         structure = (struct element *) malloc (M*sizeof(struct element *));
         structure->k=K;
         structure->i= (int *)malloc(structure->k*sizeof(int));
         structure->j=(int *)malloc (structure->k*sizeof(int));
            for (count = 0; count < K; count ++)
            {
               aux1=rand()%N;
               (structure->i)[count]=aux1;
                  do
                  {
                  aux2=rand()%N; 
                  }while(aux2==aux1);
               (structure->j)[count]=aux2;
            }
  return (structure);   
   }

   void print_element(struct element *lista)
   {
      int count;
      for(count = 0; count < K; count ++)
      {
         printf("%d     %d\n",lista->i[count],lista->j[count]);
      }
   }



   int compare(const void *a, const void *b)
     {
        struct element *ia = (struct element *)a; 
         struct element *ib = (struct element *)b; 
         int *ptr1=(ia->i);
         int *ptr2=(ib->i);
     return (*ptr1-*ptr2); 
     }


    struct element * sort(struct element *list)
     {
       qsort(list, sizeof(list->i)/ sizeof(int) , sizeof(list->i), compare);
      //qsort(list->i, K, sizeof(list->i), compare);
      print_element(list); 
      return (list);
     }

很抱歉参加晚会! :)

因此,让我们首先在代码中提及错误的语句

>>首先

在函数create_structure()您想为结构指针分配内存

struct element *structure; // here your structure pointer is 
//pointing to memory space of type struct element

structure = (struct element *) malloc (M*sizeof(struct element *));
                                       |------------------------|
                                                    |
                                                    V
Here you are allocating memory space of type struct element* which is 
wrong ! instead it must be sizeof(struct element)

关于同一函数中的while循环,我发现它完全没有用

aux1=rand()%N;
(structure->i)[count]=aux1; // the value is in aux1 variable 
do
 {
      aux2=rand()%N; 
 }while(aux2==aux1); // the loop try to get the same value of aux1 
                     // or you have just stored it in aux1
(structure->j)[count]=aux2; // it is easy to delete the while loop and
                            // change aux2 by aux1

>>第二

关于排序

qsort(list, sizeof(list->i)/ sizeof(int) , sizeof(list->i), compare);
     |-----|
        |
        V
It is not an adress of the array so it is Wrong !

知道了主要问题之后,便是一个基于您自己的代码的代码版本,该版本可以完美运行

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

int M =10;
int N =30;
int K = 10;

struct element {
    int *i;
    int *j;
    int k;
};

struct element *create_structure();
void print_element(struct element *);
int compare (const void *, const void * );
void sort(struct element *); // changed the return value of sort
// to void as the argument will be changed directly because it is a
// pointer 


int main()
{
    srand(time(NULL));
    struct element *lista;
    lista=create_structure();
    printf("\n--------- i ---  j  ---------\n\n");
    print_element(lista);
    printf("\n---------------------------\n");

    sort(lista);
    print_element(lista);
    return 0;

}


struct element *create_structure()
{
    int aux1=0,count=0;
    struct element *structure;
    // Changed the allocation of structure pointer 
    structure = (struct element *) malloc (sizeof(struct element));
    structure->k=K;
    structure->i= (int *)malloc(K*sizeof(int));
    structure->j=(int *)malloc (K*sizeof(int));
    for (count = 0; count < K; count ++)
    {
        aux1=rand()%N; 
        // we kept only the first aux1 and copied it in the two arrays
        (structure->i)[count]=aux1;
        (structure->j)[count]=aux1;
    }
    return (structure);
}

void print_element(struct element *lista)
{
    int count=0;
    for(count = 0; count < K; count++)
    {
        printf("row=%2d :  %2d     %2d\n",count+1,(lista->i)[count],(lista->j)[count]);
    }
}


int compare(const void *a, const void *b)
{
    // compare the values of two case of array pointed by i of type int
    return *(int*)a-*(int*)b;
}


void sort(struct element *list)
{
  // we will sort the array pointed by i which contains K elements 
  // of type int and size sizeof(int) by using the compare function
    qsort(list->i, K , sizeof(int), compare);
}

希望能帮助到你 ! :)

注意:在代码块v13.12中使用此代码会在Linux(gcc版本4.8.2)下生成错误输出! [在Code :: Blocks中可能是一个BUG],但是在gcc的命令行中使用它会给出正确的输出!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM