双向链表就是在单向链表的基础上,增加了反向输出的功能,所以难度只是比单链表难理解一点点。
初始化链表:
typedef struct DNode
{
int data;
struct DNode *priod, *Next;
}DNode,*LinkDNode;
建立前驱指针和后继指针
头插法创建元素:
思路讲解:创建一个新结点,使用动态内存分配空间。将NewNode指向头节点的下一个结点,然后将头结点的Next指向新创建结点(和单链表一样),不同的是你需要把反向的操作也用代码表示出来,即:头结点的下一个结点的前驱指针指向新节点,新节点的前驱指针指向头节点。
代码如下:
void add(DNode *head,int a)
{
DNode *NewNode = (DNode*)malloc(sizeof(DNode));
NewNode->data = a;
NewNode->Next = head->Next; //(单链表头插法)
head->Next = NewNode;
head->Next->priod = NewNode;
NewNode->priod = head;
}
删除结点:
思路:找到需要删除的结点的前一个结点,然后新定义一个指针变量来存储删除结点,然后直接将删除结点的前一个的Next指向删除结点的后一个结点,然后将后一个结点的前驱指针指向删除结点的前一个结点。然后释放掉删除结点的内存空间。
代码如下:
void delect(DNode *head,int t)
{
while(head->Next->data != t)
{
head = head->Next;
}
DNode *p = head->Next;
head->Next = p->Next;
p->priod = head;
free(p);
}
查询操作:可以使用单链表查询的方法,除此之外,可以倒着往回找
正常查找:
void cha(DNode *head,int a)
{
while(head->data != a)
{
if(head->Next == NULL)
break;
head = head->Next;
}
if(head->Next == NULL)
{
printf("NO");
}
else
{
printf("YES %d",head->data);
}
}
完整代码:
#include<stdio.h>
#define MaxSize 10
#define TRUE 1
#define FORSE 0
#include "malloc.h"
typedef struct DNode
{
int data;
struct DNode *priod, *Next;
}DNode,*LinkDNode;
LinkDNode createList()
{
DNode *headNode = (DNode*)malloc(sizeof(DNode));
headNode->priod = NULL;
headNode->Next = NULL;
return headNode;
}
void add(DNode *head,int a)
{
DNode *NewNode = (DNode*)malloc(sizeof(DNode));
NewNode->data = a;
NewNode->Next = head->Next;
head->Next = NewNode;
head->Next->priod = NewNode;
NewNode->priod = head;
}
void delect(DNode *head,int t)
{
while(head->Next->data != t)
{
head = head->Next;
}
DNode *p = head->Next;
head->Next = p->Next;
p->priod = head;
free(p);
}
void cha(DNode *head,int a)
{
while(head)
{
head = head->Next;
}
while(head->data != a)
{
if(head->priod == NULL)
break;
head = head->priod;
}
if(head->priod == NULL)
{
printf("NO");
}
else
{
printf("YES %d",head->data);
}
/*while(head->data != a)
{
if(head->Next == NULL)
break;
head = head->Next;
}
if(head->Next == NULL)
{
printf("NO");
}
else
{
printf("YES %d",head->data);
}*/
}
void print(DNode *head)
{
head = head->Next;
while(head)
{
printf("%d ",head->data);
head = head->Next;
}
}
int main()
{
DNode *s = createList();
add(s,2);
add(s,3);
add(s,4);
add(s,5);
cha(s,5);
return 0;
}