关于双向链表的理解

来源:互联网 发布:versions for mac过期 编辑:程序博客网 时间:2024/05/20 16:13

关于双向链表的理解

参考书籍:算法精算

今天学习之前找了下双向链表和单向链表的区别(如下图)。

双向链表的定义:

1、链表元素的定义:

typedef struct DListElmt_ {void * data;struct DListElmt_ * next;  struct DListElmt_ * prev;}DListElmt;

2、链表的定义:

typedef struct Dlist_{int size;DListElmt * head;DListElmt * tail;void (* destroy)(void *data);int (*match)(const void *key1,const void *key2);}DList;

双向链表的编程构思

1、双向链表的next插入(prev插入类同)

①、判断链表是否插入目标元素为NULL且链表不为空链

②、针对空链表的插入

③、针对非空链表的插入(这里要考虑目标元素下一个元素是否为NULL,这关系到尾结点的管理)

 程序实现:

int dlist_ins_next(DList *dlist,DListElmt *element,const void*data){DListElmt * new_element;if(element==NULL&&dlist->size!= 0)return -1;if((new_element=(DListElmt*)malloc(sizeof(DListElmt)))==NULL)return -1;new_element->data=(void *)data;if(dlist->size==0){dlist->head=new_element;dlist->head->next=NULL;dlist->head->prev=NULL;dlist->tail=new_element;}else{new_element->next=element->next;new_element->prev=element;if(element->next == NULL)dlist->tail=new_element;elseelement->next->prev=new_element;element->next=new_element;}dlist->size++;return 0;}

2、双向链表的删除

①、判断目标元素是否为NULL或链表是否为空

②、判断目标元素是否为结头

       a、是结头考虑删除后结头是否为NULL(这关系到结尾的管理)

       b、不是结头删除并考虑结尾的管理

int dlist_remove(DList * dlist,DListElmt * element,void **data){if( (dlist->size == 0)||(element == NULL) )return -1;*data=element->data;if(element == dlist->head){dlist->head=element->next;if(dlist->head==NULL)dlist->tail=NULL;else element->next->prev=NULL;}else{element->prev->next=element->next;if(element->next==NULL)dlist->tail=element->prev;elseelement->next->prev=element->prev;}free(element);dlist->size--;return 0;}
这只是学习后的一些总结,若有不足请指出,谢谢!


0 0
原创粉丝点击