鱼C论坛

 找回密码
 立即注册
查看: 1996|回复: 2

链表问题

[复制链接]
发表于 2016-5-5 17:36:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void delnode(PNode *head,int n)
{
        if(NULL==head)
                return;
        PNode temp=NULL;
        int i=0;
       
        if(n==1)//如果要删除的是第一个结点;
        {
                temp=*head;
                *head=(*head)->PNext;
                free(temp);
                return;
        }
       
        for(temp=*head,i=2;temp->PNext!=NULL;temp=temp->PNext,i++)
        {
                if(n==i)
                {
                        PNode t=temp->PNext;
                        temp->PNext=temp->PNext->PNext;
                        free(t);
                        return;
                }
        }
        if(n>i)
                printf("所要删除的结点个数超过链表长度!\n\n");       
}
在这个删除链表结点的函数中,我形参直接用head,结果当需要删除的是第一个结点的时候,程序陷入了死循环,但是删除其他结点就没问题,当我改变形参传递*head就可以了,这是为什么啊?大神求指教~!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-5 21:00:02 | 显示全部楼层
如果形参是head,在调用函数时会自动进行一个复制操作。导致的后果就是,你在函数中的所有操作都与你的实参无关。就算你改的面目全非,在返回主函数时,head还是原来的那个head。
如果形参是*head,那么传递的是head的地址。那么尽管子函数对head的地址进行了复制,但是通过这个地址对head的一系列操作还是将会确实的影响到主函数中的值。
具体请参看c语言教程中的传值和传址的章节。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-6 16:05:54 | 显示全部楼层
*head是一个指针,指向的是一个地址,接受实参传递的时候,就会指向实参的内存空间。head的话是一个变量,等于接受实参的时候等价与变量赋值给变量。如:
int *p = a;
int p = a;这两条的区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 08:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表