如何按字母顺序参考名称对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 个项目。