只设置尾指针而不设置头指针的讯循环链表的合并
注意和设置头指针的循环链表的区别。
在该算法中,专门定义了链表的尾指针,注意链表在定义,遍历,等操作上和折纸头指针的链表的区别。
#include<stdio.h> #include<iostream> using namespace std; #define MAX 100 typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; //定义尾指针 typedef struct{ LinkList rear; }LinkListLast; //初始化 int InitList(LinkListLast &L){ L.rear=new LNode; L.rear->next=L.rear; return 1; } //创建链表 int CreateList(LinkListLast &L,int e){ LinkList p; p=new LNode; p->data=e; p->next=L.rear->next; L.rear->next=p; L.rear=p; return 1; } //遍历 void TraveList(LinkListLast L){ struct LNode *p; p=L.rear->next->next; //int length=0; while(p!=L.rear->next){ //p=p->next; //++length printf("%d ",p->data); p=p->next; } printf("\n"); } /* 设置尾指针的循环链表的合并只需要改变两个指向表尾的指针即可。 */ void Combine(LinkListLast L1,LinkListLast L2){ struct LNode *p; p=L2.rear->next->next; L2.rear->next=L1.rear->next; L1.rear->next=p; } int main(){ LinkListLast L; LinkListLast B; if(InitList(L)){ printf("链表初始化成功!\n"); }else{ printf("链表初始化失败!\n"); } if(InitList(B)){ printf("链表B初始化成功!\n"); }else{ printf("链表B初始化失败!\n"); } printf("请输入链表的元素个数:"); int n; scanf("%d",&n); for(int i=0;i<n;i++){ printf("请输入第%d个元素值:",i+1); int e; scanf("%d",&e); CreateList(L,e); } TraveList(L); printf("请输入链表B的元素个数:"); int n2; scanf("%d",&n2); for(int i=0;i<n2;i++){ printf("请输入第%d个元素的值:",&e); CreateList(B,e); } TraveList(B); Combine(L,B); TraveList(B); //由于只有尾指针,所以遍历合并后的链表要从第二个链表开始 }