双向循环链表

#ifndef _DLINKED_LIST_H__
#define _DLINKED_LIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int ETYPE;

typedef struct DNode{
	ETYPE elem;
	struct DNode *prev; //prior
	struct DNode *next; 
}DNode,*DLinkedList; 

#define DNODESIZE sizeof(struct DNode)


DLinkedList dlinked_list_create(void);//创建双向循环链表
bool dlinked_list_empty(DLinkedList head);//是否为空
size_t dlinked_list_size(DLinkedList head);//返回元素个数
int dlinked_list_insert(DLinkedList head,size_t pos,ETYPE elem);//指定位置插入元素
int dlinked_list_delete(DLinkedList head,size_t pos,ETYPE *pelem);//删除指定位置元素
int dlinked_list_get(DLinkedList head,size_t pos,ETYPE *pelem);//获取指定位置元素
ETYPE *dlinked_list_find(DLinkedList head,ETYPE *pelem);//查找元素
void dlinked_list_clear(DLinkedList head);//清空元素
void dlinked_list_destroy(DLinkedList head);//销毁链表

#endif //_DLINKED_LIST_H__

#include "dlinkedlist.h"

static struct DNode *create_dnode(ETYPE elem,struct DNode *prev,struct DNode *next){
	struct DNode *node = (struct DNode *)malloc(DNODESIZE);
	if(node != NULL){
		node->elem = elem;
		node->prev = prev;
		node->next = next;
	}
	return node;
}

DLinkedList dlinked_list_create(void){
	return create_dnode(0,NULL,NULL);
}
bool dlinked_list_empty(DLinkedList head){
	return head->next == NULL;
}
size_t dlinked_list_size(DLinkedList head){
	size_t size = 0;
	struct DNode *node = head->next;
	for(;node!=NULL;node=node->next){
		++size;
	}
	return size;
}
static struct DNode *dlinked_list_get_prev_node(DLinkedList head,size_t pos){
	size_t i;
	struct DNode *node = head;
	for(i=0;i<pos&&node!=NULL;++i){
		node = node->next;
	}
	return node;
}

int dlinked_list_insert(DLinkedList head,size_t pos,ETYPE elem){
	struct DNode *prev = dlinked_list_get_prev_node(head,pos);
	//dlinked_list_insert_back(prev,elem);
	if(prev == NULL){
		return -1;
	}
	/*
	struct DNode *curr = (struct DNode *)malloc(DNODESIZE);
	curr->next = prev->next;
	curr->prev = prev;
	curr->elem = elem; 
	*/
	struct DNode *curr = create_dnode(elem,prev,prev->next); 
	if(curr == NULL){
		return -1;
	}
	if(prev->next != NULL)
		prev->next->prev = curr;
	
	prev->next = curr;
	return 0;	
}
//int dlinked_list_delete(DNode *p);
int dlinked_list_delete(DLinkedList head,size_t pos,ETYPE *pelem){
	struct DNode *prev = dlinked_list_get_prev_node(head,pos);
	if(prev == NULL || prev->next == NULL){
		return -1;
	}
	struct DNode *curr = prev->next;
	*pelem = curr->elem;
	if(curr->next!=NULL)
		curr->next->prev = prev;
	prev->next = curr->next;
	free(curr);
	return 0;
}
int dlinked_list_get(DLinkedList head,size_t pos,ETYPE *pelem){
	struct DNode *curr = dlinked_list_get_prev_node(head,pos+1);
	if(curr == NULL){
		return -1;
	}
	*pelem = curr->elem;
	return 0;
}
ETYPE *dlinked_list_find(DLinkedList head,ETYPE *pelem){
	struct DNode *node = head->next;
	for(;node!=NULL;node = node->next){
		if(node->elem == *pelem){
			return &node->elem;
		}
	}
	return NULL;
}

void dlinked_list_clear(DLinkedList head){
	struct DNode *node,*next;
	for(node=head->next;node!=NULL;node = next){
		next = node->next;
		free(node);
	}
	head->next = NULL;
}
void dlinked_list_destroy(DLinkedList head){
	dlinked_list_clear(head);
	free(head);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值