数据结构——单向带头循环链表的C语言代码实现

系列文章目录

数据结构——顺序表的C语言代码实现


前言

该篇文章是剩余六个链表之一的c语言代码实现,基于对常见的两个链表的学习(单向不带头非循环和双向带头循环),我们已基本掌握链表C语言实现的技能,故该篇只放代码


一、List.h

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct ListNode
{
	DataType data;
	struct ListNode* next;
	struct ListNode* prev;
}LN;
//初始头结点
void ListInit(LN** phead);
//创建节点
LN* ListCreateNode(DataType x);
//尾插法
void ListPushBack(LN* phead, DataType x);
//尾删法
void ListPopBack(LN* phead);
//头插法
void ListPushFront(LN* phead, DataType x);
//头删法
void ListPopFront(LN* phead);
//查找节点
LN* ListFindNode(LN* phead, DataType x);
//在指定节点前插入
void ListInsertFront(LN* phead,DataType x, DataType insert);
//在指定节点后插入
void ListInsertBack(LN* phead, DataType x, DataType insert);
//更改指定节点
void ListNodeChange(LN* phead, DataType x, DataType change);
//删除指定节点
void ListDeleteNode(LN* phead, DataType x);
//删除链表
void ListFree(LN* phead);
//打印链表
void ListPrint(LN* phead);

二、List.c

代码如下:

#include"List.h"
LN* tail = NULL ;
LN* ListCreateNode(DataType x)
{
	LN* tem = (LN*)malloc(sizeof(LN));
	tem->data = x;
	tem->next = NULL;
	return tem;
}
//初始化头结点
void ListInit(LN** phead)
{
	*phead = (LN*)malloc(sizeof(LN));
	(*phead)->next = *phead;
	tail = *phead;
}
//尾插法
void ListPushBack(LN* phead, DataType x)
{
	LN* tem = ListCreateNode(x);
	tail->next = tem;
	tem->next = phead;
	tail = tem;
}
//尾删法
void ListPopBack(LN* phead)
{
	if (phead == phead->next)
	{
		printf("链表为空\n");
		return;
	}
	LN* tem = phead->next;
	while (tem->next != tail)
	{
		tem = tem->next;
	}
	tem->next = phead;
	free(tail);
	tail = tem;
}
//头插法
void ListPushFront(LN* phead, DataType x)
{
	LN* tem = ListCreateNode(x);
	tem->next = phead->next;
	phead->next = tem;
}
//头删法
void ListPopFront(LN* phead)
{
	if (phead == phead->next)
	{
		printf("链表为空\n");
		return;
	}
	LN* tem = phead->next;
	phead->next = tem->next;
	free(tem);
}
//查找节点
LN* ListFindNode(LN* phead, DataType x)
{
	if (phead == phead->next)
	{
		printf("链表为空\n");
		exit(-1);
	}
	LN* tem = phead->next;
	while (tem != phead)
	{
		if (tem->data == x)
		{
			return tem;
		}
		tem = tem->next;
	}
	return NULL;
}
//在指定节点前插入
void ListInsertFront(LN* phead, DataType x, DataType num)
{
	LN* tem = ListFindNode(phead, x);
	if (tem == NULL)
	{
		printf("链表中没有%d\n", x);
		return;
	}
	LN* insert = ListCreateNode(num);
	LN* tempre = phead->next;
	while (tempre != tem)
	{
		tempre = tempre->next;
	}
	tempre->next = insert;
	insert->next = tem;
}
//在指定节点后插入
void ListInsertBack(LN* phead, DataType x, DataType num)
{
	LN* tem = ListFindNode(phead, x);
	if (tem == NULL)
	{
		printf("链表中没有%d\n", x);
		return;
	}
	LN* insert = ListCreateNode(num);
	if (tem == tail)
	{
		tem->next = insert;
		insert->next = phead;
		tail = insert;
	}
	else
	{
		insert->next = tem->next;
		tem->next = insert;
	}
}
//更改指定节点
void ListNodeChange(LN* phead, DataType x, DataType num)
{
	LN* tem = ListFindNode(phead, x);
	if (tem == NULL)
	{
		printf("链表中没有%d\n", x);
		return;
	}
	tem->data = num;
}
//删除节点
void ListDeleteNode(LN* phead, DataType x)
{
	LN* tem = ListFindNode(phead, x);
	if (tem == NULL)
	{
		printf("链表中没有%d\n", x);
		return;
	}
	if (tem == tail)
	{
		LN* tailpre = phead->next;
		while (tailpre->next != tail)
		{
			tailpre = tailpre->next;
		}
		free(tail);
		tail = tailpre;
	}
	else
	{
		LN* tempre = phead->next;
		while (tempre->next != tem)
		{
			tempre = tempre->next;
		}
		tempre->next = tem->next;
		free(tem);
	}
}
//删除链表
void ListFree(LN* phead)
{
	LN* tem = phead->next;
	while (tem!=phead)
	{
		LN* next = tem->next;
		free(tem);
		tem = next;
	}
	free(phead);
}
//打印链表
void ListPrint(LN* phead)
{
	LN* tem = phead->next;
	if (tem == phead)
	{
		printf("链表为空\n");
		return;
	}
	while (tem != phead)
	{
		printf("%d ", tem->data);
		tem = tem->next;
	}
	printf("\n");
}

三、test.c

代码如下:

#include"List.h"
int main()
{
	LN* plist = NULL;
	ListInit(&plist);
	ListPushBack(plist, 1);
	ListPushBack(plist, 2);
	ListPushBack(plist, 3);
	ListPushBack(plist, 4);
	ListPrint(plist);
	ListPopBack(plist);
	ListPrint(plist);
	ListPushFront(plist, 5);
	ListPrint(plist);
	/*ListPopFront(plist);
	ListPopFront(plist);
	ListPopFront(plist);
	ListPopFront(plist);*/
	ListInsertFront(plist, 50, 6);
	ListPrint(plist);
	ListInsertBack(plist, 5, 7);
	ListPrint(plist);
	ListNodeChange(plist, 5, 7);
	ListPrint(plist);
	ListDeleteNode(plist, 7);
	ListPrint(plist);
	ListDeleteNode(plist, 9);
	ListFree(plist);
	return 0;
}

总结

weixin151云匹面粉直供微信小程序+springboot后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值