#include<stdio.h>
#include<stdlib.h>//循环链表比一般链表不同的地方就是循环条件是(p != head )
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;void InitList(LinkList *L,int n) //利用表头指针
{
LinkList p;
int i;
*L = (LinkList)malloc(sizeof(LNode));(*L)->next = *L; //逆序
for(i = n; i > 0; --i)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}void PrintList(LinkList L)
{
LinkList p;
p = L->next;while(p != L )
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}void Unit(LinkList *La, LinkList Lb) //链表合并
{
LinkList pa,pb,qa,qb;
pa = *La;
qa = Lb;while(pa->next != *La)
{
pa = pa->next;
} //寻找尾指针,此时pa为尾指针
while(qa->next != Lb)
{
qa = qa->next;
} //此时qa为尾指针pb = pa->next;
qb = qa->next;
pa->next = qb->next;
qa->next = pb;
}
void InsertList(LinkList *L,int i,ElemType e) //在第i个元素之前插入此元素
{
LinkList p,q;
int j = 0;p = (*L);
while((p->next) != (*L) && j < i-1)
{
p = p->next;
++j;
}
if( (p->next) == (*L) || j > i-1)
{
exit(0);
}
q = (LinkList)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
}int main()
La = NULL;
{
LinkList *La,*Lb;
int n = 5;
Lb = NULL;
La = (LinkList *)malloc(sizeof(LinkList));
Lb = (LinkList *)malloc(sizeof(LinkList));
InitList(La,n);
InitList(Lb,n);
Unit(La,*Lb);PrintList(*La);
InsertList(La,1,112);
PrintList(*La);
return 0;
}