实现链表 C
Implementing a Linked List C
我正在做作业,我想我应该使用链表来存储一些数据。问题是列表没有保留所有节点。
添加完成后,我尝试查看节点,它只显示添加到列表中的最后一个节点。
我会把相关的部分写在下面,希望有人能指出问题所在。(我怀疑它一定是与malloc有关。函数完成后地址被销毁,但我没有当然。
另外我应该指出,我测试过,在添加数据时打印数据,它确实表明它们被正确添加到列表中)。
/**
* Adds command name and it's hash onto the linked list
* returns 1, if successful
* returns 0, if failed
*/
int addToList(struct CMDList *head, char *pathCommand[], char *hash){
int result = 0;
/** If head was pointing to NULL, list empty, add at the beginning */
if(head->path == NULL){
head->path = pathCommand[0];
head->command = pathCommand[1];
head->hash = hash;
head->next = NULL;
result = 1;
}else{
struct CMDList *current = head;
/** Find tail of the list */
while(current->next != NULL){
current = current->next;
}
current->next = (struct CMDList *)malloc(sizeof(struct CMDList));
if(current->next != NULL){
current->path = pathCommand[0];
current->command = pathCommand[1];
current->hash = hash;
current->next = NULL;
result = 1;
}
}
return result;
}
主程序:
int main(int argc, char *argv[]){
/** CODE DELETED */
/** initialize list for storing cmds from config file */
/** cmdList is the head node that i use to traverse the list */
cmdList = (struct CMDList *)malloc(sizeof(struct CMDList));
if(cmdList != NULL){
cmdList->path = NULL;
cmdList->command = NULL;
cmdList->hash = NULL;
cmdList->next = NULL;
}else{
printError("Silent Exit: couldn't initialize list to store commands of config file");
exit(1);
}
/** CODE DELETED **/
/** add new data to the list */
if(!addToList(cmdList,arrayCommand,sha)){
printError("Silent Exit: couldn't add to list");
exit(1);
}
}
在这部分代码中:
if(current->next != NULL){
current->path = pathCommand[0];
current->command = pathCommand[1];
current->hash = hash;
current->next = NULL;
result = 1;
}
你必须使用 current->next->...
而不是 current->...
,因为你的新元素在 current->next
中,而不是在 current
中(事实上,你检查了 current->next != NULL
).
由于这个错误,添加的第一个元素没问题,但是当您尝试添加第二个元素时,您只是分配了它的 space 但随后覆盖了第一个元素。
在这部分代码中你要设置变量
对于当前->下一个
if(current->next != NULL){
current->path = pathCommand[0];
current->command = pathCommand[1];
current->hash = hash;
current->next = NULL;
result = 1;
}
另一种选择是,在执行 malloc 时,您设置一个指向新结构的临时指针,
给出你需要的值然后设置 current->next = temp;
您也可以跳过 while 步骤。你可以有一个名为 tail 的指针
指向列表的末尾。
然后做一些类似的事情
temp=malloc(...)
temp->path = ...
...
tail->next = temp;
tail = temp;
我正在做作业,我想我应该使用链表来存储一些数据。问题是列表没有保留所有节点。
添加完成后,我尝试查看节点,它只显示添加到列表中的最后一个节点。
我会把相关的部分写在下面,希望有人能指出问题所在。(我怀疑它一定是与malloc有关。函数完成后地址被销毁,但我没有当然。
另外我应该指出,我测试过,在添加数据时打印数据,它确实表明它们被正确添加到列表中)。
/**
* Adds command name and it's hash onto the linked list
* returns 1, if successful
* returns 0, if failed
*/
int addToList(struct CMDList *head, char *pathCommand[], char *hash){
int result = 0;
/** If head was pointing to NULL, list empty, add at the beginning */
if(head->path == NULL){
head->path = pathCommand[0];
head->command = pathCommand[1];
head->hash = hash;
head->next = NULL;
result = 1;
}else{
struct CMDList *current = head;
/** Find tail of the list */
while(current->next != NULL){
current = current->next;
}
current->next = (struct CMDList *)malloc(sizeof(struct CMDList));
if(current->next != NULL){
current->path = pathCommand[0];
current->command = pathCommand[1];
current->hash = hash;
current->next = NULL;
result = 1;
}
}
return result;
}
主程序:
int main(int argc, char *argv[]){
/** CODE DELETED */
/** initialize list for storing cmds from config file */
/** cmdList is the head node that i use to traverse the list */
cmdList = (struct CMDList *)malloc(sizeof(struct CMDList));
if(cmdList != NULL){
cmdList->path = NULL;
cmdList->command = NULL;
cmdList->hash = NULL;
cmdList->next = NULL;
}else{
printError("Silent Exit: couldn't initialize list to store commands of config file");
exit(1);
}
/** CODE DELETED **/
/** add new data to the list */
if(!addToList(cmdList,arrayCommand,sha)){
printError("Silent Exit: couldn't add to list");
exit(1);
}
}
在这部分代码中:
if(current->next != NULL){
current->path = pathCommand[0];
current->command = pathCommand[1];
current->hash = hash;
current->next = NULL;
result = 1;
}
你必须使用 current->next->...
而不是 current->...
,因为你的新元素在 current->next
中,而不是在 current
中(事实上,你检查了 current->next != NULL
).
由于这个错误,添加的第一个元素没问题,但是当您尝试添加第二个元素时,您只是分配了它的 space 但随后覆盖了第一个元素。
在这部分代码中你要设置变量 对于当前->下一个
if(current->next != NULL){
current->path = pathCommand[0];
current->command = pathCommand[1];
current->hash = hash;
current->next = NULL;
result = 1;
}
另一种选择是,在执行 malloc 时,您设置一个指向新结构的临时指针,
给出你需要的值然后设置 current->next = temp;
您也可以跳过 while 步骤。你可以有一个名为 tail 的指针 指向列表的末尾。
然后做一些类似的事情
temp=malloc(...)
temp->path = ...
...
tail->next = temp;
tail = temp;