单链表:表尾结点的next指针指向NULL,从一个结点出发只能找到后续的各个结点
循环单链表:表尾结点的next指针指向头结点,从一个结点出发可以找到其他任何一个结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<stdio.h> #include<stdbool.h> #include<stdlib.h>
typedef struct LNode{ int data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; //LinkList等价于LNode *
//初始化一个循环单链表 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; } }
int main(){ LinkList L; InitList(&L); //初始化双链表 //...后续代码 }
|
双链表:表头结点的prior指向NULL,表尾结点的next指向NULL
循环双链表:表头结点的prior指向表尾结点,表尾结点的next指向头结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<stdio.h> #include<stdbool.h> #include<stdlib.h>
typedef struct DNode{ int data; //数据域 struct DNode *prior,*next; //指针域 }DNode,*DLinklist; //DLinklist等价于DNode *
//初始化空的循环双链表 bool InitDLinkList(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(DLinklist *L,DNode *p){ if(p->next == (*L)){ return true; } else{ return false; } }
int main(){ DLinklist L; InitDLinkList(&L); //初始化循环双链表 //...后续代码 }
|