1、节点定义
typedef struct DListElement_
{
void * data;
struct DListElement_ *prev;
struct DListElement_ *next;
}DListElement;
2、链表定义
typedef struct DList_
{
int size;
DListElement *head;
DListElement *tail;
}Dlist;
3、从某个节点的头部插入
-
int dlist_ins_prev(Dlist *list, DListElement *element, const void *data)
{
DListElement *new_element;
if (element == NULL && list->size != 0)//给定的节点无效
return -1;
if ((new_element = (DListElement *)malloc(sizeof(DListElement))) == NULL)
return -1;
new_element->data = (void *)data;
if (list->size == 0)//插入的为头节点
{
list->head = new_element;
list->tail = new_element;
new_element->prev = NULL;
new_element->next = NULL;
}
else//剩下的情况插入操作都是一样的
{
element->prev->next = new_element;
new_element->prev = element->prev;
element->prev = new_element;
new_element->next = element;
}
list->size++;
return;
}
4、从某个节点的尾部插入
-
int dlist_ins_next(Dlist *list, DListElement *element, const void *data)
{
DListElement *new_element;
if (element == NULL && list->size != 0)
return -1;
if ((new_element = (DListElement *)malloc(sizeof(DListElement))) == NULL)
return -1;
new_element->data = (void *)data;
if (list->size == 0)//插入的为头节点
{
list->head = new_element;
list->tail = new_element;
new_element->prev = NULL;
new_element->next = NULL;
}
else
{
if (element->next == NULL)//插入的为尾节点
{
new_element->next = NULL;
list->tail = new_element;
}
else
{
new_element->next = element->next;
element->next->prev = new_element;
}
element->next = new_element;
new_element->prev = element;
}
list->size++;
return;
}
5、删除节点
int dlist_rm_node(Dlist *list, DListElement *element, void **data)
-
{
if (element == NULL || list->size == 0)
return -1;
//这里有一个关于二重指针作为传出参数的操作,主要原因是,因为我们需要传出的是一个一重指针的值,所以需要传入他的地址,即二重指针来获取。如果传入一重指针,则后的结果和两个变量的问题一样。
*data = element->data;//获取节点的数据
if (element->prev == NULL)//删除头部节点
{
list->head = element->next;
list->head->prev = NULL;
}
if (element->next == NULL)//删除尾部节点
{
list->tail = element->prev;
list->tail->next = NULL;
}
else//删除中间节点
{
element->prev = element->next;
element->next->prev = element->prev;
}
if (element != NULL)
{
free(element);
}
list->size--;
return;
}
6、链表的遍历
int dlist_ergodic(Dlist *list)
{
DListElement *p;
p = list->head;
while (p->next != NULL)
{
printf("%d-", (int)(p->data));
p = p->next;
}
printf("%d-", (int)(p->data));
printf("\n链表的长度为%d.\n", list->size);
return;
}
首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下:
-
#ifndef DList_H
-
#define DList_H
-
typedef int Item;
-
typedef struct Node * PNode;
-
typedef PNode Position;
-
-
typedef struct Node
-
{
-
Item data;
-
PNode previous;
-
PNode next;
-
}Node;
-
-
typedef struct
-
{
-
PNode head;
-
PNode tail;
-
int size;
-
}DList;
-
-
-
Position MakeNode(Item i);
-
-
-
void FreeNode(PNode p);
-
-
-
DList* InitList();
-
-
-
void DestroyList(DList *plist);
-
-
-
void ClearList(DList *plist);
-
-
-
Position GetHead(DList *plist);
-
-
-
Position GetTail(DList *plist);
-
-
-
int GetSize(DList *plist);
-
-
-
Position GetNext(Position p);
-
-
-
Position GetPrevious(Position p);
-
-
-
PNode InsFirst(DList *plist,PNode pnode);
-
-
-
PNode DelFirst(DList *plist);
-
-
-
Item GetItem(Position p);
-
-
-
void SetItem(Position p,Item i);
-
-
-
PNode Remove(DList *plist);
-
-
-
PNode InsBefore(DList *plist,Position p,PNode s);
-
-
-
PNode InsAfter(DList *plist,Position p,PNode s);
-
-
-
PNode LocatePos(DList *plist,int i);
-
-
-
void ListTraverse(DList *plist,void (*visit)());
-
#endif
接下来逐个实现其功能,DList.c内容如下:
接下来进行测试,Test.h内容如下:
-
#include"DList.h"
-
#include<stdio.h>
-
void print(Item i)
-
{
-
printf("数据项为%d \n",i);
-
}
-
main()
-
{
-
DList *plist = NULL;
-
PNode p = NULL;
-
-
plist = InitList();
-
p = InsFirst(plist,MakeNode(1));
-
InsBefore(plist,p,MakeNode(2));
-
InsAfter(plist,p,MakeNode(3));
-
-
printf("p前驱位置的值为%d\n",GetItem(GetPrevious(p)));
-
printf("p位置的值为%d\n",GetItem(p));
-
printf("p后继位置的值为%d\n",GetItem(GetNext(p)));
-
-
-
printf("遍历输出各节点数据项:\n");
-
ListTraverse(plist,print);
-
printf("除了头节点该链表共有%d个节点\n",GetSize(plist));
-
FreeNode(DelFirst(plist));
-
printf("删除个节点后重新遍历输出为:\n");
-
ListTraverse(plist,print);
-
printf("除了头节点该链表共有%d个节点\n",GetSize(plist));
-
DestroyList(plist);
-
printf("链表已被销毁\n");
-
}
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。