先把代码粘上来
#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的值相当于做为引用来处理,内部改变,外部相应的修改了
总结:
可能说的不是很清楚,我再进一步想办法修改来把问题说明白
后记:
我们的一生可能会遇到很多人,但你却可能是某个人的一生,请珍惜和善待那个爱你一生的人。
谢谢你,萍儿,以后的路一起走,以后的事一起做。不退缩,不害怕。