C语言 双链表 插入/删除/查找/遍历/递归/合并/排序

       双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表

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
  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值