双向链表操作c语言 函数,c语言 双向链表的基础操作

这篇博客详细介绍了如何实现双向链表的基本操作,包括初始化、创建节点、遍历输出、尾插、尾删、头插、头删、查找、插入、删除、逆置和销毁链表。同时,通过测试用例展示了这些操作的实际应用,如插入新元素、删除特定位置元素、逆序链表等。
摘要由CSDN通过智能技术生成

//头文件

#pragma once

typedef int DataType;

typedef struct LinkList

{

DataType _data;

struct LinkList* _next;

struct LinkList* _prev;

}LinkList,*pLinkList;

void InitList(pLinkList pNode);

pLinkList _BuyNode(pLinkList& pNode,DataType x);

void PrintList(pLinkList pHead);

void PushBack(pLinkList& pHead,DataType x);

void PopBack(pLinkList& pHead);

void PushFront(pLinkList& pHead,DataType x);

void PopFront(pLinkList& pHead);

pLinkList Find(pLinkList pHead, DataType x);

void Insert(pLinkList pos,DataType x);

void Erase(pLinkList& pHead, pLinkList pos);

void Reverse(pLinkList& pHead);

void DestroyList(pLinkList& pHead);

//函数文件

#include

#include

#include"LinkList.h"

#include

//初始化

void InitList(pLinkList pNode)

{

assert(pNode);

if (pNode->_next == NULL)

{

pNode->_prev = NULL;

}

}

//创建节点

pLinkList _BuyNode(pLinkList& pNode, DataType x)

{

pNode = (pLinkList)malloc(sizeof(LinkList));

pNode->_data = x;

pNode->_next = NULL;

pNode->_prev = NULL;

return pNode;

}

//遍历输出链表数据域

void PrintList(pLinkList pHead)

{

pLinkList head = pHead;

if(pHead == NULL)

{

printf("链表为空!\n");

return;

}

while (head)

{

printf("%d ",head->_data);

head = head->_next;

}

printf("\n");

}

//尾插

void PushBack(pLinkList& pHead, DataType x)

{

pLinkList head = pHead;

if (head == NULL)

{

_BuyNode(pHead, x);

return;

}

while (head->_next)

{

head = head->_next;

}

head->_next = _BuyNode(head->_next,x);

head->_next->_prev = head;

}

//尾删

void PopBack(pLinkList& pHead)

{

pLinkList head = pHead;

pLinkList tmp = NULL;

if (pHead == NULL)

{

printf("链表已空!\n");

return;

}

if (head->_next == NULL)

{

free(head);

pHead = NULL;

return;

}

while (head->_next)

{

head = head->_next;

}

tmp = head->_prev;

tmp->_next = NULL;

free(head);

}

//头插

void PushFront(pLinkList& pHead, DataType x)

{

pLinkList head = pHead;

pLinkList tmp = pHead;

if (pHead == NULL)

{

_BuyNode(pHead, x);

return;

}

pHead=_BuyNode(head->_prev, x);

pHead->_next = tmp;

}

//头删

void PopFront(pLinkList& pHead)

{

pLinkList tmp = pHead;

if (pHead == NULL)

{

printf("链表已空!\n");

return;

}

pHead = pHead->_next;

if (pHead)

{

pHead->_prev = NULL;

}

free(tmp);

}

//查找

pLinkList Find(pLinkList pHead, DataType x)

{

pLinkList head = pHead;

assert(pHead);

while (head)

{

if (head->_data == x)

return head;

head = head->_next;

}

return NULL;

}

//中插_之后

void Insert(pLinkList pos, DataType x)

{

pLinkList tmp = pos->_next;

assert(pos);

_BuyNode(pos->_next, x);

pos->_next->_prev = pos;

pos->_next->_next = tmp;

}

//中删

void Erase(pLinkList& pHead, pLinkList pos)

{

pLinkList tmp = pos;

assert(pos);

if (pos->_next == NULL)

{

pos->_prev->_next = NULL;

free(tmp);

return;

}

if (pos==pHead)

{

pHead = pHead->_next;

pHead->_prev = NULL;

free(pos);

return;

}

tmp->_prev->_next = tmp->_next;

tmp->_next->_prev = tmp->_prev;

free(pos);

}

//逆置

void Reverse(pLinkList& pHead)

{

pLinkList head = pHead;

pLinkList tmp = pHead;

if (pHead == NULL&&pHead->_next == NULL)

return;

while (head)

{

tmp = head->_next;

head->_next = head->_prev;

head->_prev = tmp;

if (head->_prev == NULL)

pHead = head;

head = tmp;

}

}

//销毁

void DestroyList(pLinkList& pHead)

{

while (pHead)

{

PopFront(pHead);

}

}

//测试用例  主函数

#include"LinkList.h"

#include

void test1()

{

pLinkList pHead=NULL;

//PushBack(pHead, 1);

//PushBack(pHead, 2);

//PushBack(pHead, 3);

//   PushBack(pHead, 4);

//PushBack(pHead, 5);

//PrintList(pHead);

//PopBack(pHead);

//PopBack(pHead);

//PopBack(pHead);

//PopBack(pHead);

//PopBack(pHead);

//PopBack(pHead);

PushFront(pHead, 1);

PushFront(pHead, 2);

PushFront(pHead, 3);

PushFront(pHead, 4);

PushFront(pHead, 5);

PrintList(pHead);

//PopFront(pHead);

//PopFront(pHead);

//PopFront(pHead);

//PopFront(pHead);

//PopFront(pHead);

//PopFront(pHead);

//printf("%d\n",Find(pHead, 6));

Insert(Find(pHead, 1), 6);

Erase(pHead,Find(pHead,2));

PrintList(pHead);

Reverse(pHead);

PrintList(pHead);

DestroyList(pHead);

PrintList(pHead);

}

int main()

{

test1();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值