我需要一些关于这个链表练习的帮助。函数listTasks()
应该显示struct task
的所有实例。当我第一次执行函数时,它按预期工作,但当我再次执行它时,它不会显示struct action
中的内容,即使我一个接一个地执行它们。
typedef struct action
{
char parametre[100];
char command[100];
struct action* next;
struct action* previous;
}* Action;
typedef struct task
{
char name[100];
struct task* next;
struct task* previous;
Action action;
}* Task;
void listTasks(Task tar, char* name)
{
if(tar==NULL) printf("There is no task with the name: %sn",name);
else
{
while(tar!=NULL&&strcmp(tar->name,name)!=0)
{
tar = tar->next;
}
if(tar!=NULL && strcmp(tar->name,name)==0)
{
printf("Task: %sn",tar->name);
if(tar->action==NULL) printf("->It doesnt have any action.n");
else if(tar->action!=NULL)
{
while(tar->action!=NULL)
{
printf("->Command: %sn->->Parametre: %sn",tar->action->command,tar->action->parametre);
tar->action = tar->action->next;
}
}
}
else printf("There is no task with the name: %sn",name);
}
}
void main()
{
task a = NULL;
listTasks(a,"random name");
}
您的问题在这里:
while(tar->action!=NULL)
{
printf("->Command: %sn->->Parametre: %sn",tar->action->command,tar->action->parametre);
tar->action = tar->action->next;
}
您正在破坏性地更改tar->action
。是的,这是第一次,但在那之后,tar->action
将是NULL
,这就是数据"消失"的原因。
如果你不想破坏动作列表,你必须使用一个临时变量遍历它。大致如下:
struct action *action = tar->action;
while(action!=NULL)
{
printf("->Command: %sn->->Parametre: %sn",action->command,action->parametre);
action = action->next;
}