双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
1 双链表数据结构
1.1 新增节点图解
1.2 删除一个节点图解
2 双链表操作
双链表和单链表在操作主要区别在于插入和删除,双链表需要修改节点两端指针的指向。这里的双链表非循环双链表。所以代码和上一章中的单链表的操作区别不是很大,主要还是在于理解其数据结构,下面请看双链表的源码:
先看头文件doublylist.h
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
//typedef int DataType;
//定义链表节点
typedef struct node
{
int data; //链表数据
struct node* pPrev; //链表上个节点
struct node* pNext; //链表下个节点
}Node, *pNode;
//创建节点
pNode CreateNode_two(int data );
//遍历链表
void travelList_two(pNode pHead);
//尾插法
void pushBack_two(pNode* pHead, int data);
//尾删法
void popBack_two(pNode* pHead);
//头插法
void pushFront_two(pNode* pHead, int data);
//头删法
void popFront_two(pNode* pHead);
//清空链表
void destoryList_two(pNode pHead);
//获取链表长度
int getListSize_two(pNode pHead);
//查找节点
pNode findNode_two(pNode pHead, int data);
//在某位置后插入数据
void insertNode_two(pNode pPos, int data);
//删除某位置的数据根据节点数据
void deleteNode_bydata_two(pNode* pHead, int data);
//删除某位置的数据节点指针
void deleteNode_bynode_two(pNode* pHead, pNode pos);
//查找中间节点
pNode findMidNode_two(pNode pHead);
//查找倒数第k个节点(要求只能遍历一次)
pNode findKNode_two(pNode pHead,int k);
//倒着打印单链表(递归)
void travelList_TailtoHead_two(pNode pHead);
// 将原链表逆置
void reverse_two(pNode* pHead);
//合并两个有序链表(递归)
pNode mergetwoList_two(pNode pHead1, pNode pHead2);
//冒泡排序
void sortList_two(pNode pHead);
再看doublylist.cpp
#include "doublylist.h"
//创建节点
pNode CreateNode_two(int data )
{
pNode pTemp = (pNode)malloc(sizeof(Node