数据结构 带头节点的双向循环链表

头文件

cpp 复制代码
#pragma once
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
using namespace std;

typedef struct node {
	int data;
	node* next;
	node* prev;
}node;

typedef struct linklist {
	int cursize;
	node* head;
}linklist;

//1.初始化
node* buynode(int val);
void initlist(linklist* ps);
//2.在一个节点前插入元素
bool insertelem(linklist* ps, node* ptr, int val);
//3.打印
void print_(linklist* ps);
//4.删除节点
bool erasenode(linklist* ps,node* ptr);
//5.头删
bool erasefront(linklist* ps);
//6.尾删
bool eraselast(linklist* ps);
//7.头插
bool insertfront(linklist* ps, int val);
//8.尾插
bool insertback(linklist* ps, int val);

源文件

cpp 复制代码
#include"带头节点双向循环链表.h"


//1.初始化
node* buynode(int val) {
	node* p = (node*)malloc(sizeof(node));
	if (p == nullptr) {
		cout << "申请内存失败" << endl;
		return NULL;
	}
	p->data = val;
	p->next = p;
	p->prev = p;
	return p;
}
void initlist(linklist* ps) {
	assert(ps != nullptr);
	ps->head = buynode(0);
	ps->cursize = 0;
}
//2.在一个节点前插入元素
bool insertelem(linklist* ps, node* ptr, int val) {
	assert(ps != nullptr && ptr != nullptr);
	node* p = buynode(val);
	p->next = ptr;
	p->prev = ptr->prev;
	ptr->prev->next = p;
	ptr->prev = p;
	ps->cursize++;
	return true;
}
//3.打印
void print_(linklist* ps) {
	assert(ps != nullptr);
	for (node* p = ps->head->next; p != ps->head; p = p->next) {
		cout << p->data << " ";
	}cout << endl;
}
//4.删除节点
bool erasenode(linklist* ps, node* ptr) {
	assert(ps != nullptr&&ptr!=nullptr);
	if (ptr == ps->head)return false;
	ptr->prev->next = ptr->next;
	ptr->next->prev = ptr->prev;
	free(ptr);
	ps->cursize--;
	return true;
}
//5.头删
bool erasefront(linklist* ps) {
	assert(ps != nullptr);
	if (ps->cursize == 0) return false;
	node* p = ps->head->next;
	ps->head->next = p->next;
	p->next->prev = ps->head;
	free(p);
	ps->cursize--;
	return true;
}
//6.尾删
bool eraselast(linklist* ps) {
	assert(ps != nullptr);
	if (ps->cursize == 0) return false;
	node* p = ps->head->prev;
	ps->head->prev = ps->head->prev->prev;
	ps->head->prev->next = ps->head;
	free(p);
	ps->cursize--;
	return true;
}
//7.头插
bool insertfront(linklist* ps, int val) {
	assert(ps != nullptr);
	node* p = buynode(val);
	ps->head->next->prev = p;
	p->next = ps->head->next;
	ps->head->next = p;
	p->prev = ps->head;
	ps->cursize++;
	return true;
}
//8.尾插
bool insertback(linklist* ps, int val) {
	assert(ps != nullptr);
	node* p = buynode(val);
	ps->head->prev->next = p;
	p->prev = ps->head->prev;
	p->next = ps->head;
	ps->head->prev = p;
	ps->cursize++;
	return true;
}
int main() {

	return 0;
}
相关推荐
kishu_iOS&AI1 分钟前
机器学习 —— 线性回归(2)
人工智能·python·算法·机器学习·线性回归
NULL指向我4 分钟前
信号处理学习笔记6:ADC采样线性处理实测拟合
人工智能·算法·机器学习
汽车仪器仪表相关领域6 分钟前
NHXJ-02汽车悬架检验台 实操型实战手册
人工智能·功能测试·测试工具·算法·安全·单元测试·可用性测试
源码之屋8 分钟前
计算机毕业设计:Python天气数据采集与可视化分析平台 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅
人工智能·python·深度学习·算法·django·线性回归·课程设计
我爱C编程8 分钟前
【3.2】FFT/IFFT变换的数学原理概述与MATLAB仿真
算法·matlab·fpga·fft·ifft
chao18984416 分钟前
基于改进二进制粒子群算法的含需求响应机组组合问题MATLAB实现
开发语言·算法·matlab
Imxyk23 分钟前
P9242 [蓝桥杯 2023 省 B] 接龙数列
c++·算法·图论
炽烈小老头27 分钟前
【每天学习一点算法 2026/04/10】Excel表列序号
学习·算法
郝学胜-神的一滴27 分钟前
二叉树后序遍历:从递归到非递归的优雅实现
数据结构·c++·程序人生·算法·
宝贝儿好30 分钟前
【LLM】第一章:分词算法BPE、WordPiece、Unigram、分词工具jieba
人工智能·python·深度学习·神经网络·算法·语言模型·自然语言处理