ToB企服应用市场:ToB评测及商务社交产业平台
标题:
数据布局-2.单向链表的实现
[打印本页]
作者:
小小小幸运
时间:
2024-8-5 14:28
标题:
数据布局-2.单向链表的实现
节点布局体计划
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 指针为 NULL,next 指针也为 NULL。
设置链表长度 m_size 为 0。
插入链表
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++;
}
复制代码
查抄 list 和 data 是否为空,若为空则返回。
如果位置 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,然后移动到下一个节点。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4