请在这件事上给予我帮助 ! [排序数组]

时间:2014-01-11 09:06:15

标签: arrays sorting fstream addressbook

Hello Everyone我通过使用数组创建了一个地址簿!...这里我遇到了排序类型为String的数组的问题....当我想对联系人进行排序时它只会排序名字而不移动第二个名字和电话麻木.....等。我没有明确的想法移动整行在地址簿中排序! ...我的意思是同时将[名字,姓氏,电话号码,电子邮件]移到下一行!...这是我的代码!

void sortRecords() {

ofstream Cfile; 
Cfile.open("addressbook.txt", ios::in); 

string temp;
for (int i=0; i<line()-1; ++i)
{
    for (int j=0; j<line()-1-i; j++)
    {
        while (first_name[j]>first_name[j+1])
        {
            temp= first_name[j+1];
            first_name[j+1]=first_name[j];
            first_name[j]=temp;
        }
    }
}
for (int p=0; p<line();p++)
{

    Cfile<<first_name[p]<<setw(10)<<sur_name[p]<<setw(10)<<phone_number[p]<<setw(10)<<email[p]<<endl;
}
Cfile.close();
}

1 个答案:

答案 0 :(得分:0)

执行此操作的有效方法是使用第二个(数字)“间接指针”数组 - 其中“最初位于i的项目现在位于j”。那你只需要交换这些指数;但是当你完成后,你可以通过只运行一次索引数组并生成元素的副本来生成排序数组。当你整理“一堆东西”时,这通常是一种很好的方法。

或者,您只需将所有项目移动到新位置;你会想要写一个“交换”功能,以保持你的代码清晰......

当你想在一个数组中保存一堆相关的项目来声明一个结构时,通常是一个好主意。在您的情况下,此结构可能如下所示:

typedef struct {
  char first_name[32];
  char last_name[32];
  char phone_number[16];
} entry;

然后您可以将电话簿声明为

entry phoneBook[100];

这将为100个电话簿条目创造足够的空间。

最后,当您浏览条目列表时,您可以像这样修改冒泡排序(假设n =条目数):

for ( int i=0; i < n - 1; i++ )
{
  for ( int j = i; j < n; j++ )
  {
    if (strcmpi(entries[j].first_name, entries[j+1].first_name) > 0)
    {
      swap(entries, j, j+1);
    }
  }
}

最后你会得到一个swap函数:

void swap(entry* e, int i, int j) {
// swap all elements of e[i] and e[j]
  entry temp;
  strcpy(temp.first_name,   e[i].first_name);
  strcpy(temp.last_name,    e[i].last_name);
  strcpy(temp.phone_number, e[i].phone_number;
  strcpy(e[i].first_name,   e[j].first_name);
  strcpy(e[i].last_name,    e[j].last_name);
  strcpy(e[i].phone_number, e[j].phone_number;
  strcpy(e[j].first_name,   temp.first_name);
  strcpy(e[j].last_name,    temp.last_name);
  strcpy(e[j].phone_number, temp.phone_number;
}