killkk 发表于 2014-4-9 15:54:55

初学数据结构与算法【线性表】有疑问!求解答!!

本帖最后由 killkk 于 2014-4-9 15:54 编辑

没有贴全部代码,只贴了部分的。
全部代码我已经手动输入并调试了很多次了。也可以正常运行。
但现在有个疑问。请看以下红色部分:
1, 为什么有的地方使用指针指向成员 如: Sqlist *L(L->length), 而有的地方直接使用的点成员如:Sqlist L(L.length)
2, 我已经尝试将它们全部(红色字体)改成 Sqlist *L 或Sqlist L 也可能正常运行,得到正确结果。
3, 指针指向成员L->length 和 L.length 效果不是一样的吗?为什么代码中有的地方这样用,有的地方却那样用呢?
4, 甲鱼老师在讲视此频教程的时候说过为什么要这样用的,但后面他没说原因,可能是他忘了?谁能帮忙解释一下呢,非常感谢!

/* 初始化顺序线性表 */
Status InitList(SqList *L)
{
    L->length=0;
    return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(SqList L)
{
    if(L.length==0)
      return TRUE;
    else
      return FALSE;
}

/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(SqList *L)    // Status ClearList(SqList L)比如这里改成这样也行啊!!
{
    L->length=0;                   // L.length = 0;
    return OK;                     // return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(SqList L)
{
    return L.length;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
Status GetElem(SqList L,int i,ElemType *e)
{
    if(L.length==0 || i<1 || i>L.length)
            return ERROR;
    *e=L.data;

    return OK;
}

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(SqList L,ElemType e)
{
    int i;
    if (L.length==0)
            return 0;
    for(i=0;i<L.length;i++)
    {
            if (L.data==e)
                  break;
    }
    if(i>=L.length)
            return 0;

    return i+1;
}




Worldmaker 发表于 2014-4-9 15:54:56

不好意思啊,才看到你的问题。如果定义的是结构体指针的话,就要用“->”;如果定义的是普通的结构体,就要用“.”。二者在实际应用中效果一样。但是如果想作为函数的参数的话,就要看传进去的是普通的结构体变量还是结构体指针了。传指针的目的是使结构体指针指向的数据在函数执行后发生变化,而传普通的结构体变量则不能在函数执行后改变结构体内的值~不知道这么说你明白了没有...

Worldmaker 发表于 2014-4-9 21:03:25

用指向结构体类型变量表示结构体类型变量成员分量时,使用的表达式形式非常容易写为:*指针变量.成员名.例如,将(*ptr).score误写为*ptr.score而后者表达的意义是:结构体变量ptr的score是一个指针变量,去除其指向对象的内容,与本来表示的取出指针变量ptr指向的结构体类型变量的score成员分量的值意义相差甚远.为了使得表达式更清晰且不容易误写,C程序设计语言通过指针变量访问结构体类型变量成员分量给出了一种简洁的表达形式:指针变量名->成员名。所以一般的成员变量用“.”,指针用“->”~

killkk 发表于 2014-4-9 22:03:23

Worldmaker 发表于 2014-4-9 21:03 static/image/common/back.gif
用指向结构体类型变量表示结构体类型变量成员分量时,使用的表达式形式非常容易写为:*指针变量.成员名.例如, ...

   首先感谢您的回复。但您所回答的只是 结构体成员如何引用的三个方法之间的区别。 这些我知道的。
   
   还有你说的 “所以一般的成员变量用“.”,指针用“->” (这些只是表示方法不一样,结果都一样对吧?)

那下面的代码中:
    /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(SqList L)//   int ListLength(SqList *L)
{
    return L.length;      //return L->length;
}
我改成右边注释的那样也行啊,按照你所说的 L.length 就是一般的成员变量引用,那我注释的用指针的代码效果完全一样啊!难道它属于特殊的?



【1】:
int ListLength(SqList L)
{
    return L.length;   //直接使用 L.length 点成员名这种形式
}

【2】:
int ListLength(SqList *L)
{
    return L->length;   //直接使用 L->Length 指向成员这种形式
}

我原意是这样的: 为什么全篇代码的每个模块不用上面【1】或【2】这样子,因为它们效果一样。而是有的模块用【1】,有的模块用【2】,我理解能力有些差,但喜欢追根结底。求解答。。

killkk 发表于 2014-4-10 01:00:48

Worldmaker 发表于 2014-4-9 15:54 static/image/common/back.gif
不好意思啊,才看到你的问题。如果定义的是结构体指针的话,就要用“->”;如果定义的是普通的结构体,就要用 ...

"但是如果想作为函数的参数的话,就要看传进去的是普通的结构体变量还是结构体指针了。传指针的目的是使结构体指针指向的数据在函数执行后发生变化,而传普通的结构体变量则不能在函数执行后改变结构体内的值~"

灰常感谢您的解答! 这就是我想要的答案!! 因为我用gdb单步的时候就发现了这个问题..传普通的结构体变量不会改变其值, 传指针的就会改变..:hug:

Worldmaker 发表于 2014-4-10 07:00:02

嘿嘿,不客气,一起加油~

bj584767285 发表于 2014-4-10 20:21:46

看看,顶起!

枫界易城 发表于 2014-4-11 12:45:34

过来学习学习!,,,,,,,,,
页: [1]
查看完整版本: 初学数据结构与算法【线性表】有疑问!求解答!!