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

头文件

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"

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;
}
//1.初始化
void initlist(linklist* ps) {
	assert(ps != nullptr);
	ps->head = nullptr;
	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);
	if (ps->head == nullptr) return;
	node* p = ps->head;
	do {
		cout << p->data << " ";
		p = p->next;
	} while (p != ps->head);
	cout << endl;
}
//4.删除节点
bool erasenode(linklist* ps, node* ptr) {
	assert(ps != nullptr && ptr != nullptr);
	if (ps->cursize == 1) {
		ps->head = nullptr;
	}
	else {
		ptr->prev->next = ptr->next;
		ptr->next->prev = ptr->prev;
		if (ptr == ps->head) {
			ps->head = ptr->next;
		}
	}
	free(ptr);
	ps->cursize--;
	return true;
}
//5.头删
bool erasefront(linklist* ps) {
	assert(ps != nullptr);
	if (ps->head == nullptr) return false;
	return erasenode(ps, ps->head);
}
//6.尾删
bool eraselast(linklist* ps) {
	assert(ps != nullptr);
	if (ps->head == nullptr) return false;
	return erasenode(ps, ps->head->prev);
}
//7.头插
bool insertfront(linklist* ps, int val) {
	assert(ps != nullptr);
	if (ps->head == nullptr) {
		ps->head = buynode(val);
		ps->cursize++;
		return true;
	}
	return insertelem(ps, ps->head, val);
}
//8.尾插
bool insertback(linklist* ps, int val) {
	assert(ps != nullptr);
	if (ps->head == nullptr) {
		ps->head = buynode(val);
		ps->cursize++;
		return true;
	}
	return insertelem(ps, ps->head, val);
}

int main() {
	

	return 0;
}
相关推荐
Q741_14714 分钟前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
The_Ticker15 分钟前
印度股票实时行情API(低成本方案)
python·websocket·算法·金融·区块链
夏乌_Wx19 分钟前
剑指offer | 2.4数据结构相关题目
数据结构·c++·算法·剑指offer·c/c++
AI成长日志1 小时前
【笔面试算法学习专栏】哈希表基础:两数之和与字母异位词分组
学习·算法·面试
minji...1 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
abant21 小时前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展
漫霂1 小时前
二叉树的统一迭代遍历
java·算法
炽烈小老头1 小时前
【每天学习一点算法 2026/04/08】阶乘后的零
学习·算法
Mr_Xuhhh2 小时前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
游乐码2 小时前
C#Queue
数据结构·游戏·c#