形态:
实现:
/*************************************
设立尾指针的的单循环链表
by Rowandjj
2014.4.5
*************************************/
#include<IOSTREAM>
using namespace std;
#define OK 1
#define OVERFLOW 0
#define ERROR 0
typedef int ElemType;
typedef struct _NODE_
{
ElemType data;
struct _NODE_ *next;
}Node,*pNode,*LinkList;
/*操作定义*/
int InitList(LinkList &L);
int ListInsert(LinkList &L,int i,ElemType e);
int ListDelete(LinkList &L,int i,ElemType &e);
int ListTraverse(LinkList L,void(*vi)(ElemType));
int ListLength(LinkList L);
void CreateList(LinkList &L,int n);
void visit(ElemType e);
/*具体实现*/
int InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(Node));
if(!L)
{
exit(OVERFLOW);
}
L->next = L;
return OK;
}
int ListLength(LinkList L)
{
pNode p = L->next;
int i = 0;
while(p != L)
{
i++;
p = p->next;
}
return i;
}
int ListInsert(LinkList &L,int i,ElemType e)
{
pNode p = L->next,s;
int j = 0;
if(i < 1 || i > ListLength(L)+1)
{
return ERROR;
}
while(j < i-1)
{
p = p->next;
j++;
}
s = (pNode)malloc(sizeof(Node));
if(!s)
{
exit(OVERFLOW);
}
s->next = p->next;
p->next = s;
s->data = e;
if(p == L)
{
L = s;
}
return OK;
}
int ListDelete(LinkList &L,int i,ElemType &e)
{
pNode p = L->next,q;
int j = 0;
if(i < 1 || i > ListLength(L))
{
return ERROR;
}
while(j < i-1)
{
j++;
p = p->next;
}
q = p->next;
p->next = q->next;
e = q->data;
if(q == L)
{
L = p;
}
free(q);
return OK;
}
int ListTraverse(LinkList L,void(*vi)(ElemType))
{
pNode p = L->next->next;
while(p != L->next)
{
vi(p->data);
p = p->next;
}
cout<<endl;
return OK;
}
void visit(ElemType e)
{
cout<<e<<" ";
}
void CreateList(LinkList &L,int n)
{
ElemType e;
if(n <= 0)
{
return;
}
for(int i = 0 ; i < n; i++)
{
cin>>e;
pNode p = (pNode)malloc(sizeof(Node));
if(!p)
{
exit(OVERFLOW);
}
p->data = e;
p->next = L->next;
L->next = p;
L = p;
}
}