| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 683 人关注过本帖
标题:关于单链表添加一个节点函数的疑惑
只看楼主 加入收藏
Mark27525751
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-7-12
收藏
 问题点数:0 回复次数:4 
关于单链表添加一个节点函数的疑惑
本人刚开始学数据结构,看的是程杰老师的《大话数据结构》,下面的例子整理,百度过后,还是有疑惑。

    如果函数的参数是一个指针,不要指望用这个指针去分配内存
【错误例子:
            void GetMemory(char *p, int num)
            {
                p = (char *)malloc(sizeof(char) * num);
            }    //编译器会报错

    编译器总是要为函数的每个参数制作临时副本,指针参数p 的副本是 _p,编译器使 _p = p 。如果函数体内的程序修改了_p 的内容,就导致参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变。所以无法返回新分配内存的首地址,解决办法之一是:用指向指针的指针,另一方法是:用函数返回值传递动态内存

Status ListInsert(LinkList *L,int i,ElemType e)
{
    int j;
    LinkList p, s;    //指针变量,一个用来查找匹配,另一个用来作为新结点
    p = *L;    //把头结点的地址赋给p
    j=1;
    while(p && j<i)    //寻找第i个结点, p=0说明说明?
    {
        p = p->next;
        ++j;
    }
    if(!p || j>i)
        return ERROR;    //第i个元素不存在
    s = (LinkList)malloc(sizeof(Node));    //生成新结点(C标准函数)
    s->data = e;
    s->next = p->next;    //将p的后继结点赋值给s的后继
    p->next = s;    //将s赋值给p的后继
    return OK;
}


我的问题:按照我找到解答的内容,这里Status ListInsert(LinkList *L,int i,ElemType e),也不用用一个二级指针啊,s = (LinkList)malloc(sizeof(Node)); 这句和LinkList L无关吧?函数中又没有用到L = (LinkList)malloc(sizeof(Node)); 之类的,那入口参数是LinkList L,有问题吗?还是我理解哪里错了?
搜索更多相关主题的帖子: 百度 编译器 制作 
2014-07-12 21:01
Mark27525751
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-7-12
收藏
得分:0 
while(p && j<i)    //寻找第i个结点, p=0说明说明?    还有这句中,p=0,这个判断条件是说明说明?p=0是说头结点的内存单元编号是0x00000000?
2014-07-12 21:06
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
第一个问题,如果有关了不就报错了吗?
第二个问题,
http://eternalwt.blog.

"需要记住的重要一点是,当常数0被转换为指针时,这个指针绝对不能被解除引用(dereference)。换句话说,当我们将0赋值给一个指针变量时,绝对不能企图使用该指针对指向的内存中存储的内容。
"
也就是说, 指针变量为0的时候,指向的内存地址里面存储的内容是不能使用的,是无效的.0号内存地址是不能访问的.

代码测试环境:  WinXP+C-Free5.0.
2014-07-25 10:17
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
楼主先拿GetMemory的问题说事,然后把其应用到ListInsert里,认为其也要用二级指针?这两个函数有什么联系吗?

总有那身价贱的人给作业贴回复完整的代码
2014-07-25 10:41
小旋风小王爷
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-7-30
收藏
得分:0 
void GetMemory(char *p, int num)传值->会生成临时副本
解决方法:
void GetMemory(char &*p, int num)传引用->传自己的别名进去
void GetMemory(char **p, int num)传指针->传自己的地址进去

Status ListInsert(LinkList *L,int i,ElemType e)这里是不是掉了个引用符号
2014-07-31 19:19
快速回复:关于单链表添加一个节点函数的疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020918 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved