用户提问
今天写一个序,对学生信息按照成绩从大到小排序,接收学生信息,并且将其由大到小排序输出出来。
下面是程序,在排顺序的时候出错了 不知道是怎么回事,我的想法是将score小的与scroe大的节点相互交换 名字 和 成绩,,不交换地址,这样链表就不会发生改变,希望大神能够给我解答,如果有好的排序方法,希望能够指点迷津,不胜感激。(字数限制没有写主函数)
/*定义结构体*/
typedef struct student
{
char name[20];
int score;
struct student *Next;
}STU,*List;
/*创建接收学生信息*/
int i=0;
const List stuList()
{
List head = NULL;
List temp,temp1 = 0;
char names[20];
while(1)
{
printf("请输入第%d个学生信息(直接回车停止输入学生信息):\n",++i);
printf("\t姓名:");
fflush(stdin);
gets(names);
if(!strlen(names))
break;
temp = (STU*) malloc(sizeof(STU));
strcpy(temp -> name , names);
printf("\t成绩:");
scanf("%d",&temp -> score);
temp->Next = 0;
if(i==1)
head = temp;
if(temp1)
temp1->Next=temp;
temp1=temp;
}
return head;
}
/*输出学生成绩单*/
void print(List head)
{
printf("\t姓名\t\t成绩\n");
while(NULL!=head)
{
printf("\t%s\t\t%d\n",head->name,head->score);
head = head -> Next;
}
printf("\n");
}
/*学生成绩排序*/
void sort(STU * head, int n)
{
STU * aStu = head;
int i = 0,j = 0;
int temp;
char tmpCh[20];
for(i = 0; i < n; i++)
{
for(j = 0; j < n ; j++)
{
if(aStu[i].score < aStu[j].score)
{
/*将结构体的成绩交换*/
temp = aStu[i].score;
aStu[i].score = aStu[j].score;
aStu[j].score = temp;
/*将结构体的姓名交换*/
strcpy(tmpCh,aStu[i].name);
strcpy(aStu[i].name,aStu[j].name);
strcpy(aStu[j].name,tmpCh);
}
}
}
print(head);
}
推荐答案
#include
#include
#include
typedef struct student {
char name[20];
int score;
struct student *next;
}STU,*List;
const List createList() {
List head,p;
char name[20];
int score;
head = p = (List)malloc(sizeof(STU));
printf("姓名 成绩:\n");
while(scanf("%s%d",name,&score) == 2) {;
p->next = (List)malloc(sizeof(STU));
p = p->next;
strcpy(p->name,name);
p->score = score;
printf("姓名 成绩(Ctrl+Z to quit):\n");
}
p->next = NULL;
return head;
}
/*输出学生成绩单*/
void print(List head) {
List p = head->next;
while(p) {
printf("%s\t%d\n",p->name,p->score);
p = p ->next;
}
printf("\n");
}
/*学生成绩排序*/
void sort(List head) {
List p,q,pt,qt;
for(p = head; p->next; p = p->next) {
qt = p;
q = p->next;
while(q->next) {
if(p->next->score next->score)
qt = q;
q = q->next;
}
if(p != qt) {
pt = p->next;
p->next = qt->next;
qt->next = p->next->next;
p->next->next = pt;
}
}
}
int main() {
List head = createList();
printf("排序前:\n");
print(head);
sort(head);
printf("排序后:\n");
print(head);
return 0;
}
辅助答案
用户:peipei
2015年08月04日
错误在于你的排序算法,你用的是冒泡排序法,但是你这个是链表,不是数组,那个取下标的方法是错误的,应该使用链表的遍历方法进行排序。