当前位置: 首页 > news >正文

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码

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

typedef int ElemType;

typedef struct node{
	ElemType data;
	struct node *next, *prev;
}Node;

//初化链表
Node* initList()
{
	Node *head = (Node*)malloc(sizeof(Node));
	head->data = 0;
	head->next = NULL;
	head->prev = NULL;
	return head;
}


//头插法
int insertHead(Node* L, ElemType e)
{
	Node *p = (Node*)malloc(sizeof(Node));
	p->data = e;
	p->prev = L;
	p->next = L->next;
	if (L->next != NULL)
	{
		L->next->prev = p;
	}
	L->next = p;
	return 1;
}

//遍历
void listNode(Node* L)
{
	Node *p = L->next;
	while(p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

//获取尾部结点
Node*  get_tail(Node  *L)
{
	Node *p = L;
	while(p->next != NULL)
	{
		p = p->next;
	}
	return p;
}

//尾插法
Node* insertTail(Node *tail, ElemType e)
{
	Node *p = (Node*)malloc(sizeof(Node));
	p->data = e;
	p->prev = tail;
	tail->next = p;
	p->next = NULL;
	return p;
}

//指定位置插入
int insertNode(Node *L, int pos, ElemType e)
{
	Node *p = L;
	int i = 0;
	while(i < pos-1)
	{
		p = p->next;
		i++;
		if (p == NULL)
		{
			return 0;
		}
	}
	

	Node *q = (Node*)malloc(sizeof(Node));
	q->data = e;
	q->prev = p;
	q->next = p->next;
	p->next->prev = q;
	p->next = q;
	return 1;
}

//删除节点
int deleteNode(Node *L, int pos)
{
	Node *p = L;
	int i = 0;
	while(i < pos-1)
	{
		p = p->next;
		i++;
		if (p == NULL)
		{
			return 0;
		}
	}

	if(p->next == NULL)
	{
		printf("要删除的位置错误\n");
		return 0;
	}

	Node *q = p->next;
	p->next = q->next;
	q->next->prev = p;
	free(q);
	return 1;
}


//释放链表
void freeList(Node *L)
{
	Node *p = L->next;
	Node *q;

	while(p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
}




int main()
{
	Node *list = initList();
	
	/*
	insertHead(list,10);
	insertHead(list,20);
	insertHead(list,30);
	listNode(list);
	*/
	
	Node *tail = get_tail(list);
	tail = insertTail(tail, 10);
	tail = insertTail(tail, 20);
	tail = insertTail(tail, 30);
	listNode(list);
	
	insertNode(list, 2, 15);
	listNode(list);

	
	deleteNode(list, 2);
	listNode(list);
	

	return 0;
}

使用头插法运行结果: 

 尾插法运行结果:

在指定位置插入数据运行结果:

删除节点(找到要删除节点的前置节点p,用指针q记录要删除的节点,通过改变p的后继节点及要删除节点的下一个节点的前驱实现删除,释放删除节点的空间)的运行结果: 

相关文章:

  • MTKAndroid12 解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题
  • 深入了解Spring事务及其使用场景
  • go:前后端分离
  • (UI自动化测试)第二篇:元素定位的方法_name定位
  • 【学习】CMMM/DCMM等智能制造产业常见资质学习
  • hive:处理JSON格式(get_json_object()函数),连续登录题型,快速生成表(explode,stack),迭代计算
  • 使用flask_restful快速构建接口
  • AI生成移动端贪吃蛇游戏页面,手机浏览器打开即可玩
  • .net core集成MQTT服务端
  • Pytorch中的torch.utils.data.Dataset 类
  • Next-Auth 认证系统:用户与管理员双角色登录配置
  • 【深度技术揭秘】 Android SystemUI锁屏界面动态布局重构:横竖屏智能适配指南
  • 【最后203篇系列】022 用Deepseek14b提取新闻事件
  • 官方通知 | 2025年CAIP人工智能职场应用师(AI职场应用师)职业能力认证正式发布
  • 【机器学习】机器学习四大分类
  • Camera2 与 CameraX 闲谈
  • 【惯性系与固连系速度位置加速度转换关系】
  • Redis 内存淘汰策略
  • Compose 原理解析
  • 【信息系统项目管理师】【高分范文】【历年真题】​论信息系统项目的风险管理
  • 李家超称香港将部署为内地企业提供供应链服务,突破美国封锁
  • 新华视点丨广西抗旱一线调查
  • 中国铝业首季“开门红”:净利润超35亿元,同比增加近六成
  • 印度加大应对力度,吊销所有巴基斯坦公民签证
  • 毕节两兄弟摘马蜂窝致路人被蜇去世,涉嫌过失致人死亡罪被公诉
  • 国防部就美军“压力测试”大演习答澎湃:中国从来不信邪,不怕打,不怕压