在线性表的实现中,头插法和尾插法在函数参数中为什么么用的Node*&head?
目前在参考书上的代码实现线性表的操作。去掉&符号,编译依然正确。
一枚找工作的大四狗,汪汪。
void Insert_Head( Node *&head , const int &val ) // 头插法
{
Node *ptr = new Node() ;
ptr->next = head ;
ptr->data = val ;
head = ptr ;
}
void Insert_Back( Node *&head , Node *&back ,const int &val ) // 尾插法
{
Node *ptr = new Node() ;
ptr->data = val ;
ptr->next = NULL ;
if ( head == NULL )
head = back = ptr ;
else {
back->next = ptr ;
back = ptr ;
}
}
指针引用既修改了指针的地址,又修改了指针对应的值.
#include<iostream>
using namespace std;
void swapone(int *v1,int *v2)
{
int *temp=v2;
v2=v1;
v1=temp;
cout<<*v1<<" "<<*v2<<endl;
}
void swaptwo(int *&v1,int *&v2)
{
int *temp=v2;
v2=v1;
v1=temp;
cout<<*v1<<" "<<*v2<<endl;
}
int main(int argc, char *argv[])
{
int a=20,b=30;
int *p=&a;
int *q=&b;
cout<<p<<" "<<q<<endl;
cout<<"swapone()**************************"<<endl;
swapone(p,q);
cout<<p<<" "<<q<<endl;
cout<<*p<<" "<<*q<<endl;
cout<<"***********************************"<<endl;
cout<<"swaptwo()**************************"<<endl;
swaptwo(p,q);
cout<<*p<<" "<<*q<<endl;
cout<<p<<" "<<q<<endl;
cout<<"***********************************"<<endl;
return 0;
}
运行结果:
0x7fff5fbff74c 0x7fff5fbff748
swapone()**************************
30 20
0x7fff5fbff74c 0x7fff5fbff748
20 30
***********************************
swaptwo()**************************
30 20
30 20
0x7fff5fbff748 0x7fff5fbff74c
***********************************
你注意一下 head 和 back 这两个定义成 Node*&
类型的参数,在函数内部都有赋值操作。
&
表示引用,我想你应该知道的吧,*&
就是指针的引用,这个应该也好理解。
引用有一个特点就是,修改型参的值同时也会修改实参的值,但如果不是引用,修改了形参的值对实参不会有影响
就这点区别了