例题2-7:请设计算法,将两个按值递增有序的单链表合并成一个按值递增有序的单链表
进行了:原地处理和异地处理
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define LElemType int
using namespace std;
typedef struct LNode{
LElemType data;
struct LNode *next;
LNode ( LElemType Data=0, struct LNode *Next=NULL){
data=Data;
next=Next;
}
}LNode,*LinkList;
void InitLinkList(LinkList &L){
L=new LNode ;
}
void CreateLinkList_Tail(LinkList &L, int n=0){ //尾插法
L=new LNode ;
LinkList pre=L,tmp;
LElemType Data;
for (int i=0;i<n;i++){
printf("请输入第%d个元素的data : \n",i+1);
cin>>Data;
tmp=new LNode (Data);
pre->next=tmp;
pre=tmp;
}
}
void CreateLinkList_Head(LinkList &L, int n=0){ //头插法
L=new LNode;
LinkList Tail,tmp;
LElemType Data;
for(int i=0;i<n;i++){
printf("请输入第%d个元素的data : \n",i+1);
cin>>Data;
tmp=new LNode(Data);
tmp->next=L->next;
L->next=tmp;
}
}
int ListIsEmpty(LinkList &L){
if(L->next){
return 1;
}
return 0;
}
int ListLength(LinkList &L){
int Len=0;
LinkList p=L->next;
while(p){
//printf("%d\n",p->data);
Len++;
p=p->next;
}
return Len;
}
void OutputLinkList(LinkList &L){
LinkList p=L->next;
while(p){
printf("%d%c",p->data,p->next==NULL?'\n':' ');
p=p->next;
}
}
void GetElem(LinkList L,int pos,LElemType &e){
int i=1;
LinkList p=L->next;
while(p&&i<pos){
i++;
p=p->next;
}
if( i > pos || !p){
printf(" \"GetElem\" pos is error\n");
return ;
}
e=p->data;
}
LElemType LocateElem(LinkList L,LElemType e){
int j=1;
LinkList p=L->next;
while(p&&p->data!=e){
j++;
p=p->next;
}
if(!p){
printf("\" LocateElem \" not exist E : %d \n",e);
return 0;
}
return j;
}
void ListInsert(LinkList &L,int i,LElemType e){
int j=0;
LinkList p=L,s;
while(p&&j<i-1){
j++;
p=p->next;
}
if(!p||j>i-1){
printf("\" ListInsert \"index : %d error!\n",i);
return;
}
s=new LNode(e,p->next);
p->next=s;
}
void ListDelete(LinkList &L, int i ,LElemType &e){
int j=0;
LinkList p=L,s;
while(p->next&&j<i-1){
j++;
p=p->next;
}
if(!(p->next)||j>i-1){
printf("\" ListDelete \" index: %d error!\n",i);
return ;
}
s=p->next;
e=s->data;
p->next=s->next;
delete s;
}
void Array_List(LinkList &L,int a[],int n){
InitLinkList(L);
LinkList p,Pre=L;
for(int i=0;i<n;i++){
p=new LNode(a[i]);
Pre->next=p;
Pre=p;
}
}
void ListMerge_Diff(LinkList La,LinkList Lb,LinkList &Lc){ //异地处理
InitLinkList(Lc);
LinkList Pre=Lc,pa=La->next,pb=Lb->next,p;
while(pa&&pb){
p=new LNode( pa->data<=pb->data?pa->data:pb->data,NULL);
Pre->next=p;
Pre=p;
pa->data<=pb->data?pa=pa->next:pb=pb->next;
}
while(pa){
p=new LNode(pa->data,NULL);
Pre->next=p;
Pre=p;
pa=pa->next;
}
while(pb){
p=new LNode(pb->data,NULL);
Pre->next=p;
Pre=p;
pb=pb->next;
}
}
void ListMerge(LinkList La,LinkList Lb,LinkList &Lc){ //原地处理
LinkList Pre=La;
Lc=Pre;
LinkList pa=La->next;
LinkList pb=Lb->next;
while(pa&&pb){
if(pa->data<=pb->data){
Pre->next=pa;Pre=pa;pa=pa->next;
}else{
Pre->next=pb;Pre=pb;pb=pb->next;
}
}
Pre->next=(pa!=NULL?pa:pb);
delete Lb;
}
int main()
{
int a[]={1,3,5,7};
int b[]={2,4,6,8};
LinkList La,Lb,Lc;
Array_List(La,a,4);
Array_List(Lb,b,4);
puts("La:");OutputLinkList(La);
puts("Lb:");OutputLinkList(Lb);
ListMerge_Diff(La,Lb,Lc);
puts("La+Lb:(Diff)");OutputLinkList(Lc);
ListMerge(La,Lb,Lc);
puts("La+Lb:");OutputLinkList(Lc);
return 0;
}