以下是根據您的要求對示例代碼進行優化的結果:
#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
進行匹配,你可以根據實際情況使用其他方式進行匹配。