题目:将两个从小到大排列的链表合并为一个新链表(仍然有序排列),输出合并前的两个链表,输出合并后的链表,检查合并是否成功。
重点:将两个链表合并为一个有序链表;
1.定义一个链表结构体
struct Node{
int Data;//该节点的数据
struct Node*next;//指向下一个节点的指针
};
2.创建一个链表:一定要注意链表是否带有头结点
struct Node* Creat(){
struct Node*L;
L=(struct Node*)malloc(sizeof(struct Node));
L->Next=NULL;
return L;
}//创建带头空链表//
3.向有序链表L插入一个数n且链表有序:
void Insert(struct Node*L,int n){
struct Node*p,*q;
p=L;
q=(struct Node*)malloc(sizeof(struct Node));
while(p->Next!=NULL&&p->Next->Data<n){
p=p->Next;
}
q->Data=n;
q->Next=p->Next;
p->Next=q;
}
4.将两个链表合二为一:
struct Node*a,*b,*c;
a=L1->Next;
b=L2->Next;
c=L3;
while(a!=NULL&&b!=NULL){
if(a->Data < b->Data){
Insert_sort(L3,a->Data);
a=a->Next;
}
{
Insert_sort(L3,b->Data);
b=b->Next;
}
}
if(a==NULL){
while(b!=NULL){
Insert_sort(L3,b->Data);
b=b->Next;
}
}
else if(b==NULL){
while(a!=NULL){
Insert_sort(L3,a->Data);
a=a->Next;
}
}
实验源代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct Node{
int Data;
struct Node*Next;
};
struct Node* Creat(){
struct Node*L;
L=(struct Node*)malloc(sizeof(struct Node));
L->Next=NULL;
return L;
}//创建带头空链表//
void Print(struct Node *L){
struct Node *q;
q=L->Next;
while(q!=NULL){
printf("%d ",q->Data);
q=q->Next;
}
}
void Insert_sort(struct Node*L,int n){
struct Node*p,*q;
p=L;
q=(struct Node*)malloc(sizeof(struct Node));
while(p->Next!=NULL&&p->Next->Data<n){
p=p->Next;
}
q->Data=n;
q->Next=p->Next;
p->Next=q;
}
int main(){
struct Node *L1,*L2,*L3;
L1=Creat();
L2=Creat();
L3=Creat();
srand((int)time(NULL));
int i;
for(i=0;i<10;i++){
Insert_sort(L1,rand()%100);
Insert_sort(L2,rand()%100);
}
struct Node*a,*b,*c;
a=L1->Next;
b=L2->Next;
c=L3;
while(a!=NULL&&b!=NULL){
if(a->Data < b->Data){
Insert_sort(L3,a->Data);
a=a->Next;
}
{
Insert_sort(L3,b->Data);
b=b->Next;
}
}
if(a==NULL){
while(b!=NULL){
Insert_sort(L3,b->Data);
b=b->Next;
}
}
else if(b==NULL){
while(a!=NULL){
Insert_sort(L3,a->Data);
a=a->Next;
}
}
Print(L1);
printf("\n");
Print(L2);
printf("\n");
Print(L3);
return 0;
}
拓展:将两个从小到大排列的链表合并为一个新链表(仍然有序排列),若遇到相同的元素,则在合并时去掉重复元素。输出合并前的两个链表,输出合并后的链表,检查合并是否成功。
去掉重复的元素:
int Delete(struct Node*L){
struct Node*p1,*p2;
p1=L;
while(p1!=NULL&&p1->Next!=NULL){
p2=p1->Next;
if(p1->Data==p2->Data){
p1->Next=p2->Next;
free(p2);
}
p1=p1->Next;
}
return L;
}