关于C++函数参数传递的问题!好奇葩。。。从未遇到过,求大神解释~
#include "iostream"
using namespace std;
#include<malloc.h>
#define LEN sizeof(struct adapt)
struct adapt
{
int n;
struct adapt *next;
};
struct adapt *creat(int x)
{
struct adapt *head;
struct adapt *p1,*p2;
int n=0;
p1=p2=(struct adapt*) malloc(LEN);
cin>>p1->n;
head=NULL;
while(1)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct adapt*)malloc(LEN);
if(n<x)
cin>>p1->n;
else break;
}
p2->next=NULL;
return(head);
}
int search(struct adapt *p,int n)
{
int k=0;
if(p->next==NULL)
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}
else
{
while(p->next!=NULL)
{
k++;
if(p->n==n) break;
p=p->next;
}
if(p->next==NULL) return(-1);
else return(k);
}
}
struct adapt *del(struct adapt *head,int num)
{
struct adapt *p1,*p2;
if (head==NULL)
{
return(head);
}
else
{
p1=head;
while(num!=p1->n && p1->next!=NULL)
{p2=p1;p1=p1->next; }
if(num==p1->n)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
}
return(head);
}
}
struct adapt *insert(struct adapt *head,int n)
{
struct adapt *p=NULL;
struct adapt a={0,p};
struct adapt *stud;stud=&a;
stud->n=n;
if(head==NULL)
{stud->next=NULL;}
else
{
stud->next=head;
}
return(stud);
}
int main()
{
int n,m,s;
cin>>n>>m;
int *q=new int[m];
struct adapt* p;
p=creat(n);
for(int i=0;i<m;i++)
{
cin>>q[i];
}
for(int j=0;j<m;j++)
{
s=search(p,q[j]);
cout<<s<<endl;
p=del(p,q[j]);
p=insert(p,q[j]);
}
system("pause");
}
若输入参数为:
5 5
1 2 3 4 5
3 3 6 2 3
则程序出错。经调试发现,在主函数的第二个循环运行到第二次的时候,执行search函数,进入函数调试,当光标指向函数第一步时,参数正常;再下一步,参数值莫名其妙地在链表头处加了一个链结,且next为空。求解释!!为什么中间什么语句都没有参数居然突变了?? 展开
1说明
为了便于显示调试信息,我稍微修改了一下。
经过调试,首先发现insert函数有问题,问题如下,修改也如下;
//struct adapt a={0,p};//删除
//struct adapt *stud;stud=&a;不能返回局部变量地址,函数调用后局部地址被清除//删除该句
struct adapt *stud=(struct adapt*)malloc(LEN);//增加
其次search函数也有问题,search函数查找时,若最后一个结点与查找的数相同,会返回-1。
2图片
2.1最终运行图
2.2没有修改search函数时。
测试数据为
5 5
1 2 3 4 5
3 2 4 1 5
2.2修改search函数后
2.4没有调试信息的代码输出
3.代码如下
#include "iostream"
using namespace std;
#include<malloc.h>
#define LEN sizeof(struct adapt)
struct adapt//链表
{
int n;
struct adapt *next;
};
struct adapt *creat(int x)//创建含有x个元素的链表
{
struct adapt *head;
struct adapt *p1,*p2;
int n=0;
p1=p2=(struct adapt*) malloc(LEN);
cin>>p1->n;
head=NULL;
while(1)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct adapt*)malloc(LEN);
if(n<x)
cin>>p1->n;
else break;
}
p2->next=NULL;
return(head);
}
int search(struct adapt *p,int n)//在链表中查找数值为n的数,返回序号
{
cout<<"search:"<<n<<endl;//
int k=0;
if(p->next==NULL)
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}
else
{
while(p->next!=NULL)
{
k++;
if(p->n==n) break;
p=p->next;
}
if(p->next==NULL) ///*********先判断p是否为n,否则若最后一个数为n,会返回-1
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}////*********
//if(p->next==NULL) return(-1);
else return(k);
}
}
struct adapt *del(struct adapt *head,int num)//从链表中删除数值为num的数
{
cout<<"delete:"<<num<<endl;//
struct adapt *p1,*p2;
if (head==NULL)
{
return(head);
}
else
{
p1=head;
while(num!=p1->n && p1->next!=NULL)
{p2=p1;p1=p1->next; }
if(num==p1->n)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
}
return(head);
}
}
struct adapt *insert(struct adapt *head,int n)//在链表首部插入n
{
cout<<"insert:"<<n<<endl;
struct adapt *p=NULL;
//struct adapt a={0,p};
//struct adapt *stud;stud=&a;不能返回局部变量地址,函数调用后局部地址被清除
struct adapt *stud=(struct adapt*)malloc(LEN);//
stud->n=n;
if(head==NULL)
{stud->next=NULL;}
else
{
stud->next=head;
}
return(stud);
}
/*------------*/
void showLink(struct adapt * head)//显示链表信息
{
struct adapt * temp=head;
cout<<"Link Data:";//
while (head!=NULL)
{
cout<<"->"<<head->n;
head=head->next;
}
cout<<endl;
head =temp;
}
/*------------*/
int main()
{
int n,m,s;
cin>>n>>m;
int *q=new int[m];
struct adapt* p;
p=creat(n);
for(int i=0;i<m;i++)
{
cin>>q[i];
}
for(int j=0;j<m;j++)
{
cout<<"【Times:"<<j+1<<"】"<<endl;//----输出循环次数
s=search(p,q[j]);
showLink(p);//--------------显示查询后链表状况
cout<<s<<endl;
p=del(p,q[j]);
showLink(p);//---------显示删除结点后链表状况
p=insert(p,q[j]);
showLink(p);//--------显示插入结点后链表状况
}
system("pause");//系统命令,暂停
}
4.没有调试信息的代码
#include "iostream"
using namespace std;
#include<malloc.h>
#define LEN sizeof(struct adapt)
struct adapt
{
int n;
struct adapt *next;
};
struct adapt *creat(int x)
{
struct adapt *head;
struct adapt *p1,*p2;
int n=0;
p1=p2=(struct adapt*) malloc(LEN);
cin>>p1->n;
head=NULL;
while(1)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct adapt*)malloc(LEN);
if(n<x)
cin>>p1->n;
else break;
}
p2->next=NULL;
return(head);
}
int search(struct adapt *p,int n)
{
int k=0;
if(p->next==NULL)
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}
else
{
while(p->next!=NULL)
{
k++;
if(p->n==n) break;
p=p->next;
}
if(p->next==NULL) ///*********先判断p是否为n,否则若最后一个数为n,会返回-1
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}////*********
//if(p->next==NULL) return(-1);
else return(k);
}
}
struct adapt *del(struct adapt *head,int num)
{
struct adapt *p1,*p2;
if (head==NULL)
{
return(head);
}
else
{
p1=head;
while(num!=p1->n && p1->next!=NULL)
{p2=p1;p1=p1->next; }
if(num==p1->n)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
}
return(head);
}
}
struct adapt *insert(struct adapt *head,int n)
{
struct adapt *p=NULL;
//struct adapt a={0,p};
//struct adapt *stud;stud=&a;不能返回局部变量地址,函数调用后局部地址被清除
struct adapt *stud=(struct adapt*)malloc(LEN);//
stud->n=n;
if(head==NULL)
{stud->next=NULL;}
else
{
stud->next=head;
}
return(stud);
}
int main()
{
int n,m,s;
cin>>n>>m;
int *q=new int[m];
struct adapt* p;
p=creat(n);
for(int i=0;i<m;i++)
{
cin>>q[i];
}
for(int j=0;j<m;j++)
{
s=search(p,q[j]);
cout<<s<<endl;
p=del(p,q[j]);
p=insert(p,q[j]);
}
system("pause");
}
参考资料: 自己写的