linux链表应用2
2023-12-13 04:00:44
以下是根据您的要求对示例代码进行优化的结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义路径节点结构体
typedef struct PathNode {
unsigned int fildid;
char folderName[100]; // 文件夹名字
struct PathNode* next; // 指向下一个节点的指针
} PathNode;
// 添加路径节点函数
PathNode* addPathNode(PathNode* head, unsigned int fildid, const char* folderName) {
PathNode* newNode = (PathNode*)malloc(sizeof(PathNode));
newNode->fildid = fildid;
strcpy(newNode->folderName, folderName);
newNode->next = NULL;
if (head == NULL) {
return newNode; // 如果链表为空,新节点为头节点
} else {
PathNode* currentNode = head;
while (currentNode->next != NULL) {
currentNode = currentNode->next; // 找到链表末尾的节点
}
currentNode->next = newNode; // 将新节点添加到链表末尾
return head;
}
}
// 打印路径函数
void printPath(PathNode* head) {
printf("Path: ");
while (head != NULL) {
printf("%s/", head->folderName);
head = head->next;
}
printf("\n");
}
// 释放路径节点内存函数
void freePath(PathNode* head) {
PathNode* currentNode = head;
while (currentNode != NULL) {
PathNode* temp = currentNode;
currentNode = currentNode->next;
free(temp);
}
}
int main() {
PathNode* head = NULL; // 定义路径链表的头节点
// 示例添加路径节点
head = addPathNode(head, 1, "first_folder");
head = addPathNode(head, 2, "second_folder");
head = addPathNode(head, 3, "third_folder");
// 示例打印路径
printPath(head);
// 示例释放路径节点内存
freePath(head);
return 0;
}
在优化之后的代码中,将 addPathNode
函数返回了头节点,而不是通过指针传递的方式进行修改。这样可以提高代码的可读性和易用性。同时,还增加了 fildid
字段,用于存储文件夹的标识符。其他部分的代码保持不变。
请注意,在优化代码时,我将 PathNode
结构体中字段的顺序进行了调整,以遵循良好的内存对齐原则,提高内存使用效率。
要删除路径节点,你需要进行以下步骤:
-
找到要删除的节点。遍历链表,找到需要删除的节点。如果链表为空或者要删除的节点是头节点,需要单独处理。
-
修改链表指针。将要删除的节点从链表中移除,需要修改前一个节点的
next
指针,将其指向要删除节点的下一个节点。 -
释放节点内存。删除节点后,记得释放该节点的内存,防止内存泄漏。
以下是一个示例函数来删除路径节点:
void deletePathNode(PathNode** head, unsigned int fildid) {
if (*head == NULL) {
printf("空链表\n");
return;
}
PathNode* currentNode = *head;
PathNode* previousNode = NULL;
// 查找要删除的节点
while (currentNode != NULL && currentNode->fildid != fildid) {
previousNode = currentNode;
currentNode = currentNode->next;
}
// 处理节点不存在情况
if (currentNode == NULL) {
printf("节点 %d 不存在\n", fildid);
return;
}
// 处理要删除的节点是头节点的情况
if (previousNode == NULL) {
*head = currentNode->next;
} else {
// 修改前一个节点的指针
previousNode->next = currentNode->next;
}
// 释放节点内存
free(currentNode);
}
使用示例:
// 示例删除节点
deletePathNode(&head, 2);
// 示例打印路径
printPath(head);
// 示例释放路径节点内存
freePath(head);
在示例代码中,注意 deletePathNode
函数使用了 PathNode**
类型的参数,这样可以直接修改参数传入的指针的指向,以修改链表的头指针。另外,要删除的节点通过 fildid
进行匹配,你可以根据实际情况使用其他方式进行匹配。
文章来源:https://blog.csdn.net/weixin_38849487/article/details/134883944
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!