帅帅的嘉爷 发表于 2020-3-6 10:45:51

关于链表指针的理解求解答

for(i=1;i<=n;i++)
    {
      p=(LinkList)malloc(sizeof(LNode));
      printf("请输入第%d个元素的值:",i);
      scanf("%d",&(p->data));
      p->next=NULL;
      q->next=p;
      q=p;
    }
具体就是这一段我有点儿难理解,在q->next = p后又q = p这样的操作不就是让两个指针都指向了p指向的值嘛,而且下一次循环进来的话会是怎么样的保存呢?q的值不是没次都被覆盖了嘛?怎么还能到达保存的目的呢?有点儿不理解求大佬们解释解释。

兄弟来学习 发表于 2020-3-6 11:01:41

q->next=p就是让q指向新开辟的内存空间
q=p 让q移到新开辟内存的地址
下一次循环q->next又能指向新开辟的空间
就像一个箭头指向一个新的箭头,要移动到新的箭头才能指向下一个新的箭头,把存储的数据都连接起来

4goodworld 发表于 2020-3-6 12:58:06

本帖最后由 4goodworld 于 2020-3-6 13:03 编辑

其实这个制造过程给人感觉混乱的原因是,因为有了循环看不太清楚,我把循环的代码改成这样,你再琢磨下

//第一次
      p=(LinkList)malloc(sizeof(LNode));
      printf("请输入第%d个元素的值:",i);
      scanf("%d",&(p->data));
      p->next=NULL;
      q->next=p;
      q=p;
//第二次
        p=(LinkList)malloc(sizeof(LNode));
      printf("请输入第%d个元素的值:",i);
      scanf("%d",&(p->data));
      p->next=NULL;
      q->next=p;

然后,我们按照理解重新构造下,或许你会更方便的理解

      q=p;
      p=(LinkList)malloc(sizeof(LNode));
      printf("请输入第%d个元素的值:",i);
      scanf("%d",&(p->data));
      p->next=NULL;
      q->next=p;


q=p;               //此时的p你把它理解为熊大,q=p,是不是q也是熊大
中间有一段操作 // 制作熊二的过程
q->next=p;      //此时的p,你把它理解为熊二,熊大的next为熊二,合不合理?
最后,其实你这个创建链表的过程还差一个创建头部的代码,如果把头部Head加起来,你就看得完整

帅帅的嘉爷 发表于 2020-3-6 17:27:04

4goodworld 发表于 2020-3-6 12:58
其实这个制造过程给人感觉混乱的原因是,因为有了循环看不太清楚,我把循环的代码改成这样,你再琢磨下

...

谢谢!非常感谢,很形象哈哈啊哈,我懂了!

帅帅的嘉爷 发表于 2020-3-6 17:28:00

兄弟来学习 发表于 2020-3-6 11:01
q->next=p就是让q指向新开辟的内存空间
q=p 让q移到新开辟内存的地址
下一次循环q->next又能指向新开辟的 ...

谢谢!终于打开了我的思路!我懂了!
页: [1]
查看完整版本: 关于链表指针的理解求解答