代碼如下:
typedef struct Node
{
char *str;
struct Node *next;
} Node;
Node *_getdir(char *path, char **pathCopy)
{
char *token = NULL;
Node *head;
Node *pathNode;
if (path == NULL)
return (NULL);
*pathCopy = strdup(path);
head = NULL;
pathNode = malloc(sizeof(Node));
if (pathNode == NULL)
return (NULL);
token = strtok(*pathCopy, ":");
pathNode->str = token;
pathNode->next = head;
head = pathNode;
while (token != NULL)
{
token = strtok(NULL, ":");
if (token == NULL)
break;
pathNode = malloc(sizeof(Node));
if (pathNode == NULL)
return (NULL);
pathNode->str = token;
pathNode->next = head;
head = pathNode;
}
return (head);
}
path = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin"
char *pathCopy = NULL;
pathDirs = _getdir(path, pathCopy);
我的困惑開始于pathNode = malloc(sizeof(Node))并結束于return (head);
首先,我不明白為什么這個函式會分配一個名為“Node”的型別變數的大小,將該資訊存盤在一個名為 pathNode 的變數中,然后就if statement在 pathNode 是一個 NULL 值的情況下執行一個,我意思是,如果“節點”型別變數是固定的(至少最初是固定的),這怎么可能?
其次,我知道該strtok函式用于通過使用分隔符來分割字串,在這種情況下是:. 我也知道箭頭運算子->用于訪問結構中的元素。
但隨后,代碼的下一行是pathNode->str = token;和pathNode->next = head;它們一樣,某種變數宣告逆轉,使語法看起來只是怪我,和這些變數str并next沒有宣告為指標的情況下,沒有那個必要嗎?
而最后,還有while回圈,我想這是怎么回事,直到找到要執行\0元素在結束pathCopy串。然而,再次使用pathNode = malloc(sizeof(Node));,pathNode->str = token;和pathNode->next = head;,讓我回到以前的困惑......
uj5u.com熱心網友回復:
您的問題似乎與單鏈表有關。該函式將節點插入到單鏈表中。
它分配pathNode,將其分配為head.
strtok將字串分解為標記,第一個標記是 for head。
如果下一個令牌成功,它會分配另一個節點,該節點成為新的head。pathNode->next = head表示下一個元素是頭。然后分配head = pathNode,并繼續回圈。
“pathNode 是一個 NULL 值,我的意思是,如果“節點”型別變數是固定的(至少最初是這樣),這怎么可能”
pathNode可NULL如果沒有足夠的記憶體和malloc失敗。
“然而,又一次使用了 pathNode = malloc(sizeof(Node));”
對于以下節點,回圈malloc的開頭head和malloc內部都有一個。
此外,還有幾個問題。該函式用于pathCopy復制源字串。這是正確的方法,因為strtok會修改其來源。但pathCopy最終應該被釋放。將它回傳給呼叫者沒什么用。
總的來說,這個函式比它需要的更復雜。這是一個更簡單的例子:
Node* create_node(const char* str)
{
Node* node = malloc(sizeof(Node)); if (!node) return NULL;
node->str = strdup(str);
node->next = NULL;
return node;
}
Node* mygetdir(const char* source)
{
if (!source) return NULL;
char *path = strdup(source);
if (!path) return NULL;
Node* head = NULL;
char* token = strtok(path, ":");
while (token)
{
Node* save = head;
head = create_node(token); if (!head) return NULL;
head->next = save;
token = strtok(NULL, ":");
}
free(path);
return head;
}
您可以按如下方式列印。最后你必須釋放鏈表。
int main(void)
{
Node* head = mygetdir("/sbin1:/usr/sbin2:/bin3:/usr/bin4:/usr/local/bin5");
Node* node = head;
while (node)
{
printf("ID = %s\n", node->str);
node = node->next;
}
node = head;
while (node)
{
Node* next = node->next;
// ******* EDIT
// don't call `free(node->str)` if using your own version
// because in your own version node->str is just a pointer to `pathCopy`
free(node->str);
free(node);
node = next;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368929.html
下一篇:BST中的后序
