/***********************************************************头文件***********************************************************/
/* header file
编程风格:
惯例风格:不得使用汉语拼音,gnu风格
文件名称:一律小写,使用名词,
变量名称:一律小写,名词,从属关系使用'_'隔离
全局变量:模块名称_变量
数组定义:首字母大写
循环变量:尽量使用i,j,k约定俗成的字母
指针变量:以小写字母p打头的单词 ‘*’靠近变量
函数命名:主语_谓语如:dllist_clear()
返回值: 一般约定返回真为‘1’,返回假为‘0’
宏定义:所有字母大写,定义一个函数动词属性,一个常量名称属性
代码注释:一般使用/×comment×/ linux代码中一般这样使用
缩进风格:行间缩进使用tab键,列间分割使用空格
表达式书写:
a=a+b;写为 a = a + b;
a=a/ *b;写为 a = a / *b;
文件划分:当一段代码超过几十行,需要考虑把代码提前封装函数调用,
当代码超过百行,需要考虑讲函数放到别的文件中
文件一般按模块划分;
函数一把按功能划分
*/
#ifndef DLNODE_H
#define DLNODE_H
typedef int elem_type;
/*定义节点*/
typedef struct node
{
elem_type data;
struct node * prior,*next;
}dnode,*pdnode;
/*定义双链表 定义此结构代码更好一些 管理双链表的一个结构*/
typedef struct
{
pdnode head;
pdnode tail;
int size;
}dllist;
/*配置值为i的节点,返回节点地址*/
pdnode node_create();
/*初始化一个双链表*/
dllist *dllist_init();
/*销毁一个双链*/
void ddllist_destroy();
/*清空双向链表*/
void dllist_clear();
/*在双链表的头插入节点*/
pdnode dllist_ins_first(dllist *plist,pdnode node);
/*在链表中某个位置之前插入新节点*/
pdnode dllist_ins_before(dllist *plist,pdnode pos,pdnode n);
/*在链表中某个位置之后插入新节点*/
pdnode dllist_ins_before(dllist *plist,pdnode pos,pdnode n);
/*获取双向链表的长度*/
int dllist_get_size(dllist *plist);
/*获取头结点位置*/
pdnode dllist_get_head(dllist *plist);
/*获取尾节点位置*/
pdnode dllist_get_tail(dllist *plist);
/*获取前驱位置*/
pdnode dllist_get_prior(dllist *plist);
/*获取后继位置*/
pdnode dllist_get_next(dllist *plist);
/*获取在第i节点的位置*/
pdnode dllist_get_position(dllist *plist,int i);
/*链表是否为空*/
int dllist_is_empty(dllist *plist);
/*遍历链表*/
void dllist_traverse(dllist *plist,void (*print)());
/*打印函数*/
void dllist_visit(elem_type);
#endif
#include "dlnode.h"
/* 配置值为i的节点,返回节点地址*/
pdnode node_create(elem_type i)
{
pdnode p = (pdnode)malloc(sizeof(dnode));
if(p != NULL)
{
p->data = i;
p->prior = NULL;
p->next = NULL;
}
return p;
}
/*初始化一个双链表 首尾指针指向本身*/
dllist *dllist_init()
{
dllist *p = (dllist*)malloc(sizeof(dllist));
pdnode head = node_create(0);
if(p != NULL)
{
if(head != NULL)
{
p->head = head;
p->tail = head;
p->size = 0;
}
else
{
return NULL;
}
}
}
/*销毁一个双链*/
void ddllist_destroy(dllist *plist)
{
ddllist_clear();
free(dllist_get_head(plist));
free(plist)
}
/*清空双向链表*/
void dllist_clear(dllist *plist)
{
pdnode tmp,p;
p = dllist_get_tail(plist);
while(dllist_is_empty(p))
{
tmp = dllist_get_prior(plist);
free(p);
p = tmp;
plist->tail = tmp;
plist->size--;
}
}
/*在双链表的头插入节点*/
pdnode dllist_ins_first(dllist *plist,pdnode node)
{
pdnode head = dllist_get_head(plist);
if(dllist_is_empty(plist))
plist->tail = node;
plist->size++;
node->next = head->next;
node->prior = head;
if(head->next != NULL)
head->prior = head;
head->next = node;
return node;
}
/*获取头节点*/
pdnode dllist_get_head(dllist *plist)
{
return plist->head;
}
/*获取双向链表的长度*/
int dllist_get_size(dllist *plist)
{
return plist->size;
}
/*获取前驱位置*/
pdnode dllist_get_prior(dllist *plist)
{
return plist->prior;
}
/*获取后继位置*/
pdnode dllist_get_next(dllist *plist)
{
return plist->next;
}
/*判断链是否为空*/
int dllist_is_empty(dllist *plist)
{
if(dllist_get_size==0 && plist->head==plist->tail)
{
return 1;
}
else
{
return 0;
}
}
/*获取尾节点位置*/
pdnode dllist_get_tail(dllist *plist)
{
return plist->tail;
}
/*获取在第i节点的位置*/
pdnode dllist_get_position(dllist *plist,int i)
{
int count = 1;
pdnode p = dllist_get_head(plist);
if(i > dllist_get_size(plist) || i<1)
{
return NULL;
}
while(count++<=i)
{
p = p->next;
}
return p;
}
/*在链表中某个位置之前插入新节点*/
pdnode dllist_ins_before(dllist *plist,pdnode p,pdnode n)
{
n->prior = p->prior;
n->next = p;
p->prior->next = n;
p->prior = n;
plist->size++;
return n;
}
/*在链表中某个位置之后插入新节点*/
pdnode dllist_ins_before(dllist *plist,pdnode pos,pdnode n)
{
n->next = p->next;
n->prior = p;
if(p->next !=NULL)
p->next->prior = n;
p->next = n;
if(p = dllist_get_tail(plist))
plist->tail = n;
plist->size++;
return n
}
/*遍历链表*/
void dllist_traverse(dllist *plist,void (*print)())
{
pdnode p = dllist_get_head(plist);
if(dllist_is_empty)
{
exit(0);
}
else
{
while(p->next != NULL)
{
p = p->next;
print(p->data);
}
}
}
/*打印函数*/
void dllist_visit(elem_type)
{
printf("item:%d",elem_type);
}