带你玩转双链表

直接上代码:

函数的声明:

#pragma once

#include<stdio.h>

#include<assert.h>

#include<stdlib.h>

#include<stdbool.h>

typedef int LTDataType;

typedef struct ListNode

{

struct ListNode* next;

struct ListNode* prev;

LTDataType data;

}LTNode;

LTNode* LTInit();

void LTPrint(LTNode* phead);

bool LTEmpty(LTNode* phead);

void LTPushBack(LTNode* phead, LTDataType x);

void LTPushFront(LTNode* phead, LTDataType x);

void LTPopBack(LTNode* phead);

void LTPopBack(LTNode* phead);

LTNode* LTFind(LTNode* phead, LTDataType x);

//在pos前插入

void LTInsert(LTNode* pos, LTDataType x);

//删除pos位置的元素

void LTErase(LTNode* pos);

void LTDestroy(LTNode* phead);

新节点空间的创建:

LTNode* BuyLTNode(LTDataType x)

{

LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));

if (newnode == NULL)

{

perror("malloc fail");

return NULL;

}

newnode->data = x;

newnode->next = NULL;

newnode->prev = NULL;

return newnode;

}

双链表的初始化:

#include"List.h"

LTNode* LTInit()

{

LTNode* phead = BuyLTNode(-1);

phead->next = phead;

phead->prev = phead;

return phead;

}

双链表的打印:

void LTPrint(LTNode* phead)

{

assert(phead);

printf("guard<==>");

LTNode* cur = phead->next;

while (cur != phead)

{

printf("%d<==>", cur->data);

cur = cur->next;

}

printf("\n");

}

判断双链表是否为空:

bool LTEmpty(LTNode* phead)

{

assert(phead);

return phead->next == phead;

}

双链表的尾插:

void LTPushBack(LTNode* phead, LTDataType x)

{

assert(phead);

LTInsert(phead, x);

}

双链表的头插:

void LTPushFront(LTNode* phead, LTDataType x)

{

assert(phead);

LTInsert(phead->next, x);

}

双链表的尾删:

void LTPopBack(LTNode* phead)

{

assert(phead);

assert(!LTEmpty(phead));

LTErase(phead->prev);

}

双链表的头删:

void LTPopFront(LTNode* phead)

{

assert(phead);

assert(!LTEmpty(phead));

LTErase(phead->next);

}

双联表中元素的查找:

LTNode* LTFind(LTNode* phead, LTDataType x)

{

assert(phead);

LTNode* cur = phead->next;

while (cur != phead)

{

if (cur->data == x)

{

return cur;

}

cur = cur->next;

}

return NULL;

}

在指定位置插入:

void LTInsert(LTNode* pos, LTDataType x)

{

assert(pos);

LTNode* prev = pos->prev;

LTNode* newnode = BuyLTNode(x);

newnode->prev = prev;

prev->next = newnode;

newnode->next = pos;

pos->prev = newnode;

}

删除指定位置的元素:

void LTErase(LTNode* pos)

{

assert(pos);

LTNode* prev = pos->prev;

LTNode* next = pos->next;

prev->next = next;

next->prev = prev;

free(pos);

}

双链表的销毁:

void LTDestroy(LTNode* phead)

{

assert(phead);

LTNode* cur = phead->next;

while (cur!=phead)

{

LTNode* next = cur->next;

free(cur);

cur = next;

}

free(phead);

}

test.c:

#include"List.h"

void Test()

{

LTNode* plist = LTInit();

LTPushBack(plist, 1);

LTPushBack(plist, 2);

LTPushBack(plist, 3);

LTPushBack(plist, 4);

LTPushBack(plist, 5);

LTPrint(plist);

LTPopBack(plist);

LTPrint(plist);

LTInsert(plist->next, 6);

LTPrint(plist);

LTPushFront(plist, 8);

LTPrint(plist);

LTDestroy(plist);

plist = NULL;

}

int main()

{

Test();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值