首页 > 其他分享 >数据结构-2.单向链表的实现

数据结构-2.单向链表的实现

时间:2024-08-05 15:28:01浏览次数:16  
标签:myList struct 单向 next 链表 pCurrent 数据结构 节点

节点结构体设计

struct LinkNode
{
	// 数据域
	void* data;
	// 指针域
	struct LinkNode * next;
};
  • data:一个 void* 类型的指针,指向节点存储的数据。使用 void* 是为了链表能够存储不同类型的数据。
  • next:一个指向下一个 LinkNode 结构体的指针,形成链表的链接。

链表结构体设计

struct LList
{
	//头节点
	struct LinkNode pHeader;
	//链表长度
	int m_size;
};
  • pHeader:链表的头节点。虽然 pHeader 本身也是 LinkNode 类型,但它可以作为链表的起始节点,其 next 指针指向第一个实际的数据节点。
  • m_size:一个整数,表示链表中节点的数量。

初始化链表

LinkList init_LinkList()
{
	struct LList* myList = malloc(sizeof(struct LList));
	
	if (myList == NULL)
	{
		return NULL;
	}

	myList->pHeader.data = NULL;
	myList->pHeader.next = NULL;
	myList->m_size = 0;

	return myList;
}
  • 使用 malloc 分配 struct LList 的内存。
  • 初始化头节点的 data 指针为 NULLnext 指针也为 NULL
  • 设置链表长度 m_size0

插入链表

void insert_LinkList(LinkList list, int pos, void* data)
{
	if (list == NULL) 
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	// 将list还原成struct LList数据类型
	struct LList * myList = list;

	if (pos <0 || pos > myList->m_size)
	{
		//位置无效 强制尾插
		pos = myList->m_size;
	}
	//找到插入节点的前驱
	struct LinkNode * pCurrent = &myList->pHeader;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	//创建新节点
	struct LinkNode* newNode = malloc(sizeof(struct LinkNode));
	newNode->data = data;
	newNode->next = NULL;

	//建立节点关系

	newNode->next = pCurrent->next;
	pCurrent->next = newNode;

	//更新链表长度
	myList->m_size++;
}
  • 检查 listdata 是否为空,若为空则返回。
  • 如果位置 pos 无效(负数或超出链表当前大小),将位置设置为链表末尾。
  • 通过遍历找到插入位置的前驱节点 pCurrent
  • 创建新节点并插入链表中。
  • 更新链表长度 m_size

遍历链表

void foreach_linkList(LinkList list,void(*myForeach)(void *))
{
	if (list == NULL)
	{
		return;
	}

	struct LList* mylist = list;

	struct LinkNode* pCurrent = mylist->pHeader.next;
	for (int i = 0; i < mylist->m_size; i++)
	{
		myForeach(pCurrent->data);
		pCurrent = pCurrent->next;
	}
}
  • 检查 list 是否为空,若为空则返回。
  • 使用 pCurrent 遍历链表,从头节点的下一个节点开始。
  • 对每个节点的数据调用 myForeach,然后移动到下一个节点。

标签:myList,struct,单向,next,链表,pCurrent,数据结构,节点
From: https://www.cnblogs.com/ffff5/p/18343309

相关文章

  • 数据结构内核链表的代码
    说明内核链表的诞生原因呢,就是为了把数据域和指针域分开来就形成了下面这样的链表structlist{structlist*prev;//存放前缀节点的指针structlist*next;//存放后缀节点的指针};那有的读者会疑问,那数据放哪里?//节点结构体structnode{//以整型数......
  • (链表基础)PTA习题11-8 单链表结点删除
    题目要求:本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:structListNode{intdata;ListNode*next;};函数接口定义:structListNode*readlist();structListNode*deletem(structListNode*L,......
  • c语言数据结构单链表中随机链表的复制
    c语言数据结构单链表中随机链表的复制文章目录c语言数据结构单链表中随机链表的复制1.随机链表的复制问题2.解决思路3.代码的实现1.随机链表的复制问题给你一个长度为nn......
  • 数据结构 - 并查集基础
    ......
  • 链表part02
    今天是8月3日,学习了链表的第二部分。交换链表两个节点,考察对next的操作和tmp的灵活运用。删除链表的倒数第N个节点,双指针减少遍历次数。链表相交,移动链表尾对齐,其实就是动长链表的指针。环形链表,记住方法。4.24交换链表两个节点题目:给你一个链表,两两交换其中相邻的节点,并......
  • 数据结构——数列分块 学习笔记
    数据结构——数列分块学习笔记下面部分代码使用,usingll=longlong;#defineintll基础思想问题引入问题:实现区间加;区间求和。基本结构引用经典东西,我们考虑构造一个结构,形如,那么,结论是,复杂度证明为什么块长一般是\(\sqrtn\)呢?我们假设构造的块长是\(......
  • 数据结构:链表经典算法OJ题
    目录前言一、移除链表元素二、反转链表三、合并两个有序链表四、链表的中间节点五、环形链表的约瑟夫问题前言  在了解了链表的相关知识后,我们还需要一些题目进行练习加深对链表这方面知识的理解,也可以用来检测链表这块学的的怎么样,废话不多说,开始上手。一、移......
  • 算法题之旋转链表
    旋转链表给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]提示:链表中节点的数目在范围 [0,500] 内-100<=Node.val<=1000<=k<=......
  • Java常用类和数据结构与算法
    1.其他常用类1.1.Math类java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值一般为double型。如果需要更加强大的数学运算能力,可以使用apachecommons下面的Math类库publicclassTestMath{publicstaticvoidmain(String[]args){S......
  • 数据结构之特殊矩阵的压缩存储
    1.对称矩阵的压缩存储定义:若n阶矩阵A满足a(ij)=a(ji)(1≤i,j≤n),则称A为n阶对称矩阵。压缩存储方法:由于对称矩阵上三角和下三角的元素相同(主对角线上的元素只存储一次),因此可以只存储上三角(或下三角)的元素和主对角线上的元素。存储方式:通常使用一维数组来存储这些元素。......