目录
循环单链表
单链表:从一个结点出发只能找到后续的各个结点
循环单链表:从一个结点出发只能其他任何一个结点
初始化
typedef struct LNode{ //定义单链表结点类型
int data; //数据域
struct LNode *next; //下一结点
}LNode,*LinkList;
//初始化一个循环单链表
bool InitList(LinkList &L){
L = (LNode *) malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) //内存不足,分配失败
return false;
L->next = L; //头结点next指向头结点
return true;
}
判空
//判断单链表是否为空
bool Empty(LinkList L){
if(L->next == L);
return true;
else
return false;
}
判断表尾结点
//判断结点p是否为循环单链表的表尾结点
bool isTail(LinkList L,LNode *p){
if(p->next == L);
return true;
else
return false;
}
循环双链表
双链表: 表头结点的prior指向NULL;
表尾结点的next指向NULL;
循环双链表:表头结点的prior指向表尾结点;
表尾结点的next指向头结点;
初始化
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinkList;
//初始化空的循环双链表
bool InitDList(DLinkList &L){
L = (DNode *) malloc(sizeof(DNode)); //分配一个头结点
if(L == NULL) //内存不足,分配失败
return false;
L->prior = L; //头结点prior指向头结点
L->next = L; //头结点next指向头结点
return true;
}
判空
//判断双链表是否为空
bool Empty(DLinkList L){
if(L->next == L);
return true;
else
return false;
}
判断表尾结点
//判断结点p是否为循环单链表的表尾结点
bool isTail(LinkList L,LNode *p){
if(p->next == L);
return true;
else
return false;
}
插入
//在p结点之后插入s结点
bool InsertNextNode(DNode *p,DNode *s){
if(p==NULL || s==NULL) //非法参数
return false;
s->next = p->next; //将结点*s保插入到结点*p之后
p->next->prior = s;
s->prior = p ;
p->next = s;
return true;
}
删除
//删除p的后继结点q
p->next = q->next;
q->next->prior = p;
free(q)