以下是引用ciweitou163在2010-10-9 14:35:21的发言:
是的,一个很经典的例子swap(int a,int b),swap(int * a,int * b),swap(int & a,int & b);具体的区别看看资料吧。
是这个吗?
#include"iostream.h"
void swap(int a,int b);
void swap1(int &a,int &b);
void swap(int *a,int *b);
void display(int a,int b);
int main()
{
int a,b;
cout<<"请输入两个数:";
cin>>a>>b;
int *m=&a,*n=&b;
swap(a,b);
display(a,b);
swap1(a,b);
display(a,b);
swap(m,n);
display(a,b);
return 0;
}
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
return;
}
void swap1(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
return;
}
void swap(int *a,int *b)
{
int temp;
temp=*a;
a=b;
b=&temp;
return;
}
void display(int a,int b)
{
cout<<"a="<<a<<" "<<"b="<<b<<endl;
}
上面这个明白了,刚看了,这是根据书上该的
下面的是不明白的,帖子是截取的其中一部分
#include "iostream.h"
struct node//定义结点结构类型
{
char data;//用于存放字符数据
node *next;//用于指向下一个结点(后继结点)
};
node * create();//创建链表的函数,返回表头
void showList(node *head);//遍历链表的函数,参数为表头
node *search(node *pRead,char keyword);
void insert(node * head,char keyWord,char newdata);
void Delete(node * &head,char keyWord);
void destroy(node * &head);
int main()
{
node *head;
head=create();//以head 为表头创建一个链表
showList(head);//遍历以head 为表头的链表
search(head,'u');
insert(head, 'u','l');
showList(head);
Delete(head,'l');
showList(head);
destroy(head);
return 0;
}
node * create()
{
node *head=NULL;//表头指针,一开始没有任何结点,所以为NULL
node *pEnd=head;//表为指针,一开始没有任何结点,所以指向表头
node *pS;//创建新结点时使用的指针
char temp;//用于存放从键盘输入的字符
cout <<"Please input a string end with '#':" <<endl;
do//循环至少运行一次
{
cin >>temp;
if (temp!='#')//如果输入的字符不是结尾符#,则建立新结点
{
pS=new node;//创建新结点
pS->data=temp;//新结点的数据为temp
pS->next=NULL;//新结点将成为表尾,所以next 为NULL
if (head==NULL)//如果链表还没有任何结点存在
{
head=pS;//则表头指针指向这个新结点
}
else//否则
{
pEnd->next=pS;//把这个新结点连接在表尾
}
pEnd=pS;//这个新结点成为了新的表尾
}
}while (temp!='#');//一旦输入了结尾符,则跳出循环
return head;//返回表头指针
}
void showList(node *head)
{
node *pRead=head;//访问指针一开始指向表头
cout <<"The data of the link list are:" <<endl;
while (pRead!=NULL)//当访问指针存在时(即没有达到表尾之后)
{
cout <<pRead->data;//输出当前访问结点的数据
pRead=pRead->next;//访问指针向后移动
}
cout <<endl;
}
node * search(node *head,char keyword)//返回结点的指针
{
node *pRead=head;
while (pRead!=NULL)//采用与遍历类似的方法,当访问指针没有到达表尾之后
{
if (pRead->data==keyword)//如果当前结点的数据和查找的数据相符
{
return pRead;//则返回当前结点的指针
}
pRead=pRead->next;//数据不匹配,pRead 指针向后移动,准备查找下一个结点
}
return NULL;//所有的结点都不匹配,返回NULL
}
void insert(node * head,char keyWord,char newdata)//keyWord 是查找关键字符
{
node *newnode=new node;//新建结点
newnode->data=newdata;//newdata 是新结点的数据
node *pGuard=search(head,keyWord);//pGuard 是插入位置前的结点指针
if (head==NULL || pGuard==NULL)//如果链表没有结点或找不到关键字结点
{//则插入表头位置
newnode->next=head;//先连
head=newnode;//后断
}
else//否则
{//插入在pGuard 之后
newnode->next=pGuard->next;//先连
pGuard->next=newnode;//后断
}
}
void Delete(node * &head,char keyWord)//可能要操作表头指针,所以head 是引用
{
if (head!=NULL)//如果链表没有结点,就直接输出提示
{
node *p;
node *pGuard=head;//初始化pGuard 指针
if (head->data==keyWord)//如果头结点数据符合关键字
{
p=head;//头结点是待删除结点
head=head->next;//先连
delete p;//后断
cout <<"The deleted node is " <<keyWord <<endl;
return;//结束函数运行
}
else//否则
{
while (pGuard->next!=NULL)//当pGuard 没有达到表尾
{
if (pGuard->next->data==keyWord)//如果pGuard 后继结点数据符合关键字
{
p=pGuard->next;//pGuard 后继结点是待删除结点
pGuard->next=p->next;//先连
delete p;//后断
cout <<"The deleted node is " <<keyWord <<endl;
return;//结束函数运行
}
pGuard=pGuard->next;//pGuard 指针向后移动
}
}
}
cout <<"The keyword node is not found or the link list is empty!" <<endl;//输出提示信息
}
void destroy(node * &head)
{
node *p;
while (head!=NULL)//当还有头结点存在时
{
p=head;//头结点是待删除结点
head=head->next;//先连
delete p;//后断
}
cout <<"The link list has been deleted!" <<endl;
}
Delete(head,'l');调用head是不是相当于参数&head,那Delete函数中head中操作的不是main函数的head而是head的地址吗?
将声明和定义都改成
void showList(node *headnode *search(node *pRead,char keyword);
void insert(node * head,char keyWord,char newdata););//*&head改为*head
void Delete(node * head,char keyWord);//*&head改为*head
void destroy(node * head););//*&head改为*head
但对结果输入没有影响,我想问的是*&head对函数的影响