合并的函数:
SLNode* merge(SLNode *head1,SLNode *head2,SLNode *head3)
{
SLNode *p1,*p2,*p3;
p1=head1->next,p2=head2->next;p3=head3;//从第一个有数值的结点开始比较
while(p1!=NULL&&p2!=NULL)//当两表都没便利完
{
if(p1->data<=p2->data)
{
p3->next=p1;
p3=p3->next;
p1=p1->next;
}
if(p1->data > p2->data)
{
p3->next=p2;
p3=p3->next;
p2=p2->next;
}
if(p1!=NULL) p3->next=p1;//表二空了,直接接上表一
if(p2!=NULL) p3->next=p2;//表一空了,接上表二
}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct Node{
int data;
struct Node* next;
}SLNode;
SLNode* head_create(){//创建头结点
SLNode* head = (SLNode*)malloc(sizeof(SLNode));
if(head==NULL) exit(1);
head->next=NULL;
return head;
}
SLNode* Node_insert(SLNode *head,int i,int x)//把x插入i位置 ,从头结点开始遍历
{
SLNode *p;p=head;//p指向头结点
int m=0;
while(m<i-1)//遍历到i-1位
{
p=p->next;
m++;
}
SLNode *q = (SLNode*)malloc(sizeof(SLNode));
q->next=p->next;
p->next=q;
q->data=x;
}
void print_SL(SLNode *head)//打印链表
{
SLNode *p;p=head;
if(p==NULL) printf("单链表空!\n");
else{
printf("head");
p=p->next;
}
while(p!=NULL)
{
printf("->%d",p->data);
p=p->next;
}
printf("\n");
}
SLNode* destroy(SLNode *head)//摧毁链表
{
SLNode *p,*q;
p=head->next;
head->next=NULL;
q=NULL;
while(q!=NULL)
{
q=p;
p=p->next;
free(q);
q=NULL;
}
printf("sucess!");
}
SLNode* merge(SLNode *head1,SLNode *head2,SLNode *head3)
{
SLNode *p1,*p2,*p3;
p1=head1->next,p2=head2->next;p3=head3;
while(p1!=NULL&&p2!=NULL)
{
if(p1->data<=p2->data)
{
p3->next=p1;
p3=p3->next;
p1=p1->next;
}
if(p1->data > p2->data)
{
p3->next=p2;
p3=p3->next;
p2=p2->next;
}
if(p1!=NULL) p3->next=p1;
if(p2!=NULL) p3->next=p2;
}
}
main()
{
SLNode *SL1=head_create();
for(int i=1;i<10;i++)
{
Node_insert(SL1,i,i*i);//把i^2插入i的位置
}
printf("单链表1为:\n");
print_SL(SL1);
SLNode *SL2=head_create();
for(int i=1;i<10;i++)
{
Node_insert(SL2,i,i*3);//把i^2插入i的位置
}
printf("单链表2为:\n");
print_SL(SL2);
//合并单链表,将表二插到表3中
SLNode *SL3=head_create();
printf("\n合并两个单链表为:\n");
merge(SL1,SL2,SL3) ;
print_SL(SL3);
//摧毁链表
destroy(SL1);
destroy(SL2);
destroy(SL3);
return 0;
}
运行结果: