有人可以帮我解决用C语言对数据结构进行排序的问题吗

时间:2018-09-09 17:36:25

标签: c data-structures

所以我是结构的新手,所以我尝试像普通的冒泡排序一样对它进行排序,但是它无法正常工作,而且ti给我类似“将表达式分配给数组类型的错误”之类的错误。 我只想以相反的方式从“ z”到“ a”对鸡尾酒的名称进行排序。 我做了剩下的有效代码,却陷入了这种困境

我真的尽了我所能想到的一切,所以如果有人可以帮助我,那就太好了。 谢谢:)

typedef struct {
    char name[20+1];
    char sast1[20+1];
    char sast2[20+1];
    char sast3[20+1];
} kokteli;

j=i;
int s;
int flag;
char *pom;

while(1) {
    flag = 0;
    for(s=0; s<j; s++) {
        if(k[s].name> k[s+1].name) {
            pom = k[s].name;
            k[s].name= k[s+1].name;
            k[s+1].name= pom;
            flag = 1;
        }
    } if(flag == 0){
            break;
    }
}

1 个答案:

答案 0 :(得分:0)

  

所以我是结构新手,所以我尝试像平常一样对它进行排序   冒泡排序,但它不起作用,而且ti给我类似的错误   “将表达式分配给数组类型”

我不会谈论您的代码实际上试图实现的目的,但是我会解决您遇到的错误。编译器应该指出这两行:

    k[s].name= k[s+1].name;
    k[s+1].name= pom;

因此,为清楚起见,让我们指出一个事实,k是一个kokteli结构的数组,并且这些结构包含的成员是数组(namesast1等)。 k[s].namek[s+1].name都是char数组,在C中是不可分配的。您可以通过指向数组中每个char的内存地址的指针来修改数组的元素(char)。您将这样做:

k[s].name[n] = //where n is an integer from 0 to 20, assign value of nth element here)

让我们分解一下这句话:

  1. k是指向kokteli结构数组的指针
  2. k[s]实际上是指向kokteli结构的地址的指针,该结构位于从k偏移s的内存地址处(C中与{ {1}})
  3. (k+s)实际上是指向位于偏移k[s].name处的name结构的成员kokteli的地址的指针(也可以用C编写为{{1 }}或s
  4. (k+s)->name&k[s] //since the first member is name结构的成员k[s].name[0]的第0个元素的内容,该元素位于从name偏移kokteli(也可以用k用C编写)

这就是为什么编译器不抱怨这一行的原因:

s

现在需要注意的是,C语言中的数组名称实际上是指向该数组内容开头的内存地址。这意味着它本身就是一个指针。因此,由于*(k+s)->namepom = k[s].name; 实际上都是pom,所以k[s].name现在指向char *指向的对象。

此处的if子句:

pom

实际上是比较内存地址,因为k[s].nameif(k[s].name > k[s+1].name){ ... } 都指向数组中的第一个元素。区别在于,其中一个位于比另一个(即k[s].name)大k[s+1].name的内存偏移处,因此该语句永远不会为sizeof(kokteli)。我为您here编写了一些代码,这些代码将钉住这个家。

正如评论中的其他人所指出的,您实际上将要使用strcmp(需要k[s+1].name)来比较类型为true的两个数组的元素。位于here的strcmp参考。

所以您的if子句应该看起来像这样

#include <string.h>

有关strcmp如何工作的更多信息,请参见此answer