单链表的合并
一般单链表的合并和前一篇博客写的但循环链表的合并思路基本一致,区别在于合并后不用将最后一个结点的指针域指向头结点。
//合并 void Combine(LinkList L1,LinkList L2){ struct LNode *p1; struct LNode *p2; p1=L1->next; p2=L2->next; struct LNode *s1,*s2; while(p1){ if(p1->next==NULL){ s1=p1; break; } p1=p1->next; } while(p2){ if(p2->next==NULL){ s2=p2; break; } p2=p2->next; } s1->next=L2->next; }
具体实现:
#include<stdio.h> #include<iostream> using namespace std; #define MAX 100 typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; int InitList(LinkList &L){ L=new LNode; L->next=NULL; return 1; } int ListLength(LinkList L){ int length=0; struct LNode *p; p=L->next; while(p){ p=p->next; ++length; } return length; } void TraveList(LinkList L){ struct LNode *p; p=L->next; while(p){ printf("%d ",p->data); p=p->next; } printf("\n"); } //使用后插法创建单链表 void CreateList(LinkList &L,int n){ L=new LNode; L->next=NULL; struct LNode *r; r=L; for(int i=0;i<n;i++){ printf("请输入第%d个元素值:",i+1); struct LNode *p; p=new LNode; scanf("%d",&p->data); p->next=NULL; r->next=p; r=p; } } //合并 void Combine(LinkList L1,*s2; while(p1){ if(p1->next==NULL){ s1=p1; break; } p1=p1->next; } while(p2){ if(p2->next==NULL){ s2=p2; break; } p2=p2->next; } s1->next=L2->next; } int main(){ LinkList A; LinkList B; if(InitList(A)){ printf("链表A初始化成功!\n"); }else{ printf("链表初始化失败!\n"); } if(InitList(B)){ printf("链表B初始化成功!\n"); }else{ printf("链表B初始化失败!\n"); } printf("请输入链表A的长度:"); int n1; scanf("%d",&n1); CreateList(A,n1); printf("遍历链表A:\n"); TraveList(A); printf("链表A的长度:%d\n",ListLength(A)); printf("请输入链表B的长度:"); int n2; scanf("%d",&n2); CreateList(B,n2); printf("遍历链表B:\n"); TraveList(B); printf("合并后的链表:\n"); Combine(A,B); TraveList(A); printf("合并后的链表长度是:%d\n",ListLength(A)); }
原文链接:https://www.f2er.com/datastructure/382552.html