双向链表基本操作的实现
双向链表的特点:双向链表相对于单向链表其优点在于其可以同时查看某个节点的前驱节点和其后继节点,当然因为一个节点使用了两个指针来记录前后节点的位置,其每个节点占用的内存空间自然更大
其实现的基本操作代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElementType;
typedef struct LNode {
ElementType element;
struct LNode *prior;
struct LNode *next;
} LNode, *DLinkList;
//***************定义基本操作*******************
DLinkList Init_List(DLinkList L);
DLinkList List_HeadInsert(DLinkList L, ElementType e);
DLinkList List_TailInsert(DLinkList L, DLinkList P, ElementType e);
void PrtList(DLinkList L);
int List_Length(DLinkList L);
bool Delete_ListNode(DLinkList L, int locate);
//******************#end**********************
int main() {
DLinkList list = NULL, point = NULL;
list = Init_List(list);
point = list;
for (int i = 0; i < 5; ++i) {
/*point = List_TailInsert(list, point, i);
* //如果不使用point接受返回值,最后会修改list所指向的位置*/
point = List_TailInsert(list, point, i);
}
int length = List_Length(list);
printf("% d\n", length);
Delete_ListNode(list, 2);
PrtList(list);
return 0;
}
//*************实现基本操作**********************
DLinkList Init_List(DLinkList L) {
L = (DLinkList) malloc(sizeof(LNode));
L->prior = NULL;
L->next = NULL;
//初始化之后要注意将该链表带回去
return L;
}
DLinkList List_HeadInsert(DLinkList L, ElementType e) {
//插入元素按照逆序排列,故可用于栈的实现
DLinkList NewNode = (DLinkList) malloc(sizeof(LNode));
if (NewNode == NULL) {
printf("memory is full");
return false;
}
NewNode->next = L->next;
L->next = NewNode;
NewNode->prior = L;
NewNode->element = e;
return L;
}
DLinkList List_TailInsert(DLinkList L, DLinkList P, ElementType e) {
//插入元素顺序排列
DLinkList NewNode = (DLinkList) malloc(sizeof(LNode));
NewNode->element = e;
P->next = NewNode;
NewNode->prior = P;
NewNode->next = NULL;
P = NewNode;
return P;
}
void PrtList(DLinkList L) {
while (L->next != NULL) {
L = L->next;
printf("%d->", L->element);
}
}
int List_Length(DLinkList L) {
//统计链表的长度
int counter = 0;
while (L->next != NULL) {
L = L->next;
counter++;
}
return counter;
}
ElementType GetElement(DLinkList L, int locate) {
//查看某个位置的元素
if (List_Length(L) < locate) {
printf("The List not found locate!!");
return false;
}
DLinkList P = L;
while (locate > 0) {
P = P->next;
locate--;
}
return P->element;
}
bool Delete_ListNode(DLinkList L, int locate) {
//删除制定位置的节点
DLinkList P = L;
if (List_Length(L) < locate) {
printf("The List not found locate!!");
return false;
}
while (locate > 0) {
P = P->next;
locate--;
}
P->prior->next = P->next;
P->next->prior = P->prior;
free(P);
return true;
}
/************************#end**********************/