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

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

带头循环双链表实现

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);
}
相关推荐
8Qi81 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
秋91 小时前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
十月的皮皮2 小时前
C语言学习笔记20260606- 求月份天数三种写法
c语言·笔记·学习
huangdong_2 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
youngerwang2 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
chase_my_dream2 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
想要成为糕糕手2 小时前
前端必修课:JavaScript 数组与数据结构底层逻辑全解析
javascript·数据结构·面试
KaMeidebaby2 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
caimouse2 小时前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows