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

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

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

带头循环双链表实现

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);
}


http://www.kler.cn/news/357700.html

相关文章:

  • SpringDataRedis快速入门
  • JDK17下,使用SHA1算法报Certificates do not conform to algorithm constraints错误
  • PostgreSQL技术内幕15:物化视图
  • 关于通信设备中的告警相关知识
  • SQL数据库刷题sql_day34(移动平均值、累计求和)
  • 别再犯这些Java并发编程的常见错误!你中了几个?
  • Java-类与对象-下篇
  • mysql学习教程,从入门到精通,sql序列使用(45)
  • 红日安全vulnstack (一)
  • Redis应用高频面试题
  • 【VUE】封装用户树形选择和部门树形选择控件
  • 递归神经网络(RNN)简介
  • Docker无法拉取镜像解决办法
  • TiDB 关联子查询及半连接的优化实践
  • 微信小程序设计尺寸
  • 数据结构2-线性表
  • 富唯智能:重塑CNC格局,柔性制造开启智能制造新时代
  • 练习题 - Scrapy爬虫框架 Items 数据项
  • 【ARM】AMBA概述
  • 跟《经济学人》学英文:2024年10月19日这期 Pity the superstar fashion designer