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

一位结构新手尝试使用冒泡排序对鸡尾酒名称数组按字母倒序排序,遇到‘赋值给数组类型’错误。文章详细解析了问题,涉及数组元素操作和字符串比较,指出不能直接赋值给数组,需通过指针间接修改。建议使用strcmp函数进行字符串比较。
摘要由CSDN通过智能技术生成

本问题已经有最佳答案,请猛点这里访问。

所以我在结构上是新手,所以我尝试像普通的冒泡排序一样对它进行排序,但是它无法正常工作,而且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

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;

}

}

请提供一个最小的可复制示例

请阅读帮助页面,尤其是有关如何提出良好问题和此问题清单的帮助。 最后,学习如何创建最小,完整和可验证的示例。

@ user3121023谢谢您,先生!

@Someprogrammerdude我会的。谢谢:)

请注意,尽管我已经将问题重复到有关比较字符串的问题上,但是您还需要使用函数(strcpy(),memmove(),memcpy() —也许是strncpy(),但要谨慎)复制字符串。 您正在尝试在数组上分配指针-不起作用。 您不能分配数组; 您不能将指针分配给数组(也就是说,给定char array[SIZE];,即使数组是结构的一部分,也不能执行array ="DATA";)。

非常感谢你! @乔纳森·莱夫勒

So I've been new in structures so i tried to sort it like normal

bubble sort but it won't work and also ti gives me error like

"assignment with expression to array type"

我不会说您的代码实际上试图实现什么,但是我会解决您遇到的错误。编译器应指出以下两行:

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

k[s+1].name= pom;

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

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

让我们分解一下这个语句:

k是指向kokteli结构数组的指针

k▼显示实际上是指向kokteli结构的地址的指针,该地址位于从k偏移s的内存地址处(C中与(k+s)完全相同)

k▼显示.name实际上是指向位于s偏移处的kokteli结构的成员name的地址的指针(也可以用C编写为(k+s)->name或&k▼显示 //since the first member is name)

k▼显示.name[0]是kokteli结构的成员name的第0个元素的内容,该元素位于从k偏移s的内存地址处(也可以用C编写为*(k+s)->name)

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

pom = k[s].name;

现在需要注意的是,C语言中的数组名称实际上是指向该数组内容开头的内存地址。这意味着它本身就是一个指针。因此,由于pom和k▼显示.name实际上都是char *,所以pom现在指向k▼显示.name所指向的对象。

您的if子句在这里:

if(k[s].name > k[s+1].name){

...

}

实际上正在比较内存地址,因为k▼显示.name和k▼显示.name都指向数组中的第一个元素。区别在于,其中一个位于比另一个(即k▼显示.name)大的sizeof(kokteli)内存偏移处,因此该语句永远不会是true。我在这里为您编写了一些代码,这些代码将钉住这个家。

正如评论中的其他人所指出的那样,您实际上将要使用strcmp(需要#include)比较两个类型为char的数组的元素。 strcmp的参考位于此处。

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

if(strcmp(k[s].name, k[s+1].name) > 0){

//k[s].name comes after k[s+1].name alphabetically

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值