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

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

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

#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的后继节点及要删除节点的下一个节点的前驱实现删除,释放删除节点的空间)的运行结果: 


http://www.kler.cn/a/596527.html

相关文章:

  • 【Golang】go语言操作redis数据库--go-redis
  • pikachu,phpstudy启动遇到的问题,本地安装过mysql
  • 构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据
  • 智慧港口新未来:大数据赋能应急消防,筑牢安全防线
  • 置信度是什么?
  • Collectors.toList / list 转 list
  • 清晰易懂的 Python 彻底卸载与清理教程
  • Java面试高频问题深度解析:JVM、锁机制、SQL优化与并发处理
  • 《鸿蒙原生应用开发:掌控Ability生命周期的艺术》
  • AWS 日本东京 EC2 VPS 性能、线路评测
  • ESPNOW收发测试 基于esp-idf
  • 1、正点原子ZYNQ最小系统--GPIO之MIO控制LED笔记
  • HCIP交换机hybrid接口实验
  • Minine源码设计逻辑解析
  • STM32F103C8T6 -MINI核心板
  • MyBatis参数赋值技巧:#{} 和 ${} 的区别与实践
  • 【算法】 矩阵乘法与矩阵快速幂 python
  • 机器学习——KNN超参数
  • 从PGC到AIGC:海螺AI多模态内容生成系统的技术革命
  • Docker 部署医学影像 DICOM 服务器 Orthanc