C语言链表地址互换,C语言链表的节点内容互换问题

用户提问

今天写一个序,对学生信息按照成绩从大到小排序,接收学生信息,并且将其由大到小排序输出出来。

下面是程序,在排顺序的时候出错了 不知道是怎么回事,我的想法是将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日

错误在于你的排序算法,你用的是冒泡排序法,但是你这个是链表,不是数组,那个取下标的方法是错误的,应该使用链表的遍历方法进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值