下面的函數 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;
}

解决方案 »

  1.   

    在函数参数指针传递中(或地址传递),如果在函数中改变指针所指的内容,
    则这种改变,会改变到调用时的数据(称实参)。
    但如果改变指针本身,则不会改变实参。
    因此,如果要在函数中改变指针本身,通常有两种方法:
    1、返回改变后指针
    2、传入参数改为指针的指针,例如:
    void GetText(char**buf)
    {
    if(*buf)delete []*buf;
    *buf=new char[256];
    strcpy(*buf,"Hello");
    }
    ...
    char * p=new char[32];
    GetText(&p);
      

  2.   

    我想問一下,程序裡面的void create(struct LinkList* L) 函數同樣是用的指針類型的參數,二期在 create函數裡面,L表有變化,可以返回變化結果呢。為什麼?
      

  3.   

    你传的是一个指针的copy, 
    你可以改变指针指向的内容, 那么里面外面都会发生变化. 
    但是你不能改变指针本身. 因为它只是一个copy !!!
      

  4.   

    請問如何改才能 void reverse ( LinkList* L)實現我程序的返回L的功能。
      

  5.   

    把函数写成这样的形式: void reverse(LinkList* &L)