下面的函數 void reverse ( LinkList* L) 為什麼不能通過L的變換而返回L的值,如果改成:
////////////////////
LinkList* reverse ( LinkList* L)
{
//print(L);
LinkList* p = L->next;
LinkList* q = NULL;
LinkList* r;
while (p!= NULL) {
r = p->next;
p->next = q;
q = p;
p = r;
}
L=q;
print1(L);
return q;}////////////////////
用以上的可以返回q,這個函數的功能是把原來的鏈表頭尾置換。請問是什麼原因。# include<iostream.h>
#include <stdio.h>
struct LinkList {
int data;
struct LinkList *next;
};//帶頭結點
int getLinkLength (LinkList *L)
{
LinkList * p = L->next;
int i =0; //??器
while (p!=NULL) {
i++;
p=p->next;
}
return (i);
}//帶頭結點
int getLinkLength1 (LinkList *L)
{
LinkList * p = L;
int i =0; //??器
while (p!=NULL) {
i++;
p=p->next;
}
return (i);
}
void create(struct LinkList* L) {
struct LinkList* rear = L;
int n, i;
printf("please input the number of elements\n");
scanf("%d",&n);
printf("\nplease input each element!\n");
for(i=0; i<n;i++) {
LinkList *p = new LinkList;
scanf("%d",&p->data);
rear->next =p; //?尾部插入
rear = rear->next;
}
rear->next = NULL;
}//帶頭結點的
void print( LinkList* L) {
printf("\n");
struct LinkList* p = L->next ;
while (p!= NULL) {
printf("%d\t",p->data);
p=p->next;
}
printf("\n");}//不帶頭結點的
void print1( LinkList* L) {
printf("\n");
struct LinkList* p = L ;
while (p!= NULL) {
printf("%d\t",p->data);
p=p->next;
}
printf("\n");}void reverse ( LinkList* L)
{
//print(L);
LinkList* p = L->next;
LinkList* q = NULL;
LinkList* r;
while (p!= NULL) {
r = p->next;
p->next = q;
q = p;
p = r;
}
L=q;
print1(L);
//return q;}
//主函?
void main()
{
int s;
LinkList *L = new LinkList;
L->next =NULL; create(L);
cout<<"置換前的表結構:"<<endl;
print(L); reverse(L);
cout<<"置換後的表結構:"<<endl;
print1(L);
s=getLinkLength1(L);
cout<<s<<endl;
}
////////////////////
LinkList* reverse ( LinkList* L)
{
//print(L);
LinkList* p = L->next;
LinkList* q = NULL;
LinkList* r;
while (p!= NULL) {
r = p->next;
p->next = q;
q = p;
p = r;
}
L=q;
print1(L);
return q;}////////////////////
用以上的可以返回q,這個函數的功能是把原來的鏈表頭尾置換。請問是什麼原因。# include<iostream.h>
#include <stdio.h>
struct LinkList {
int data;
struct LinkList *next;
};//帶頭結點
int getLinkLength (LinkList *L)
{
LinkList * p = L->next;
int i =0; //??器
while (p!=NULL) {
i++;
p=p->next;
}
return (i);
}//帶頭結點
int getLinkLength1 (LinkList *L)
{
LinkList * p = L;
int i =0; //??器
while (p!=NULL) {
i++;
p=p->next;
}
return (i);
}
void create(struct LinkList* L) {
struct LinkList* rear = L;
int n, i;
printf("please input the number of elements\n");
scanf("%d",&n);
printf("\nplease input each element!\n");
for(i=0; i<n;i++) {
LinkList *p = new LinkList;
scanf("%d",&p->data);
rear->next =p; //?尾部插入
rear = rear->next;
}
rear->next = NULL;
}//帶頭結點的
void print( LinkList* L) {
printf("\n");
struct LinkList* p = L->next ;
while (p!= NULL) {
printf("%d\t",p->data);
p=p->next;
}
printf("\n");}//不帶頭結點的
void print1( LinkList* L) {
printf("\n");
struct LinkList* p = L ;
while (p!= NULL) {
printf("%d\t",p->data);
p=p->next;
}
printf("\n");}void reverse ( LinkList* L)
{
//print(L);
LinkList* p = L->next;
LinkList* q = NULL;
LinkList* r;
while (p!= NULL) {
r = p->next;
p->next = q;
q = p;
p = r;
}
L=q;
print1(L);
//return q;}
//主函?
void main()
{
int s;
LinkList *L = new LinkList;
L->next =NULL; create(L);
cout<<"置換前的表結構:"<<endl;
print(L); reverse(L);
cout<<"置換後的表結構:"<<endl;
print1(L);
s=getLinkLength1(L);
cout<<s<<endl;
}
则这种改变,会改变到调用时的数据(称实参)。
但如果改变指针本身,则不会改变实参。
因此,如果要在函数中改变指针本身,通常有两种方法:
1、返回改变后指针
2、传入参数改为指针的指针,例如:
void GetText(char**buf)
{
if(*buf)delete []*buf;
*buf=new char[256];
strcpy(*buf,"Hello");
}
...
char * p=new char[32];
GetText(&p);
你可以改变指针指向的内容, 那么里面外面都会发生变化.
但是你不能改变指针本身. 因为它只是一个copy !!!