如何按字母顺序参考名称对c中的结构进行冒泡排序
How to bubblesort a structure in c with reference to name alphabetically
实际上我想根据名称(按字母顺序)对整个记录进行冒泡排序。但是编译器给出了 "invalid array assignment" 的错误。
请检查下面给出的代码,尤其是冒泡排序部分。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct form {
char name[20], employ[20], gend[20], email[20], father[20];
int num, serial;
} a[11];
main() {
int c, tmp, d;
for (c = 0; c < 10; c++) {
printf("Employ#:");
scanf("%d", &a[c].serial);
printf("Enter Name:");
scanf("%s", &a[c].name);
printf("\n");
printf("Enter Father Name:");
scanf("%s", &a[c].father);
printf("\n");
printf("Enter Email.Id:");
scanf("%s", &a[c].email);
printf("\n");
printf("Enter employment#:");
scanf("%s", &a[c].employ);
printf("\n");
printf("Enter Gender:");
scanf("%s", &a[c].gend);
printf("\n");
printf("Enter Number:");
scanf("%d", &a[c].num);
printf("\n");
}
//Bubblesorting
int i, j, temp;
for (j = 0; j < 10; j++) {
for (i = 0; i < 10; i++) {
if (a[i].name[0] < a[i + 1].name[0]) {
a[10].serial = a[i].serial;
a[10].name = a[i].name;
a[10].father = a[i].father;
a[10].email = a[i].email;
a[10].employ = a[i].employ;
a[10].gend = a[i].gend;
a[10].num = a[i].num;
a[i].serial = a[i + 1].serial;
a[i].name = a[i + 1].name;
a[i].father = a[i + 1].father;
a[i].email = a[i + 1].email;
a[i].employ = a[i + 1].employ;
a[i].gend = a[i + 1].gend;
a[i].num = a[i + 1].num;
a[i + 1].serial = a[10].serial;
a[i + 1].name = a[10].name;
a[i + 1].father = a[10].father;
a[i + 1].email = a[10].email;
a[i + 1].employ = a[10].employ;
a[i + 1].gend = a[10].gend;
a[i + 1].num = a[10].num;
}
}
}
system("cls");
printf("\nEmployee#\tName\tFather Name\tEmail\t\t\a[10]loyement#\tGender\tContact#");
for (c = 0; c < 10; c++) {
printf("\n\t%d\t", a[c].serial);
printf("%s\t", a[c].name);
printf(" %s\t", a[c].father);
printf("%s\t", a[c].email);
printf("\t%s\t", a[c].employ);
printf("%s\t", a[c].gend);
printf("%d\t", a[c].num);
}
getch();
}
您收到错误的原因是,您正在尝试使用赋值运算符复制字符数组。
例如::
int a[10], b[10];
b = a;
是将 a
分配给 b
的错误方法,您在代码中到处都这样做,这会导致错误 "invalid array assignment".
而且,我不明白你为什么要这么辛苦地复制struct
的所有变量,简单地这样做也有帮助。
for (j = 0; j < 10; j++) {
for (i = 0; i < 10; i++) {
if (a[i].name[0] < a[i + 1].name[0]) {
a[10] = a[i];
a[i] = a[i+1];
a[i+1] = a[10];
}
}
}
此外,您根据 name[]
的第一个字符比较 2 个结构。因此,如果您的 a
数组中有 2 个名称,例如 "ABD" 和 "ACD",它们不会被排序,因此您应尝试修改对 2 个对象进行排序的条件。
首先,您的冒泡排序与您在任何有关排序的文档中找到的完全不同。它应该是一个非常简单的双重嵌套循环,比较内部循环中的两个项目,如果它们乱序则交换它们。
其次,要按字母顺序排序,您应该比较整个字符串,而不仅仅是第一个字母。由于您没有选择语言,我们暂时假设它是 C
。您将使用 strcmp
来比较 C 风格的字符串。
最后,您不需要一次交换结构中的一项。您可以交换整个结构。
#include <string.h>
//...
int i, j, temp;
int num_items = 10;
for (j = 0; j < num_items - 1; j++)
{
for (i = 0; i < num_items - 1; i++)
{
if ( strcmp(a[i].name, a[i + 1].name ) > 0)
{
form temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
另外,没有必要人为地让你的数组拥有比必要更多的项目。你声明你的数组有 11 个项目,我想这是为了让冒泡排序工作。
没有理由申报11项。只要声明为10项,正确写出冒泡排序即可(注意循环约束的区别)。如果 form
结构非常大怎么办?您会无缘无故地使用内存,多声明 1 个项目。
实际上我想根据名称(按字母顺序)对整个记录进行冒泡排序。但是编译器给出了 "invalid array assignment" 的错误。 请检查下面给出的代码,尤其是冒泡排序部分。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct form {
char name[20], employ[20], gend[20], email[20], father[20];
int num, serial;
} a[11];
main() {
int c, tmp, d;
for (c = 0; c < 10; c++) {
printf("Employ#:");
scanf("%d", &a[c].serial);
printf("Enter Name:");
scanf("%s", &a[c].name);
printf("\n");
printf("Enter Father Name:");
scanf("%s", &a[c].father);
printf("\n");
printf("Enter Email.Id:");
scanf("%s", &a[c].email);
printf("\n");
printf("Enter employment#:");
scanf("%s", &a[c].employ);
printf("\n");
printf("Enter Gender:");
scanf("%s", &a[c].gend);
printf("\n");
printf("Enter Number:");
scanf("%d", &a[c].num);
printf("\n");
}
//Bubblesorting
int i, j, temp;
for (j = 0; j < 10; j++) {
for (i = 0; i < 10; i++) {
if (a[i].name[0] < a[i + 1].name[0]) {
a[10].serial = a[i].serial;
a[10].name = a[i].name;
a[10].father = a[i].father;
a[10].email = a[i].email;
a[10].employ = a[i].employ;
a[10].gend = a[i].gend;
a[10].num = a[i].num;
a[i].serial = a[i + 1].serial;
a[i].name = a[i + 1].name;
a[i].father = a[i + 1].father;
a[i].email = a[i + 1].email;
a[i].employ = a[i + 1].employ;
a[i].gend = a[i + 1].gend;
a[i].num = a[i + 1].num;
a[i + 1].serial = a[10].serial;
a[i + 1].name = a[10].name;
a[i + 1].father = a[10].father;
a[i + 1].email = a[10].email;
a[i + 1].employ = a[10].employ;
a[i + 1].gend = a[10].gend;
a[i + 1].num = a[10].num;
}
}
}
system("cls");
printf("\nEmployee#\tName\tFather Name\tEmail\t\t\a[10]loyement#\tGender\tContact#");
for (c = 0; c < 10; c++) {
printf("\n\t%d\t", a[c].serial);
printf("%s\t", a[c].name);
printf(" %s\t", a[c].father);
printf("%s\t", a[c].email);
printf("\t%s\t", a[c].employ);
printf("%s\t", a[c].gend);
printf("%d\t", a[c].num);
}
getch();
}
您收到错误的原因是,您正在尝试使用赋值运算符复制字符数组。
例如::
int a[10], b[10];
b = a;
是将 a
分配给 b
的错误方法,您在代码中到处都这样做,这会导致错误 "invalid array assignment".
而且,我不明白你为什么要这么辛苦地复制struct
的所有变量,简单地这样做也有帮助。
for (j = 0; j < 10; j++) {
for (i = 0; i < 10; i++) {
if (a[i].name[0] < a[i + 1].name[0]) {
a[10] = a[i];
a[i] = a[i+1];
a[i+1] = a[10];
}
}
}
此外,您根据 name[]
的第一个字符比较 2 个结构。因此,如果您的 a
数组中有 2 个名称,例如 "ABD" 和 "ACD",它们不会被排序,因此您应尝试修改对 2 个对象进行排序的条件。
首先,您的冒泡排序与您在任何有关排序的文档中找到的完全不同。它应该是一个非常简单的双重嵌套循环,比较内部循环中的两个项目,如果它们乱序则交换它们。
其次,要按字母顺序排序,您应该比较整个字符串,而不仅仅是第一个字母。由于您没有选择语言,我们暂时假设它是 C
。您将使用 strcmp
来比较 C 风格的字符串。
最后,您不需要一次交换结构中的一项。您可以交换整个结构。
#include <string.h>
//...
int i, j, temp;
int num_items = 10;
for (j = 0; j < num_items - 1; j++)
{
for (i = 0; i < num_items - 1; i++)
{
if ( strcmp(a[i].name, a[i + 1].name ) > 0)
{
form temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
另外,没有必要人为地让你的数组拥有比必要更多的项目。你声明你的数组有 11 个项目,我想这是为了让冒泡排序工作。
没有理由申报11项。只要声明为10项,正确写出冒泡排序即可(注意循环约束的区别)。如果 form
结构非常大怎么办?您会无缘无故地使用内存,多声明 1 个项目。