1. 双向链表的简介&概念
双向链表可以简称为双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
双向链表示意图:
一个完整的双向链表应该是头结点的pre指针指为空,尾结点的next指针指向空,其余结点前后相链。
2. 双向链表的结点设计
结点示意:
DATA表示数据,其可以是简单的类型(如int,double等等),也可以是复杂的结构体(struct类型);
pre代表的是前驱指针,它永远指向当前结点的前一个结点,如果当前结点是头结点,则pre指针为空;
next代表的是后继指针,它永远指向当前结点的下一个结点,如果当前结点是尾结点,则next指针为空。
3.创建双向链表
typedef struct DuLnode{
int data;
struct DuLnode *prior, *next;
}DuLnode, *DuLinkList;
4.初始化双链表
DuLinkList initLinkList(){
DuLinkList tH = (DuLinkList)malloc(sizeof(DuLnode));
tH->prior = NULL;
tH->next = NULL;
return tH;
}
5.插入
在表头插入示意图如下:
void insertElement(DuLinkList pH, int paraData, int paraPosition){
DuLinkList p, q, r;
if(paraPosition < 0)
{
printf("位置为负,不行!\n");
return;
}
p = pH;
for (int i = 0; i < paraPosition; i ++) {
p = p->next;
if (p == NULL) {
printf("这位置有点太大了", paraPosition);
return;
}
}
q = (DuLinkList)malloc(sizeof(DuLnode));
q->data = paraData;
r = p->next;
q->next = p->next;
q->prior = p;
p->next = q;
if (r != NULL) {
r->prior = q;
}
}
6.删除指定元素
示意图如下:
代码如下:
void deleteElement(DuLinkList pH, int paraData){ //删除这个元素
DuLinkList p;
p = pH;
while(p)
{
if(p->data == paraData)
{
if(p->prior == NULL)
{
printf("azaz\n");
pH = pH->next;
pH->next = NULL;
free(p);
return;
}
else if(p->next == NULL)
{
p->prior->next = NULL;
free(p);
return;
}
else
{
p->next->prior = p->prior;
p->prior->next = p->next;
free(p);
return;
}
}
p = p->next;
}
printf("找不到这个元素哦\n");
return;
}