c语言链表结构体问题

***定义结构体

typedef struct list LIST;
struct list
{
char listname[10];///文件名
int type;
int length;/////文件长度
int protect;/////保护模式,0为只读1为可读写
int flag;//////标志,为0时创建文件夹,为1时创建文件
char *content;
struct list *parent;
struct list *child; //指向下一文件夹
struct list *next;
};

**删除文件函数中
void deletefile(LIST *qq,int flag) //删除文件(夹)
{
char n[10];
LIST *p=qq->child;
LIST *pre=NULL; 这里
if(flag==0)
{
printf("\n请输入要删除的文件名: ");
}
else
{
printf("\n请输入要删除的文件夹名: ");
}
scanf("%s",n);
while(p!=NULL)
{
if((strcmp(p->listname,n)==0)&&(p->type==0)) //type==0,对文件操作
{
if(pre==NULL) //第一个节点
{
qq->child=p->next;free(p);
printf("\n\n文件%s已删除成功!!!\n",n);
}
else
{
pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件 还有这里
printf("\n\n文件%s已删除成功!!!\n",n);
free(p);
}
break;
}
else if((strcmp(p->listname,n)==0)&&(p->type==1)) //type==1,文件夹操作
{
if(pre==NULL) //第一个节点
{
qq->child=p->next;free(p);
printf("\n\n文件夹%s已经成功删除!!!\n",n);
}
else
{
pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件
printf("\n\n文件夹%s已经成功删除!!!\n",n);
free(p);
}
break;
}
else
{
pre=p;
p=p->next;
}
}
if(p==NULL&&flag==0) //该文件不存在
printf("\n\n找不到该文件!");
else if(p==NULL&&flag==1)
printf("\n\n找不到该文件夹!\n");
getchar();
getchar();
displayfilemenu();
}

问:函数中LIST *pre=NULL; 然后pre->next=p->next;就能删除节点,但是,pre指针不是空的么?他是怎么用pre删除的呢,求解惑!

简化一下代码就看得清楚了.

if(pre==NULL) //第一个节点
{
......
}
else
{
pre->next=p->next;
printf("\n\n文件%s已删除成功!!!\n",n);
free(p);
}

注意这里 它是在确定pre不为NULL的情况下使用的.
if(pre==NULL)
为空就XXXX
else
不为空就删除节点.

要问pre的初始化,就要看到这里:
if((strcmp(p->listname,n)==0)&&(p->type==0))

{
....
}
else if((strcmp(p->listname,n)==0)&&(p->type==1))

{

...
}
else
{
pre=p;
p=p->next;
}
这是排除掉一些情况之后才对pre赋值的,这种后置赋值的写法不符合人的阅读习惯.追问

恩,对。可是顺序执行的话。pre一开始是NULL,第一次while的时候都按着if(pre==NULL)来运行吗?好像这段代码不科学啊。但是我实际运行的时候试了几种情况都没问题呢

追答

第一次while的时候也未必是根据pre为NULL的情况来运行

关键是遇到的情况是否没经过两道判断
if((strcmp(p->listname,n)==0)&&(p->type==0))
else if((strcmp(p->listname,n)==0)&&(p->type==1))
两个if都是解决p->listname就是n
排除掉这个情况 就给pre赋值,也就是说,只要文件名不同,就给pre赋值.大多数情况当然是给pre赋值了.
其他的细节你慢慢品味.

追问

文件名输入的当然一样才能删哦,type只是判断是文件还是文件夹呢。
好,谢谢,我慢慢看

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-15
先从head开始逐项打印整个链表的info

然后从head的下一项开始隔项打印整个链表的info
话说那个p2是干嘛的,没用到。
希望对你能有所帮助。
相似回答