链表的头指针在函数里修改怎么没有用?
来源:互联网 发布:中兴笔试编程题 编辑:程序博客网 时间:2024/06/10 20:09
void del(head,num)
struct student *head;
long num;
{
struct student *p1,*p2;
//表空
if(head==NULL){
printf("\nlist null!\n");
return ;
}
p1=head;
//寻找要删除的节点
while(p1->num!=num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
//找到了要删除的节点
if(num==p1->num)
{
if(p1==head)//要删除的节点是头节点
head=p1->next;
else p2->next=p1->next;
printf("delete:%ld\n",num);
}else//没有找到删除的节点
printf("%ld not been found!\n",num);
return ;
}
这是个单向链表的删除节点函数
删除头节点居然不起作用,但可以删除其它节点
我知道通过return head可以改正这个错误,但上面的方法为什么不行呢?
我的看法:
当你创建这样一个函数
void del(struct student* head,long num);
然后去调用他,例:
del(h,3); //h为struct student*类型
假设:&h为 0010; //为h开辟的地址;
h为 1000; //0010 里存放的内容,是一个地址
*h为 8; //1000 里存放的内容,实际上在你的程序里这里存放的是一个结构型变量。
del(h,3); 当调用了这一句时,实际上是把1000传给了head;
这时:
&head一定不是 0010;
//系统会给head新开辟一个内存,这里假设为 0020
head为 1000;
*h为 8;
head=p1->next;
//当执行这句时实际上是把head给改了,就是说0020里的内容给改了。假设改为了2000;
这时:
&h还是等于 0010; 0010里的还是1000
&head还是等于 0020; 0020里的已经改成了2000
所以h没有变。也就是你说的删除头节点不起作用。
要是用return head的话,就是把0010里的内容给改成2000了,当然就起作用啦。
- 链表的头指针在函数里修改怎么没有用?
- 单向链表指针头结点的修改
- 链表的 头指针 头结点
- 在linux里怎么设置修改环境变量
- 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
- 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点
- 13\给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点,
- 在rust里使用c样式的函数指针
- 在没有用UISearchDisplayController的时候
- 头文件里的函数,只是声明
- algorithm头文件里的函数
- algorithm头文件里的函数
- algorithm头文件里的函数
- algorithm头文件里的使用函数
- eclipse中文乱码修改新方法,在修改了所有的utf-8都没有用就这样修改
- 头指针链表
- 头指针链表
- c++模板类/模板函数的声明与定义应该放在头文件里
- 异步编程设计模式
- dp+计数 poj-1037-A decorative fence
- 求质量分布均匀的n边形的重心
- 让AngelScript运行起来
- 2013 杭州赛区邀请赛
- 链表的头指针在函数里修改怎么没有用?
- processmaker如何将Process无须登录的Web Entry改为必须登录并与CAS集成做单点的Web App
- CSS实例(八):不用图片实现宽度、高度自定的圆角矩形
- APP STORE 付费验证(IAP)服务端验证全过程
- HDU1978How Many Ways 记忆化dfs+dp
- [企业开源系列]后起之秀Facebook凭什么挑战互联网霸主Google?
- [C语言]菜鸟一些理解—变量常量
- 3.5 字符串操作
- cocos2d-x for android:CCSprite 精灵动画