链表程序引发的指针思考

先把代码粘上来

#include <iostream>
using namespace std;
typedef struct node
{
      int data;
      node *next;
}*LinkList,Node;

LinkList creat()
{
      LinkList r,p,head;

      int n,x;
      cout<<"请输入数字的个数"<<endl;
      cin>>n;
      //初始化指针 第一个节点
      cout<<"请输入数字"<<endl;
      cin>>x;

      p=new Node;
      p->data=x;
      r=head=p;

      for (int i=n-1;i>0;i--)
      {
            cin>>x;
            p=new Node;
            p->data=x;
            r->next=p;
            r=p;
  
       }
       r->next=NULL;
       return head;
}
LinkList reverse(LinkList head)
{
       LinkList p1,p2,p3;
       p1=head;p2=p1->next;
       while (p2)
       {
             p3=p2->next;
             p2->next=p1;
             p1=p2;
             p2=p3;
       }
       head->next=NULL;
       head=p1;
       return head;
}
void output(LinkList head)
{
       LinkList p=head;
       while(p!=NULL)
       {
             cout<<p->data<<" ";
             p=p->next;
       }
       cout<<endl;
}
void paixu(LinkList head)
{
       LinkList p=head,q,small;
       int temp;
       for (;p->next!=NULL;p=p->next)
       {
              small=p;
              for (q=p->next;q!=NULL;q=q->next)
              {
                     if (q->data<small->data)
                     {
                             small=q;
                     }
              }
              if (small!=p)
              {
                     temp=small->data;
                     small->data=p->data;
                     p->data=temp;
              }
        }
}
void main()
{
      LinkList head;
      head=creat();
      cout<<"输出排序前数字"<<endl;
      output(head);
      paixu(head);
      cout<<"输出排序后数字"<<endl;  
      output(head);
      reverse(head);
      cout<<"反转后结果"<<endl;
      output(head);
      if(head != NULL)
      {
             cout<<"未释放"<<endl;
      }

      int num = 0;
      LinkList p,q;
      while(head != NULL)
      {
           p = head;
           q = head->next;
           if (p != NULL)
           {
                 num++;
                 delete p;
           }

           head = q;
      }

      cout<<"num="<<num<<endl;
}

 

测试:

如果把reverse函数改成void reverse(LinkList head)

在reverse最后不return head

在main函数中调用reverse(head);然后输出output(head)

结果不对,只出来原来的第一个结点的值,就是原来head指向的值

 

分析:

跟踪一下reverse函数没问题,思路正确

继续往下走,在reverse函数的倒数第二行head->next=NULL;没问题

这里就可以考虑一下问题的所在了,output函数中是根据head头指针然后取next指针获得下边的结点的

依据结果只有原来head的值,那就涉及到出参时使用地址来操作,实参和形参是一并改变的。

那这里就说明问题就出在head上,使用引用或者指针(即与地址相关的操作),在函数内部的值修改后,外部实参的值相应的也会改变

 

问题出来了,应该是head指向的头结点的值不正确,那这里怎么解决并解释呢

第一种方法:

       按照程序上写的return head;head的指针的值发生改变,然后可以把链表反向输出了。那这里为什么在函数内部修改结点的next值,会影响到结果呢,咱们这样看在head指向的结点中,包括data  和 next ,这里就可以解释了,head做为指针,它指向的内容就可以像引用传值一样改变了

    然后return head;在主函数中head = reverse(head) head值得到修改,后边就可以顺利把结果输出来了

第二种方法:

    将reverse函数的head声明为二维指针,即Node **head

  取内部的(*head)->next和上边第一种的方法解释是一样的

 然后更改内部head,就相当于外部调用时reverse(&head),这里把原来head的值相当于做为引用来处理,内部改变,外部相应的修改了

 

 

总结:

     可能说的不是很清楚,我再进一步想办法修改来把问题说明白

 

后记:

    我们的一生可能会遇到很多人,但你却可能是某个人的一生,请珍惜和善待那个爱你一生的人。

    谢谢你,萍儿,以后的路一起走,以后的事一起做。不退缩,不害怕。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值