一、思维导图
二、实现双向循环链表的 创建、判空、尾插、遍历、尾删、销毁
头文件
#ifndef __DOUBULARLINK_H__
#define __DOUBULARLINK_H__
#include <stdio.h>
#include <stdlib.h>
typedef int dataType;
typedef struct Node
{
union
{
int len;
dataType data;
};
struct Node *Next;
struct Node *Last;
}DCLk, *DCLkPtr;
//创建
DCLkPtr Link_create();
//判空
int Link_empty(DCLkPtr L);
//申请结点,封装数据
DCLkPtr Node_create(dataType n);
//尾插
int Tail_insert(DCLkPtr L, dataType n);
//遍历
void Link_show(DCLkPtr L);
//尾删
int Tail_delet(DCLkPtr L);
//销毁
void Link_destory(DCLkPtr L);
#endif
源文件
#include "doubularLink.h"
//1、创建链表(头结点)
DCLkPtr Link_create(){
DCLkPtr L = (DCLkPtr)malloc(sizeof(DCLk)); //申请一个节点空间
if(L == NULL){
printf("Creation failed!\n");
return NULL;
}
//申请成功 数据域置0 指针域指向头结点
L->len = 0;
L->Next = L;
L->Last = L;
printf("Creation succeed!\n");
return L;
}
//2、判段是否为空
int Link_empty(DCLkPtr L){
//判断链表是否合法
if(L == NULL){
printf("Judgment failed!\n");
return -1;
}
return L->len == 0;
}
//3、申请结点,封装数据
DCLkPtr Node_create(dataType n){
DCLkPtr N = (DCLkPtr)malloc(sizeof(DCLk)); //申请一个节点空间
if(N == NULL){
printf("Creation failed!\n");
return NULL;
}
N->data = n;
N->Next = NULL;
N->Last = NULL;
return N;
}
//4、链表尾部插入数据
int Tail_insert(DCLkPtr L, dataType n){
//判断链表是否合法
if(L == NULL){
printf("Insertion failed!\n");
return 0;
}
DCLkPtr N = Node_create(n); //创建(预插入)结点接收数据
DCLkPtr p = L; //创建一个结点 指向尾结点
for(int i=0; i<L->len; i++)
p = p->Next;
//插入
N->Next = L;
N->Last = p;
p->Next = N;
L->Last = N;
L->len++; //插入成功 链表长度自增
return 1;
}
//5、遍历结点 打印数据
void Link_show(DCLkPtr L){
//判断结点是否合法、非空
if(L == NULL || Link_empty(L)){
printf("Insertion failed!\n");
return;
}
DCLkPtr p = L; //创建一个遍历的结点
for(int i=0; i<L->len; i++){
p = p->Next;
printf("%d ", p->data);
}
putchar(10);
}
//6、链表尾部删除数据
int Tail_delet(DCLkPtr L){
//判断是否链表合法、非空
if(L == NULL || Link_empty(L)){
printf("Deletion failed!\n");
return 0;
}
DCLkPtr p = L; //创建一个结点 指向倒数第二结点
for(int i=1; i<L->len; i++)
p = p->Next;
DCLkPtr q = p->Next; //创建一个结点 指向尾结点
p->Next = q->Next;
q->Next->Last = p;
//释放空间 防止野指针
free(q);
q = NULL;
L->len--; //删除成功 链表长度自减
return 1;
}
//7、销毁链表
void Link_destory(DCLkPtr L){
//判断链表是否合法
if(L == NULL){
printf("Destruction failed!\n");
return;
}
for(int i=0; i<L->len; i++)
Tail_delet(L);
free(L);
L = NULL;
printf("Destruction succeed!\n");
}
测试文件
#include "doubularLink.h"
int main()
{
//创建链表
DCLkPtr L = Link_create();
//尾插
Tail_insert(L, 11);
Tail_insert(L, 22);
Tail_insert(L, 33);
Tail_insert(L, 44);
Tail_insert(L, 55);
//遍历
Link_show(L);
//尾删
Tail_delet(L);
Link_show(L);
//销毁
Link_destory(L);
L = NULL;
}