![](https://i-blog.csdnimg.cn/direct/b50603a4aaeb4884b39472439704a33b.png)
![](https://i-blog.csdnimg.cn/direct/824e66e856c64885a1eae6cdb3a0e166.png)
main.c
#include "doulooplink.h"
int main(int argc, const char *argv[])
{
doulooplink_ptr ptr = create();
tail_insert(ptr,1);
tail_insert(ptr,2);
tail_insert(ptr,3);
int i = tail_insert(ptr,4);
show(ptr);
tail_delete(ptr);
tail_delete(ptr);
show(ptr);
destory(ptr);
return 0;
}
doulooplink.c
#include "doulooplink.h"
doulooplink_ptr create()
{
doulooplink_ptr ptr = (doulooplink_ptr)malloc(sizeof(doulooplink));
if(ptr == NULL)
{
return NULL;
}
ptr->len = 0;
ptr->next = ptr;
ptr->prev = ptr;
return ptr;
}
int isempty(doulooplink_ptr ptr)
{
if(ptr == NULL)
{
return -1;
}
if(ptr->next == ptr)
{
return 1;
}
return 0;
}
doulooplink_ptr create_node(DataType data)
{
doulooplink_ptr ptr = (doulooplink_ptr)malloc(sizeof(doulooplink));
if(ptr == NULL)
{
return NULL;
}
ptr->data = data;
ptr->next = NULL;
ptr->prev = NULL;
return ptr;
}
int tail_insert(doulooplink_ptr ptr,DataType data)
{
if(ptr == NULL)
{
return -1;
}
doulooplink_ptr innode = create_node(data);
doulooplink_ptr node = ptr;
while(node->next != ptr)
{
node=node->next;
}
innode->next = ptr;
ptr->prev = innode;
innode->prev = node;
node->next = innode;
ptr->len++;
return 1;
}
void show(doulooplink_ptr ptr)
{
if(ptr == NULL || isempty(ptr)!=0)
{
return;
}
doulooplink_ptr node = ptr;
while(node->next!=ptr)
{
printf("%d ",node->next->data);
node= node->next;
}
putchar(10);
}
int tail_delete(doulooplink_ptr ptr)
{
if(ptr == NULL || isempty(ptr)!=0)
{
return -1;
}
doulooplink_ptr node = ptr;
while(node->next!=ptr)
{
node = node->next;
}
(node->prev)->next = ptr;
ptr->prev = node->prev;
free(node);
node = NULL;
ptr->len--;
return 1;
}
void destory(doulooplink_ptr ptr)
{
if(ptr == NULL)
{
return;
}
while(ptr->next!=ptr)
{
tail_delete(ptr);
}
free(ptr);
ptr = NULL;
}
doulooplink.h
#ifndef __DOULOOPLINK_H
#define __DOULOOPLINK_H
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct node
{
union
{
int len;
DataType data;
};
struct node *next;
struct node *prev;
}doulooplink,*doulooplink_ptr;
//创建双向链表
doulooplink_ptr create();
//判断链表是否为空
int isempty(doulooplink_ptr);
//创建节点
doulooplink_ptr create_node(DataType data);
//尾插
int tail_insert(doulooplink_ptr,DataType data);
//遍历
void show(doulooplink_ptr);
//尾删
int tail_delete(doulooplink_ptr);
//销毁
void destory(doulooplink_ptr);
#endif