节点布局体计划
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |