//单循环链表的操作,包含头结点
#include<stdio.h>
#include<iostream>
#include<cstdlib>
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=L;
return 1;
}
//求链表的长度
int ListLength(LinkList L)
{
int length=0;
LNode *p;
p=L->next;
while(p!=L)
{
p=p->next;
++length;
}
return length;
}
//输出
void TraveList(LinkList L)
{
LNode *p;
p=L->next;
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//创建链表,传引用的方式,头插法
void CreateList(LinkList &L,int n)
{
L=new LNode;
L->next=L;
printf("请输入链表的元素值:\n");
for(int i=n;i>0;--i)
{
cout<<"请输入"<<i<<"个元素的值:";
LNode *p;
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
//合并链表
void Combine(LinkList &L1,LinkList &L2)
{
LNode *p1;
LNode *p2;
p1=L1->next;
p2=L2->next;
struct LNode *s1;
struct LNode *s2;
while(p1!=L1){
if(p1->next==L1){
s1=p1;//s1指向表L1的最后一个结点
break;
}
p1=p1->next;//指针后移
}
while(p2!=L2){
if(p2->next==L2){
s2=p2;//s2指向表L2的最后一个结点
break;
}
p2=p2->next;//指针后移
}
s1->next=L2->next;//合并
s2->next=L1;
}
int main()
{
LinkList A;//链表A
LinkList B;//链表B
if(InitList(A))
{
printf("链表A初始化成功!\n");
}
else
{
printf("链表A初始化失败!\n");
}
if(InitList(B))
{
printf("链表B初始化成功!\n");
}
else
{
printf("链表B初始化失败!\n");
}
printf("请输入链表A的长度:");
int n1;
cin>>n1;
CreateList(A,n1);
printf("遍历链表A:\n");
TraveList(A);
printf("请输入链表B的长度:");
int n2;
cin>>n2;
CreateList(B,n2);
printf("遍历链表B:\n");
TraveList(B);
Combine(A,B);
printf("合并后的链表:\n");
TraveList(A);
printf("合并后链表长度是:%d\n",ListLength(A));
system("pause");
return 0;
}