基本编程风格和双向链表的实现

/***********************************************************头文件***********************************************************/
/* 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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值