循环链表的实现
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -2
#define OK 1
#define ERROR -1
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=L;
}
int ListLength_L(LinkList L)
{
LinkList p=L->next;
int j=0;
while(p!=L)
{
p=p->next;
j++;
}
return j;
}
Status InsertList_L(LinkList &L,int i,ElemType e)
{
if (i<1||i>ListLength_L(L)+1)
{
return ERROR;
}
LinkList s,p=L->next;
int j=0;
while(j<i-1)
{
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(LNode));
if(!s)
exit(OVERFLOW);
s->data=e;
s->next=p->next;
p->next=s;
if(p==L)
L=s;
return OK;
}
Status DeleteList_L(LinkList &L,int i,ElemType &e)
{
if(i<1||i>ListLength_L(L))
{
return ERROR;
}
LinkList q,p=L->next;
int j=0;
while(j<i-1)
{
p=p->next;
j++;
}
q=p->next;p->next=q->next;
e=p->data;
if(L==q)
L=p;
return OK;
}
Status GetElem_L(LinkList L,int i,ElemType &e)
{
if(i<1||i>ListLength_L(L))
return ERROR;
LinkList p=L->next->next;
int j=1;
while(j<i)
{
j++;
p=p->next;
}
e=p->data;
return OK;
}
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LinkList pa,pb;
pa=La->next;
pb=Lb->next;
La->next=pb->next;
Lb->next=pa;
free(pb);
Lc=La=Lb;
}
void PrintN(LinkList L)
{
LinkList p=L->next->next;
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d ",p->data) ;
printf("\n");
}
int main()
{
int e;
LinkList L1,L2,L3;
InitList(L1);
InitList(L2);
for(int i=1;i<=5;i++)
{
InsertList_L(L1,i,i);
InsertList_L(L2,i,i*2);
}
PrintN(L1);
PrintN(L2);
MergeList_L(L1,L2,L3);
PrintN(L3);
DeleteList_L(L3,3,e);
PrintN(L3);
GetElem_L(L3,3,e);
printf("%d",e);
return 0;
}