例题2-6 :
将两个用尾指针表示的循环单链表合并成一个用尾指针表示的循环单链表合并成一个用尾指针表示的循环单链表
这个模板出了一点问题,主要问题在于,我是直接套用了之前的做法,其实循环单链表,不用头指针,只用尾指针。
但是我可以历遍来找到这个尾指针的位置。
我用了两种方法,一种是原地操作,另一种是异地操作。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define LElemType int
#define inf 0x3f3f3f3f
using namespace std;
typedef struct CLNode{
LElemType data;
struct CLNode * next;
CLNode(LElemType Data=inf,CLNode *Next=NULL){
data=Data;
next=Next;
}
}CLNode , *CLinkList ;
void InitCLinkList(CLinkList &L){
L=new CLNode;
L->next=L;
}
void CreateCLinkList_Tail(CLinkList &L,int n=0){
L=new CLNode;
CLinkList Pre=L,p;
LElemType Data;
for(int i=1;i<=n;i++){
printf("请输入第%d个data值:\n",i);
cin>>Data;
p=new CLNode(Data,L);
Pre->next=p;
Pre=p;
}
}
void CreateCLinkList_Head(CLinkList &L,int n=0){
L=new CLNode;
L->next=L;
CLinkList p;
LElemType Data;
for(int i=1;i<=n;i++){
printf("请输入第%d个data值:\n",i);
cin>>Data;
p=new CLNode(Data,L->next);
L->next=p;
}
}
bool ListIsEmpty(CLinkList &L){
return L->next==L?false:true;
}
int CListLength(CLinkList &L){
int Len=0;
CLinkList p=L->next;
while(p!=L){
Len++;
p=p->next;
}
return Len;
}
void GetElem(CLinkList &L,int i,LElemType &e){
int j=1;
CLinkList p=L->next;
while(j<i&&p!=L){
p=p->next;
j++;
}
if(i<j||p==L){
printf("\" GetElem \" index : %d error!!!\n",i);
return ;
}
e=p->data;
}
int LocateElem(CLinkList &L,LElemType e){
int j=1;
CLinkList p=L->next;
while(p!=L&&p->data!=e){
j++;p=p->next;
}
if(p==L){
printf("\" LocateElem \" %d Not found !!!\n",e);
return inf;
}
return j;
}
void OutputCLinkList(CLinkList &L){
CLinkList p=L->next;
while(p!=L){
printf("%d",p->data);
if(p->next==L){
printf("\n");
}else{
printf(" ");
}p=p->next;
}
/*p=L->next;
while(p!=L){
printf("%d\n",p->data);
p=p->next;
}*/
}
void ListInsert(CLinkList &L,int i ,LElemType e){
int j=0;
CLinkList p=L,s;
while(p->next!=L&&j<i-1){
j++;p=p->next;
}
if((p==L||j>i-1)&&i!=1){
printf("\"ListInsert\" index : %d error!!!\n",i);
return ;
}else{
s=new CLNode(e,p->next);
p->next=s;
}
}
void ListDelete(CLinkList &L,int i,LElemType &e){
int j=0;
CLinkList p=L,s;
while(p->next!=L&&j<i-1){
j++;
p=p->next;
}
if((p->next!=L||j<i-1)&&(j!=i-1)){
printf("\"ListDelete\" index : %d error!!!\n",i);
return ;
}else{
s=p->next;
p->next=s->next;
e=s->data;
delete s;
}
}
void Array_List(CLinkList &L,int a[],int n){
InitCLinkList(L);
CLinkList p,Pre=L;
for(int i=0;i<n;i++){
p=new CLNode(a[i],L);
Pre->next=p;
Pre=p;
}
}
void UnionCLinkList_Diff(CLinkList &La,CLinkList &Lb,CLinkList &Lc){ //异地处理
CLinkList p1=La->next,p2=Lb->next,p3,p,Pre;
InitCLinkList(Lc);
Pre=p3=Lc;
while(p1!=La){
p=new CLNode(p1->data,Lc);
Pre->next=p;
Pre=p;
p1=p1->next;
}
while(p2!=Lb){
p=new CLNode(p2->data,Lc);
Pre->next=p;
Pre=p;
p2=p2->next;
}
}
void UnionCLinkList(CLinkList La,CLinkList Lb,CLinkList &Lc){
CLinkList R1=La->next;
CLinkList R2=Lb->next;
CLinkList s;
while(R1->next!=La){ R1=R1->next; }
while(R2->next!=Lb){ R2=R2->next; }
//printf("R1->data %d\n",R1->data);
//printf("R2->data %d\n",R2->data);
//OutputCLinkList(Lb);
s=R2->next;
//printf("s ->next : %d\n",s->data);
R2->next=R1->next;
R1->next=s->next;
Lc=R2->next;
delete s;
}
int main()
{
int a[]={1,2,3,4};
int b[]={5,6,7,8};
CLinkList La,Lb,Lc;
Array_List(La,a,4);
Array_List(Lb,b,4);
puts("La:");OutputCLinkList(La);
puts("Lb:");OutputCLinkList(Lb);
UnionCLinkList_Diff(La,Lb,Lc);
puts("La+Lb:");OutputCLinkList(Lc);
UnionCLinkList(La,Lb,Lc);
puts("La+Lb:");OutputCLinkList(Lc);
}