#include<stdio.h>
#include<stdlib.h>
#define M 100
typedef struct Student
{
int s;
int score[3];//假设有三门课的成绩
struct Student* next;
}*std,stu;
std init1()
{
std p=(std)malloc(sizeof(stu));
p->next=NULL;
return p;
}
std init2()
{
std p=(std)malloc(sizeof(stu));
p->next=NULL;
return p;
}
//创建第一个链表
void create1(std head1,int i)
{
std p;
int j;
p=(std)malloc(sizeof(stu));
printf("请输入第%d个学生的学号:\n",i+1);
scanf("%d",&p->s);
for(j=0;j<3;j++)
{
p->score[j]=j+1;//为了方便就直接复制了,其实可以自己输入的
}
//头插法创建的是逆序输出的
p->next = head1->next;
head1->next= p;
}
//创建第二个链表
void create2(std head2,int i)
{
std p=head2;
int j;
// std p;
// int j;
p=(std)malloc(sizeof(stu));
printf("请输入第%d个学生的学号:\n",i+1);
scanf("%d",&p->s);
for(j=0;j<3;j++)
{
p->score[j]=j+2;
}
//头插法创建的是逆序输出的
p->next = head2->next;
head2->next= p;
}
//输出链表
void print(std head1)
{
std p=head1->next; //竟然这一步不能先把p直接复制给head了,要先把p复制给
//int j;
printf("输出创建的链表的内容:\n");
while(p!=NULL)
{
printf("%d\n",p->s);
printf("%d\t%d\t%d\n",p->score[0],p->score[1],p->score[2]);
p=p->next;
}
printf("NULL\n");
}
void sort(std head1,std head2)
{
std p,q,t,r,h;
// int i,j;
t=(std)malloc(sizeof(stu));
t->next=NULL;
p=head1->next;
q=head2->next;
// r=h;//r是尾指针
r=t;
//t->next=NULL;//把排序好的都植入到t链表中
//假设链表是降序的排列的。只能实现的是两个链表的合并,但不能实现链表的按学号升序排列。
while(p!=NULL&&q!=NULL)
{
if((p->s)<(q->s))
{
r->next=p;
r=p;
p=p->next;
// r=r->next;
}
else
{
r->next=q;
r=q;
q=q->next;
//q=t->next;
}
}
if(p!=NULL)
r->next=p;
else
r->next=q;
free(head1);
//输出测试一下,看看是否连接成功,已经连接成功
h=t->next;
while(h!=NULL)
{
printf("%d\t",h->s);
h=h->next;
}
}
int main()
{
std head1,head2;
int i;
// int i;//
head1=init1();
if(head1==NULL)
printf("error\n");
printf("创建第一个链表:\n");
for(i=0;i<3;i++)
create1(head1,i);
print(head1);
head2=init2();
printf("创建第二个链表:\n");
for(i=0;i<3;i++)
create2(head2,i);
print(head2);
sort(head1,head2);
printf("打印\n");
//printf(x);
return 0;
}
1、在单链表创建的过程中要进行减少的顺序输入数据,因为是头插法建立的单链表
2、最后合成的是一个非递减的单链表
这是我历经千辛万苦写出来的单链表的合并,这里并没有实现排序功能。所以有待进一步优化程序。
希望有错误大家可以帮忙指正!!
最后输出的学号仅仅是测试结果。