问题:上一节,学了单链表。我们都是从头开始找到尾。可我不想这样,我能不能从后找前呢?
因此,出现了双向链表
一、双向链表的概述
1、双向链表的定义:
在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。
二、双向链表的搭建(即定义一个类型)
//比单链表多了一个指向前一个与自己同类型的的结点
typedef struct List
{
//数据域
int data;
//指针域
struct List *pri; //指向前一个结点
struct List *next; //指向下一个的结点
}DLL;
三、创建一个空的双向链表
//比单链表多了一个指向前一个与自己同类型的的结点
typedef struct List
{
//数据域
int data;
//指针域
struct List *pri; //指向前一个结点
struct List *next; //指向下一个的结点
}DLL;
DLL * CreateList()
{
//申请内存,作为这个表的空间
DLL * list =(DLL *)malloc(sizeof(DLL));
//初始化变量
list->data = 0; //可以省去这步
list->pri = list->next = NULL;
return list;
}
四、创建节点
DLL * CreateNode(int data)
{
DLL *newNode =(DLL *)malloc(sizeof(DLL));
newNode->data = data;
newNode->pri=newNode->next=NULL;
return newNode;
}
五、双向链表的插入删除
推荐:看——嵌入式与Linux那些事(博主)
六、双向链表的查找(与单链表一样的方法)
DLL *FindList(DLL* head,int data)
{
DLL * FindNode= head;
while (FindNode)
{
if (FindNode->data == data)
{
return FindNode;
}
FindNode=FindNode->next;
}
return NULL; //没有找到此数据,返回给主函数一个NULL;
}
}
七、双向链表的打印
void PrintList(DLL* head)
{
DLL * q=head;
while (q) //q为真,说明定义成功
{
if (q->next==NULL) 此判断满足,则只有一个节点
{
printf("%d\n",q->data);
}
else
{
printf("%d\n",q->data);
}
q=q->next;
}
}
八,更改双向链表的数据
DLL *ChangeList(DLL * head, int site,int newdata)
{
DLL *Newlist =head;
for (int i=0; i<site-1; i++)
{
Newlist=Newlist->next;
}
Newlist->data=newdata;
return Newlist;
}