请帮助我,我需要完成此程序有效,但它不会按年龄排序,它应根据年龄排序记录请帮助。 我不能让它工作
这是我到目前为止所做的。我无法弄清楚什么是错的
#include <cstdlib>
#include <iostream>
using namespace std;
struct contact
{
char lastname[30];
char firstname[30];
int age;
int cnumber;
}
c[20];
void quickSort(int arr[], int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
}
void addContact(int ctr)
{
cout<<"ADD CONTACT"<<endl;
cout<<"LAST NAME: "<<endl;
cin>>c[ctr].lastname;
cout<<"FIRST NAME: "<<endl;
cin>>c[ctr].firstname;
cout<<"AGE: "<<endl;
cin>>c[ctr].age;
while (c[ctr].age >= 100 || c[ctr].age <= 0)
{
cout<<"Input Age again: ";
cin>>c[ctr].age;
}
cout<<"CONTACT NUMBER: "<<endl;
cin>>c[ctr].cnumber;
while (c[ctr].cnumber > 9999999 || c[ctr].cnumber < 1000000)
{
cout<<"Input Number Again: ";
cin>>c[ctr].cnumber;
}
system("cls");
}
void display(int a)
{ cout<<"RECORDS"<<endl;
for(int i=0;i<a;i++)
{
cout<<"\n";
cout<<"LAST NAME: ";
cout<<c[i].lastname<<endl;
cout<<"FIRST NAME: ";
cout<<c[i].firstname<<endl;
cout<<"AGE: ";
cout<<c[i].age<<endl;
cout<<"CONTACT NUMBER: ";
cout<<c[i].cnumber<<endl;
}
}
int main(int argc, char *argv[])
{
int choice, loop=0, tmp;
while (choice!=4)
{
cout<<"\n";
cout<<"CHOOSE"<<endl;
cout<<"1.Add contacts: "<<endl;
cout<<"2.Display "<<endl;
cin>>choice;
switch(choice)
{ case 1:
addContact(loop);
loop++;
break;
case 2:
system("cls");
display(loop);
break;
case 3:
quickSort(&c[loop].age,loop,0);
display(loop);
break;
default:
cout<<"Invalid";
}
}
return 0;
}
答案 0 :(得分:3)
您的quickSort
看起来是正确的,但它会对int
的数组进行排序。你这样称呼它:
quickSort(&c[loop].age,loop,0);
指向结构数组的某个元素的int
成员的指针不是指向所有结构的成员数组的开头的指针(不是&# 39; t存在)。
你有一个选择;重写quickSort
以比较contacts
,或者给contact
一个比较器并使quickSort
成为模板函数。
修改强>
重写quickSort
以比较contacts
非常简单:
void quickSort(contact arr[], int left, int right)
{
int i = left, j = right;
contact tmp;
contact pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i].age < pivot.age)
i++;
while (arr[j].age > pivot.age)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
}
您所要做的就是确保contact
有一个正常运行的赋值运算符,以便您可以执行arr[i] = arr[j]
...