数据结构-2.单向链表的实现
  P8BjD8Qkknzt 2024年08月07日 49 0

节点结构体设计

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,然后移动到下一个节点。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年08月07日 0

暂无评论

推荐阅读
  C0Tz0A5KKSwy   4小时前   9   0   0 C语言
  gtqiVYjgvftt   13天前   36   0   0 C语言
  FZifmKVgRC4p   2024年08月13日   33   0   0 C语言
  C0Tz0A5KKSwy   3天前   16   0   0 C语言
  IbmESGwVVrv0   2024年08月16日   157   0   0 C语言
  FZifmKVgRC4p   2024年08月16日   90   0   0 C语言