头文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
//定义双向循环链表结构体
typedef struct dblist{
//数据域结构体
union{
datatype data;
int len;
};
//指针域
struct dblist* next;
struct dblist* pre;
}Node,*pdblist;
#endif
功能函数文件
#include "dblinklist.h"
//创建头结点
pdblist create_head()
{
pdblist H=(pdblist)malloc(sizeof(Node));
//合法性判断
if(NULL==H){
puts("The application was unsuccessful");
return NULL;
}
H->len=0;
H->pre=NULL;
H->next=NULL;
return H;
}
//创建新节点
pdblist create_new(pdblist H,datatype data)
{
pdblist new=(pdblist)malloc(sizeof(Node));
//合法性判断
if(NULL==new){
puts("The application was unsuccessful");
return NULL;
}
new->data=data;
new->next=NULL;
new->pre=NULL;
return new;
}
//输出
int out_dblist(pdblist H)
{
//合法性判断
if(NULL==H){
puts("The input is invalid");
return -1;
}
//判断是否只有头结点
if(NULL==H->next){
puts("Only the head node");
return -2;
}
//循环输出
pdblist p=H->next;
while(p!=NULL){
printf("%d->",p->data);
p=p->next;
}
putchar(10);
return 0;
}
//实现插入(尾)
int insert_tail(pdblist H,datatype data)
{
//创建新节点
pdblist new=create_new(H,data);
//合法性判断
if(NULL==H){
puts("The input is invalid");
return -1;
}
pdblist p=H;
//找到尾节点
while(p->next!=NULL){
p=p->next;
}
p->next=new;
new->pre=p;
H->len++;
return 0;
}
//实现插入(头)
int insert_head(pdblist H,datatype data)
{
//创建新节点
pdblist new=create_new(H,data);
//合法性判断
if(NULL==H){
puts("The input is invalid");
return -1;
}
//新节点插入
new->next=H->next;
//判断是否只有头结点
if(NULL!=H->next){
H->next->pre=new;
}
new->pre=H;
H->next=new;
H->len++;
return 0;
}
//实现删除(尾)
int dele_tail(pdblist H)
{
//合法性判断
if(NULL==H){
puts("The input is invalid");
return -1;
}
//判断是否只有头结点
if(NULL==H->next){
puts("Only the head node");
return -2;
}
pdblist del=H;
//循环找到最后一个节点
while(del->next!=NULL){
del=del->next;
}
del->pre->next=NULL;
free(del);
del=NULL;
H->len--;
}
//实现删除(头)
int dele_head(pdblist H)
{
//合法性判断
if(NULL==H){
puts("The input is invalid");
return -1;
}
//判断是否只有头结点
if(NULL==H->next){
puts("Only the head node");
return -2;
}
pdblist del=H->next;
H->next=del->next;
if(del->next!=NULL){
del->next->pre=H;
}
free(del);
del=NULL;
H->len--;
return 0;
}
//按位置插入
int insert_pos(pdblist H,datatype data,int pos)
{
//合法性判断
if(NULL==H){
puts("The input is invalid");
return -1;
}
//判断位置合理性
if(pos<=0||pos>H->len+1){
puts("Location is unreasonable");
return -2;
}
pdblist new=create_new(H,data);
int i=1;
pdblist p=H->next;
//循环找到pos-1的对应节点
while(i!=pos-1){
p=p->next;
i++;
}
new->next=p->next;
//判断是否是最后一个节点
if(NULL!=p->next){
p->next->pre=new;
}
p->next=new;
new->pre=p;
H->len++;
return 0;
}
//任意位置删除
int dele_pos(pdblist H,int pos)
{
//合法性判断
if(NULL==H){
puts("The input is invalid");
return -1;
}
//判断位置合理性
if(pos<=0||pos>H->len+1){
puts("Location is unreasonable");
return -2;
}
int i=1;
pdblist del=H->next;
//循环找到pos所对应的节点
while(i!=pos){
del=del->next;
i++;
}
del->pre->next=del->next;
//判断pos节点是否是最后一个节点
if(del->next!=NULL){
del->next->pre=del->pre;
}
free(del);
del=NULL;
H->len--;
return 0;
}
以上为双向链表的实现函数部分。