【数据结构与算法】链表(下)

记录自己所学,无详细讲解

带头循环双链表实现

1.项目目录文件

2.头文件 List.h

复制代码
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
typedef struct List
{
	int data;
	struct List* prev;
	struct List* next;
}List;
void ListInit(List** phead);//初始化
List* Buynewnode(List* phead,int n);//创建新节点
void ListPushfront(List* phead, int n);//头插
void ListPushback(List* phead, int n);//尾插
void ListPopfront(List* phead);//头删
void ListPopback(List* phead);//尾删
List* ListIsFind(List* phead, int n);//查找节点并返回地址
void ListInsertfront(List* phead, List* pos, int n);//节点前插入
void ListInsertback(List* phead, List* pos, int n);//节点后插入
void ListDel(List* phead, List* pos);//删除节点
void ListModify(List* pos, int n);//修改节点
void ListDestory(List* phead);//销毁节点
void ListPrint(List* phead);//打印输出

3.函数定义源文件 list.c

复制代码
#include "list.h"
void ListInit(List** phead)
{
	*phead = (List*)malloc(sizeof(List));
	(*phead)->next = *phead;
	(*phead)->prev = *phead;
	(*phead)->data = 0;
}
List* Buynewnode(int n)
{
	List* newnode = (List*)malloc(sizeof(List));
	assert(newnode);
	newnode->next = NULL;
	newnode->prev = NULL;
	newnode->data = n;
		return newnode;
	
}
void ListPushfront(List* phead, int n)
{
	List* newnode = Buynewnode(n);
	(phead->next)->prev = newnode;
	newnode->next = phead->next;
	newnode->prev = phead;
	phead->next = newnode;
}
void ListPushback(List* phead, int n)
{
	List* newnode = Buynewnode(n);
	List* cur = phead;
	while (cur->next != phead)
	{
		cur = cur->next;
	}
	cur->next = newnode;
	newnode->prev = cur;
	newnode->next = phead;
	phead->prev = newnode;
}
void ListPopfront(List* phead)
{
	if (phead->next == phead)
	{
		printf("没东西无需删除\n");
	}
	else
	{
		List* node = phead->next;
		(node->next)->prev = phead;
		phead->next = node->next;
		free(node);
		node = NULL;
	}
}
void ListPopback(List* phead)
{
	if (phead->next == phead)
	{
		printf("无需删除\n");
	}
	else
	{
		List* node = phead->prev;
		(node->prev)->next = phead;
		phead->prev = node->prev;
		free(node);
		node = NULL;
	}
}
List* ListIsFind(List* phead, int n)
{
	List* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == n)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
void ListInsertfront(List* phead, List* pos, int n)
{
	assert(pos);
	List* newnode = Buynewnode(n);
	newnode->next = pos;
   (pos->prev)->next = newnode;
	newnode->prev = pos->prev;
	pos->prev = newnode;
}
void ListInsertback(List* phead, List* pos, int n)
{
	assert(pos);
	List* newnode = Buynewnode(n);
	newnode->next = (pos->next);
	(pos->next)->prev = newnode;
	pos->next = newnode;
	newnode->prev = pos;
}
void ListDel(List* phead,List* pos)
{
	assert(pos);
	List* node = pos;
	(node->prev)->next = node->next;
	(node->next)->prev = (node->prev)->next;

}
void ListModify(List* pos, int n)
{
	assert(pos);
	pos->data = n;
}
void ListDestory(List* phead)
{
	List* cur = phead->next;
	List* cur1 = cur;
	while (cur != phead)
	{
		cur1 = cur;
		cur = cur->next;
		free(cur1);
		cur1 = NULL;
	}
	phead->next = phead;
	phead->prev = phead;
}
void ListPrint(List* phead)
{
	List* cur = phead->next;
	printf("NULL->");
	while (cur != phead)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
}

4.函数调用测试源文件test.c

复制代码
#include "list.h"
int main()
{
	List * phead = NULL;
	ListInit(&phead);
	ListPushback(phead, 5);
	ListPushback(phead, 4);
	ListPushback(phead, 3);
	ListPushback(phead, 2);
	ListPushback(phead, 1);
	ListPushfront(phead, 6);
	//ListPopfront(phead);
	//ListPopfront(phead);
	//ListPopfront(phead);
	//ListPopfront(phead);
	//ListPopback(phead);
	//ListDestory(phead);
	//ListInsertback(phead, ListIsFind(phead, 5), 9);
	//ListModify(ListIsFind(phead, 9),10);
	//ListDel(phead,ListIsFind(phead, 10));
	ListPrint(phead);
}
相关推荐
NAGNIP4 分钟前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo10 分钟前
半开区间和开区间的两个二分模版
算法
moonlifesudo13 分钟前
300:最长递增子序列
算法
CoovallyAIHub5 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub6 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农1 天前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了1 天前
AcWing学习——双指针算法
c++·算法