题目:创建两个学生链表,分别根据学生成绩对链表排序,并把这两个链表连接在一起。连接的时候,按照从小到大的顺序连接
解析:先创建两个学生链表,输入成绩,然后进行排序(我用的是冒泡排序),先链接,然后再全部排序。(一个一个插入麻烦,我就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(); }
#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();
}