linux链表应用2

以下是根据您的要求对示例代码进行优化的结果:

#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 进行匹配,你可以根据实际情况使用其他方式进行匹配。

将链表内容存入指定文件

void saveFolderNamesToFile(const char* filename, PathNode* head) 
{
	// 删除文件
    if (unlink(filename) == 0) {
        printf("文件 %s 删除成功\n", filename);
    } else {
        perror("删除···文件失败");
    }
	
    if (head == NULL) {
        printf("链表为空\n");
        return; // 或执行其他适当的操作
    }
    
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        printf("无法打开文件\n");
        return; // 或执行其他适当的操作
    }
    
    PathNode* temp = head;
    size_t totalCharactersWritten = 0;
    while (temp != NULL) {
        int charactersWritten = fprintf(file, "%s\n", temp->folderName);
        if (charactersWritten < 0) {
            printf("写入文件时发生错误\n");
            fclose(file);
            return; // 或执行其他适当的操作
        }
        totalCharactersWritten += charactersWritten;
        temp = temp->next;
    }
    
    fclose(file);
    printf("节点的 folderName 已保存到文件:%s,共写入 %zu 个字符\n", filename, totalCharactersWritten);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值