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 结构体中字段的顺序进行了调整,以遵循良好的内存对齐原则,提高内存使用效率。

要删除路径节点,你需要进行以下步骤:

  1. 找到要删除的节点。遍历链表,找到需要删除的节点。如果链表为空或者要删除的节点是头节点,需要单独处理。

  2. 修改链表指针。将要删除的节点从链表中移除,需要修改前一个节点的 next 指针,将其指向要删除节点的下一个节点。

  3. 释放节点内存。删除节点后,记得释放该节点的内存,防止内存泄漏。

以下是一个示例函数来删除路径节点:

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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。