balabala__
balabala__
采纳率0%
2016-07-26 16:37

C语言数据结构顺序存储的线性表常用函数的参数传递中*P和P使用情况和一些顺序存储的线性表问题

刚学了C语言的数据结构,有一些问题不懂,或者说有一些认识不知道对不对,想知道真正的情况是怎么样的。
先看这几条语句:
void union(List *La,List Lb) (1)
{
int La_len,Lb_len,i;

ElemType e;
La_len = ListLength(*La); (2)
Lb_len = ListLength(Lb); (3)
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);
if(!LocateElem(*La,e)) (4)
ListInsert(La,++La_len,e);
}
}

                    再看函数原型,是我看的书上的:(L是线性表)
                                        1. InitList(*L);
                                        2. ClearList(*L);                                       
                                        3. ListInsert(*L,i,e);
                                        4. ListDelete(*L,i,*e);
                                        5. ListLength(L);
                                        6. ListEmpty(L);
                                        7. LocateElem(L,e);
                                        8. GetElem(L,i,*e);
问题是: 1.  第一部分语句, union函数的两个参数List *La,List Lb,一个是*La,一个是Lb,  不知道为什么一个是用线性表的指针的地址 *L,一个是用 L 。

                            2.  La_len = ListLength(*La);                 (2)
                               Lb_len = ListLength(Lb);                  (3)
                                     !LocateElem(*La,e) (4)         和第7条原型LocateElem(L,e);
                                    (2)(3)两条语句,用的是同样的函数,一个却是指针地址,一个确实指针指向的值,对应第5条函数原型ListLength(L);是不是这个函数里面的参数既可以是*La也可以是Lb?区别是什么?
                                    (4)的语句第一个参数是*La,而原型第一个参数是L,不知道为什么一个有加*,一个没有加,有错吗,没错的话区别是什么?


                            3. 几个函数原型里面,前4条函数的参数是L,后4条函数参数是(*L),还有e也有这种情况,是为什么??搞不懂什么时候用加*,什么时候不用加,区别是什么

                            4. 顺序线性表的定义跟一个结构体差不多,里面有一个数组存储数据元素,搞不清楚结构体和线性表和数组的区别和联系

                        (老师教C的时候,没怎么听,后来学JAVA了C也忘记差不多了,学C的数据结构感觉熟悉又陌生,有很多不懂的地方,谢谢大家帮忙解答了)
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 5年前
     很简单,L是指针,*L是指针的指针。
    通过指针,可以修改变量,同时作用到实参,通过指针的指针,可以修改指针,让指针指向另一个对象。
    例子
    void foo(int a)
    {
    a = 1;
    }
    ...
    a = 2;
    foo(a); //此时a还是2,不是1。
    
    要想改变a,需要指针
    
    void foo(int *a)
    {
    *a = 1;
    }
    ...
    a = 2;
    foo(&a); //此时a是1。
    
    再看
    void foo(int *a)
    {
    a = new int(1);
    }
    ...
    a = null;
    foo(&a); //此时a还是null。
    要想改变指针,需要指针的指针
    void foo(int **a)
    {
    *a = new int(1);
    }
    ...
    a = null;
    foo(&a); //此时a指向新的对象。
    cout << *a; // 1
    
    看你的代码,显然initlist需要修改指针,所以需要指针的指针。
    listlength只是获得长度,不修改指针,只要指针就可以了。L就是指针,
    
    点赞 1 评论 复制链接分享