循环单链表定义
其实这里定义的结构跟单链表的没什么区别,只不过在初始化或操作数据的时候,要把next指针指向链表的头指针。
#define bool int
#define true 1
#define false 0
typedef struct LNode
{
struct LNode *next;
int data;
}LNode,*ScLinkList;
初始化
void InitList(ScLinkList L)
{
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL) //有可能内存分配失败
return;
L->next=L;
}
判断节点p是否是尾节点
bool IsTail(ScLinkList L,LNode *p)
{
if(p->next==L)
return true;
else
return false;
}
判断链表是否为空
bool IsEmpty(DcLinkList L)
{
if(L->next==L)
return true;
else
return false;
}
在节点p后插入节点s
void InsertNextNode(LNode *p,LNode *s)
{
if(p==NULL||s==NULL) return ;
s->next=p->next;
p->next=s;
}
循环双链表定义
#define bool int
#define true 1
#define false 0
typedef struct LNode
{
struct LNode *next,*prior;
int data;
}LNode,*DcLinkList;
初始化
void InitList(DcLinkList L)
{
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL) //有可能内存分配失败
return;
L->next=L;
L->prior=L;
}
判断节点p是否尾结点
bool IsTail(DcLinkList L,LNode *p)
{
if(p->next==L)
return true;
else
return false;
}
判断链表是否为空
bool IsEmpty(DcLinkList L,)
{
if(L->next==L)
return true;
else
return false;
}
在节点p后加入节点s
void InsertNextNode(LNode *p,LNode *s)
{
if(p==NULL||s==NULL) return ;
s->next=p->next;
s->prior=p;
p->next->prior=s;
p->next=s;
}
删除节点p的后节点
void DelteNextNode(LNode *p)
{
if(p==NULL) return ;
LNode *q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
}