关于C++函数参数传递的问题!好奇葩。。。从未遇到过,求大神解释~

我的代码:#include"iostream"usingnamespacestd;#include<malloc.h>#defineLENsizeof(structada... 我的代码:

#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为空。求解释!!为什么中间什么语句都没有参数居然突变了??
展开
 我来答
wzbsgsa
推荐于2016-10-04 · TA获得超过954个赞
知道小有建树答主
回答量:331
采纳率:0%
帮助的人:394万
展开全部

  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");

}

 

参考资料: 自己写的

六月心悸
2012-09-22
知道答主
回答量:52
采纳率:0%
帮助的人:23万
展开全部
运行时有警告warning C4508: 'main' : function should return a value; 'void' return type assumed
把int改为void或在后面加上return(0);这个程序编译时语法没错,我运行时输不出结果。
追问
。。。会有结果啊,第一个数搜索3的话会输出位置是3,不过到第二个数的时候就出问题了。。既然第一次没有问题,为什么第二次循环会有问题?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式