简化双链表的尾插,头插,尾删,头删代码

1.ListNode.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef int LTDataType;
typedef struct ListNode
{
	struct ListNode* next;
	struct ListNode* prev;
	LTDataType data;
}LN;
//初始化
LN* ListInit();
//打印
void List_print(LN* plist);
//查找
LN* ListFind(LN* plist,LTDataType x);
//尾插
void ListPushBank(LN* plist, LTDataType x);
//头插
void ListPushFront(LN* plist, LTDataType x);
//尾删
void ListPopBank(LN* plist);
//头删
void ListPopFront(LN* plist);
//pos之前插入x
void ListInsert(LN* pos, LTDataType x);
//删除pos位置
void ListErase(LN* pos);
//销毁
void ListDestroyed(LN* plist);
 

2.ListNode.c源文件实现

#include"ListNode.h"
//创建节点
LN* BuyListNode(LTDataType x)
{
	LN* newnode = (LN*)malloc(sizeof(LN));
	newnode->data = x;
	newnode->next = newnode->prev = newnode;
	return newnode;
}
//初始化
LN* ListInit()
{
	LN* newnode = BuyListNode(0);//哨兵位
}
//尾插
void ListPushBank(LN* plist,LTDataType x)
{
	assert(plist);
	//快捷
	ListInsert(plist->prev->next, x);
}
//打印
void List_print(LN* plist)
{
	LN* ret = plist->next;//哨兵不需要打印
	while (ret != plist)
	{
		printf("%d->", ret->data);
		ret = ret->next;
	}
	printf("NULL\n");
}
//头插
void ListPushFront(LN* plist, LTDataType x)
{
	assert(plist);
	ListInsert(plist->next, x);
}
//尾删
void ListPopBank(LN* plist)
{
	assert(plist);
	ListErase(plist->prev);
}
//头删
void ListPopFront(LN* plist)
{
	assert(plist);
	//快捷方式
	ListErase(plist->next);
}
//查找
LN* ListFind(LN* plist, LTDataType x)
{
	assert(plist);
	LN* ret = plist->next;
	while (ret != plist)
	{
		if (x == ret->data) 
		{
			return ret;
		}
		ret = ret->next;
	}
	return NULL;
}
//pos之前插入内容
void ListInsert(LN* pos, LTDataType x)
{
	assert(pos);
	LN* newnode = BuyListNode(x);
	LN* pcur = pos->prev;
	pcur->next = newnode;
	newnode->next = pos;
	newnode->prev = pcur;
	pos->prev = newnode;
}
//删除pos位置
void ListErase(LN* pos)
{
	assert(pos);
	LN* prev = pos->prev;
	LN* next = pos->next;
	prev->next = next;
	next->prev = prev;
	free(pos);
}
//销毁
void ListDestroyed(LN* plist)
{
	assert(plist);
	LN* cur = plist->next;
	while (cur != plist)
	{
		LN* ret = cur->next;
		free(cur);
		cur = ret;
	}
	free(plist);
	plist = NULL;
	printf("销毁成功\n");
}

只需调用ListInsert函数和 ListErase函数来实现简化的头插,尾插,头删,尾删步骤的代码

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值