机智如我么么哒 发表于 2019-10-14 00:19:56

一个链表的题,没看懂

下列函数试图求链式存储的线性表的表长,是否正确?

intLength ( List*PtrL )

{    List*p = PtrL;      

   intj = 0;

   while ( p ) {

         p++;

         j++;               

   }   

   returnj;

}

为什么不可以求出链表的长度

人造人 发表于 2019-10-14 00:35:41

“下列函数试图求链式存储的线性表的表长,是否正确?”
答案是:不清楚,不知道
要知道这个问题的答案还需要知道数据结构的定义和数据结构的初始化函数

还有,你为什么就不能把代码贴完整呢?

人造人 发表于 2019-10-14 00:37:42

“为什么不可以求出链表的长度”
不知道,因为我看不到数据结构的定义和数据结构的初始化函数

jackz007 发表于 2019-10-14 00:38:47

既然是链表,那么在节点中就必然会有一个成员的值是指向下一个节点的指针,假设这个成员名字叫 next
intLength(List* PtrL)
{
      List* p = PtrL      ;
      int j = 0             ;
      while(p) {
                j ++          ;
                p = p -> next ;
      }
      return j            ;
}

人造人 发表于 2019-10-14 00:42:07

好吧,我没有认真看题
代码中有一条语句明显就不对
p++;

机智如我么么哒 发表于 2019-10-14 15:22:12

人造人 发表于 2019-10-14 00:42
好吧,我没有认真看题
代码中有一条语句明显就不对

为什么p++,不对,p++不是使指针指向下一个元素吗?

机智如我么么哒 发表于 2019-10-14 15:23:32

jackz007 发表于 2019-10-14 00:38


为什么要把p++改为p=p->next?这里没看懂,p++不就是指向下一个元素吗?

jackz007 发表于 2019-10-14 16:20:39

机智如我么么哒 发表于 2019-10-14 15:23
为什么要把p++改为p=p->next?这里没看懂,p++不就是指向下一个元素吗?

       首先,p 作为指针,其值不可能通过步进(增加一个固定值)而成为 0 值,所以,while(p) 基本上会成为死循环;其次,如果学过链表就应该知道,链表是由一系列连在一起的节点构成,从首节点开始,每个节点都必有一个成员是用来存放指下一个节点地址的指针,这样,只要知道首节点地址,通过这条线索,很容易就可以遍历到链表的每一个节点,到最后一个节点的时候,这个指针的数值为 NULL,逻辑值就会是 false,就是说到达尾节点的时候 while(p) 循环就会结束。

机智如我么么哒 发表于 2019-10-14 16:45:06

jackz007 发表于 2019-10-14 16:20
首先,p 作为指针,其值不可能通过步进(增加一个固定值)而成为 0 值,所以,while(p) 基本上会 ...

你这么一说,我又不懂这个while(p)里面的p为什么不用取值呢?当p->next等于null时,p指向的是p->next的值,直接用while(p)是怎么判断p是0还是1

jackz007 发表于 2019-10-14 18:23:48

机智如我么么哒 发表于 2019-10-14 16:45
你这么一说,我又不懂这个while(p)里面的p为什么不用取值呢?当p->next等于null时,p指向的是p->next的 ...

       感觉目前还无法与你沟通,建议你还是先看看 C 语言中关于结构型变量的内容,先搞清链表以及指针相关的概念,然后再讨论,会比较有共同语言。

机智如我么么哒 发表于 2019-10-14 20:07:28

jackz007 发表于 2019-10-14 18:23
感觉目前还无法与你沟通,建议你还是先看看 C 语言中关于结构型变量的内容,先搞清链表以及指针相 ...

刚才搜了一下说(p)是判断指针是否为空,而(*p)是判断内容是否为空,然后我就懂了,谢谢啊
页: [1]
查看完整版本: 一个链表的题,没看懂