数据结构学习之双向循环链表操作

本文介绍了一个双向循环链表的数据结构实现,包括创建、插入、删除、查找、修改等核心功能,并通过示例展示了如何使用这些功能进行链表操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表头文件

#ifndef _LIST_H_
#define _LIST_H_

#include<stdio.h>
#include<stdlib.h>

typedef struct _list
{
	int m_data;
	struct _list * next;
	struct _list * prev;
}list,*node;


void listCreate(list * t_list);

void listHeadInsert(list * t_list,int t_data);

void listTailInsert(list * t_list,int t_data);

void listDelete(list * t_list,int t_data);

node listFind(list * t_list,int t_data);

void listModify(list * t_list,int t_old,int t_new);

void listDestroy(list * t_list);

void listDisplayAsc(list * t_list);

void listDisplayDesc(list * t_list);

#endif

函数实现

#include "list.h"


void listCreate(list * t_list)
{	
	//链表内数据初始化
	t_list->m_data = -1;
	//双向循环链表初始化时next,prev均指向自己
	t_list->next = t_list;
	t_list->prev = t_list;
}

void listHeadInsert(list * t_list,int t_data)
{
	//声明一个结点,并申请内存
	node t_node = (node)malloc(sizeof(list));
	//节点内容赋值
	t_node->m_data = t_data;
	
	//接待内prev和next指向赋值
	t_node->prev = t_list;
	t_node->next = t_list->next;

	//链表内链接节点
	t_list->next->prev = t_node;
	t_list->next = t_node;
}

void listTailInsert(list * t_list,int t_data)
{
	//声明一个节点
	node t_node = (node)malloc(sizeof(list));

	//节点内容赋值
	t_node->m_data = t_data;
	
	//节点prev和next指向赋值
	t_node->next = t_list;
	t_node->prev = t_list->prev;

	t_list->prev->next = t_node;
	t_list->prev = t_node;

}


node listFind(list * t_list,int t_data)
{
	node t_node = NULL;
	//遍历链表
	node t_temp;

	for(t_temp = t_list->next;t_temp != t_list;t_temp = t_temp->next)
	{
		//如果节点存在
		if(t_temp->m_data == t_data)
		{
			//记录并退出
			t_node = t_temp;
			break;		
		}
	}
	return t_node;
}

void listModify(list * t_list,int t_old,int t_new)
{
	//查找节点
	node t_node = listFind(t_list,t_old);

	//如果不存在该内容节点
	if(NULL == t_node)
	{
		//直接结束函数
		return;
	}
	//节点内容赋值
	t_node->m_data = t_new;
}

void listDelete(list * t_list,int t_data)
{
	//查找节点
	node t_node = listFind(t_list,t_data);

	//如果不存在该内容节点
	if(NULL == t_node)
	{
		//直接结束该函数
		return;
	}
	//当前节点的前一个节点的next,指向当前节点的下一个
	t_node->prev->next = t_node->next;
	//当前节点的下一节点的prev指向当前节点的上一个
	t_node->next->prev = t_node->prev;
}

void listDestroy(list * t_list)
{
	//声明两个节点
	node t_temp,t_node;
	//获取当前节点的后一节点
	t_temp = t_list->next;

	while(t_temp != t_list)
	{
		t_node = t_temp;

		t_temp = t_temp->next;

		free(t_node);
	}
	t_node = NULL;
}

void listDisplayAsc(list * t_list)
{
	node t_temp;

	for(t_temp = t_list->next;t_temp != t_list;t_temp = t_temp->next)
	{
		printf("%d ",t_temp->m_data);
	}
	printf("\n");
}


void listDisplayDesc(list * t_list)
{
	node t_temp;
    

	for(t_temp = t_list->prev;t_temp != t_list;t_temp = t_temp->prev)
	{
		printf("%d ",t_temp->m_data);
	}
	printf("\n");
}

主函数调用

#include "list.h"


int main(void)
{
	//list t_list;

	list * t_list = (list *)malloc(sizeof(list));

	listCreate(t_list);

	int i = 0;
	for(i = 0;i < 10;i++)
	{
		listHeadInsert(t_list,i);
	}

	node t_node = listFind(t_list,7);

	printf("%d\n",t_node->m_data);

	listModify(t_list,1,99);

	listDelete(t_list,3);

	listDisplayAsc(t_list);

	listDisplayDesc(t_list);

	listDestroy(t_list);

	free(t_list);

	t_list = NULL;

	printf("你好,明天\n");

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值