题目:创建两个学生链表,分别根据学生成绩对链表排序,并把这两个链表连接在一起。连接的时候,按照从小到大的顺序连接
解析:先创建两个学生链表,输入成绩,然后进行排序(我用的是冒泡排序),先链接,然后再全部排序。(一个一个插入麻烦,我就wa了)
代码实现
#include <stdio.h> #include <stdlib.h> typedef struct Link//建立链表 { int data; struct Link *next; }link; link *head1,*head2,*tail1,*tail2;//head1,tail1刚开始都是第一组学生的链头,head2,tail2为第二组学生的链头 void input1(int stu)//输入第一组学生成绩 { int num; link *p;//存放下一个节点的地址 head1=(link *)malloc(sizeof(link));//分配内存 tail1=head1; for(int i=1;i<=stu;i++) { if(i!=stu) { p = head1; printf("请输入第%d个学生成绩:",i); scanf("%d",&num); p->data=num; head1=(link *)malloc(sizeof(link)); p->next=head1; } else//最后一个不用再分配下一节点内存 { printf("请输入第%d个学生成绩:",i); scanf("%d",&num); head1->data=num; head1->next=NULL; } } } void input2(int stu)//输入第二组学生成绩 { int num; link *p; head2=(link *)malloc(sizeof(link)); tail2=head2; for(int i=1;i<=stu;i++) { if(i!=stu) { p = head2; printf("请输入第%d个学生成绩:",i); scanf("%d",&num); p->data=num; head2=(link *)malloc(sizeof(link)); p->next=head2; } else//最后一个节点 { printf("请输入第%d个学生成绩:",i); scanf("%d",&num); head2->data=num; head2->next=NULL; } } } void add()//将两个链表合成一条链 { head1->next = tail2; } void output()//输出链表 { printf("所有成绩从小到大排序:"); while(tail1!=NULL) { printf("%d ",tail1->data); tail1 = tail1->next; } printf("\n"); } void output1(int stu1) { int i,j; link *p,*q; for(i=1;i<stu1;i++)//对链表进行冒泡排序 { p=tail1; q=p->next; for(j=1;j<=stu1-i;j++) { if(p->data > q->data) { int temp;//用于转换 temp = p->data; p->data = q->data; q->data = temp; } p = p->next; q = q->next; } } p=tail1; printf("第一组学生成绩从小到大排序:"); while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } void output2(int stu2) { int i,j; link *p,*q; for(i=1;i<stu2;i++)//对链表进行冒泡排序 { p=tail2; q=p->next; for(j=1;j<=stu2-i;j++) { if(p->data > q->data) { int temp;//用于转换 temp = p->data; p->data = q->data; q->data = temp; } p = p->next; q = q->next; } } printf("第二组学生成绩从小到大排序:"); p=tail2; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } int main(void) { int stu1,stu2,i,j;//stu1为第一组学生人数,stu2为第二组学生人数 link *p,*q;//排序的时候可以用 printf("请输入第一组的学生人数:"); scanf("%d",&stu1); input1(stu1); output1(stu1); printf("请输入第二组的学生人数:"); scanf("%d",&stu2); input2(stu2); output2(stu2); add(); for(i=1;i<stu1+stu2;i++)//对链表进行冒泡排序 { p=tail1; q=p->next; for(j=1;j<=stu1+stu2-i;j++) { if(p->data > q->data) { int temp;//用于转换 temp = p->data; p->data = q->data; q->data = temp; } p = p->next; q = q->next; } } output(); }