按字母顺序排序struct数组

时间:2013-12-30 03:49:47

标签: sorting

在我的结构中,我正在尝试按用户的姓氏按字母顺序对项目进行排序

这是我的代码的一部分:

struct users {
char uname[30];
char lname[30];
char mellicode[30];
int userid;

};
struct users libuser[1000];


void adduser(int id){
char temp[30];
cout<<"Enter Username :\n";
cin>>temp;
strcpy(libuser[id].uname,temp);
cout<<"Enter Lastname :\n";
cin>>temp;
strcpy(libuser[id].lname,temp);
cout<<"Enter Mellicode :\n";
cin>>temp;
strcpy(libuser[id].mellicode,temp);
libuser[id].userid = id;
 }



void showuser(int id){
cout<<"\nUsername :"<<libuser[id].uname<<"\nLast name :"<<libuser[id].lname<<"\nMelli code :"<<libuser[id].mellicode<<"\nUser ID :"<<libuser[id].userid<<"\n";

}

void swapuser(int id,int id2){
char temp[30];
int itemp=id;

    strcpy(temp,libuser[id].uname);
    strcpy(libuser[id].uname,libuser[id2].uname);
    strcpy(libuser[id2].uname,temp);

    strcpy(temp,libuser[id].lname);
    strcpy(libuser[id].lname,libuser[id2].lname);
    strcpy(libuser[id2].lname,temp);

    strcpy(temp,libuser[id].mellicode);
    strcpy(libuser[id].mellicode,libuser[id2].mellicode);
    strcpy(libuser[id2].mellicode,temp);

    id=id2;
    id2=itemp;
}

在这里我尝试对它们进行排序:

for (int h=0;h<1000;h++)
{
    for(int l=0; l<1000; l++)
    {
        if(libuser[l].userid!=0)
        if(strcmp(libuser[l].lname,libuser[l+1].lname)>0)   
        { 
            swapuser(l,l+1);
        }

    }
}


for (int i=0;i<1000;i++)
    if(libuser[i].userid!=0)
    showuser(i);

system("pause");

我有两个问题:

1.分拣部分效果不佳。

2.在用户的数组中有几个空项,如:

libuser [0] .lname = asdf

libuser [1] .lname =

libuser [2] .lname =

libuser [3] .lname = zxcdg

libuser [4] .lname = gsagg

libuser [5] .lname = gasgh

libuser [6] .lname =

libuser [7] .lname = asggg

libuser [8] .lname =

libuser [9] .lname =

libuser [10] .lname =

...

如果它们是空的,它们的libuser [X] .userid变为0,所以我可以找到empy项目,但我不知道对它们进行排序!

2 个答案:

答案 0 :(得分:0)

首先:改变

for(int l=0; l<1000; l++)

for(int l=0; l<998; l++)

,因为:

swapuser(l,l+1); //l+1 should <= 999

第二:你应该在swapuser中交换用户ID而不是id。

答案 1 :(得分:0)

你不应该摆脱所有userid = 0的人吗?

一旦你完成了这个,如果你正在使用选择排序,那么代码应该是这样的

for (int h=0;h<999;h++)
{
    int lowest = h;
    for(int l=h + 1; l<1000; l++)
    {
        if(strcmp(libuser[lowest].lname,libuser[l].lname)>0)   
            lowest = l;
    }
    if (lowest != h)
        swapuser(h,lowest);
}

对于交换 - 有一个称为结构复制的功能。它不是新的:它自C89以来甚至可能更早出现。

void swapuser(int hi, int lo)
{
    struct users temp;
    temp = libuser[hi];
    libuser[hi] = libuser[lo];
    libuser[lo] = temp;
}