代码说明:
输入四个数,la为升序链表,再输入四个数,ld为降序链表
若要将la与ld合并成升序链表,则首先将ld逆转成升序链表lb,在构造合并函数lc,具体代码讲解看链表
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
typedef struct link{
int data;
link *next;
}link;
link *Initlink(){//初始化,创建头结点
link *l;
l=(link*)malloc(sizeof(link));
l->next=NULL;
return l;
}
link *upInsert(link *l,int x){//构造升序链表
link *p=l->next,*prep=l;
while(p){
if(p->data>x){//一旦找到比x小的,立即停止,将x插在prep 与p之间
break;
}
else{
prep=p;
p=p->next;
}
}
link *s=(link*)malloc(sizeof(link));
s->data=x;
s->next=p;
prep->next=s;
return l;
}
link *downInsert(link *l,int x){//构造降序链表
link *p=l->next,*prep=l;
while(p){
if(p->data<x){//一旦找到比x大的,立即停止,将x插在prep 与p之间
break;
}
else{
prep=p;
p=p->next;
}
}
link *s=(link*)malloc(sizeof(link));
s->data=x;
s->next=p;
prep->next=s;
return l;
}
void print_gewei(link *l){//这个函数是打印出链表数字的个位数
link *p=l->next;
while(p){
int y=p->data;
if(y>10){
y=y%10;
}
cout<<y<<" ";
p=p->next;
}
cout<<endl;
}
void print(link *l){
link *p=l->next;
while(p){
cout<<p->data<<" ";
p=p->next;//打印链表别忘了这句
}
cout<<endl;
}
link *Reverse(link *l){//翻转链表
link *pre=l,*cu=l->next,*ne;
while(cu){//设置三个参数,pre为前序节点,cu为当前节点,ne为下一个节点,所以循环条件为cu!=NULL;
ne=cu->next;
cu->next=pre;
pre=cu;
cu=ne;
}
link *q=l->next;//这是逆转到最后头结点的处理办法 q是个临时节点
l->next=pre;
q->next=NULL;
return l;
}
link *mergeAD(link *la,link *ld){//合并一升一降链表为升序链表
link *lb=Reverse(ld);//首先将降序链表ld逆转成升序的链表lb
link *pb=lb->next;
link *pa=la->next;
link *lc=la;link *pc=lc;
while(pb&&pa){//当pa与pb都不为零时循环
if(pa->data<pb->data){
pc->next=pa;
pa=pa->next;
}
else{
pc->next=pb;
pb=pb->next;
}
pc=pc->next;//可以在这写,简洁
}//截止这个括号,pa&&pb不再成立,有走到尽头的链表
if(!pb){//若lb链表走到尽头,剩下的la直接脸上lc即可
pc->next=pa;
}
else{
pc->next=pb;
}
return lc;
}
int main()
{
int x;
link *la=Initlink();
link *ld=Initlink();
for(int i=0;i<4;i++){
cin>>x;
la=upInsert(la,x);
//ld=downInsert(ld,x);
}
for(int i=0;i<4;i++){
cin>>x;
//la=upInsert(la,x);
ld=downInsert(ld,x);
}
//print_gewei(la);
//print_gewei(ld);
print(la);
print(ld);
//link *lb=Reverse(la);
//print(lb);
link *lc;
lc=mergeAD(la,ld);
print(lc);
return 0;
}
详见博文:https://blog.csdn.net/fanwu72/article/details/8740866