数据结构中一个不可理喻的错误(c++高手过来看看吧!有分的!)

时间:2022-08-24 16:46:49
小弟最近在帮同学调试一道数据结构的程序中发现了一个不可理喻的错误!程序代码如下:
//本程序使用前插法建立单链表并求其长度
#include "iostream.h"
#include "malloc.h"
#define null 0
typedef struct node
{int data;
 struct node *link;
}jd; 
/*计算单链表长度函数*/
void dlbcd (jd *h)
{
cout<<h->data;
jd *p;
p=h;
while (p->link!=null)
{
    cout<<p->data;
    p=p->link;
}

}
/*建立单链表函数*/
dlbjl(jd *h,int n)
{
int i=0,a;
jd *p;
/*建立第一个结点*/
cin>>a;
h->data=a;
h->link=null;
/*前插法插入另外的n-1个结点*/
for (;i<n-1;i++)
{
   int a;
   cin>>a;
   p=(jd*)malloc(sizeof(jd));
   p->data=a;
   p->link=h;
   h=p;
}
//结点h始终指向单链表的第一个结点
cout<<h->data; 
}
main()
{
  int n;
  jd *h;
  h=(jd*)malloc(sizeof(jd));
  cin>>n;
  dlbjl(h,n);
  cout<<h->data;
  dlbcd(h);
}
当我输入3 2 3 4时输出的结果却是4 2 2,让人觉得不可理喻的是,指针h从函数dlbjl传出,我在其内部输出h-〉data时,入我所要求的输出结果一样是4(h指向头结点),而跳出这个子函数,我在主函数里紧接着输出h-〉data时,却输出了2,即此时h指向末结点。
后来我在另一个函数dlbcd的开始处,输出的也是2,h是个指针,在作为参数传递是,怎么会发现这种错误呢?请高手解答!

5 个解决方案

#1



先确认一下cin的全部内容。
每取 一个值都验证一下对不对。

#2


1.dlbjl(jd *h,int n) -> dlbjl(jd ** h,int n);
2.cout<<h->data; ->   cout<<h->data << endl;

#3


在你的函数void dlbcd (jd *h)和dlbjl(jd *h,int n),中h 是一形参(只不过是一个指针而已),
你要想返回其中的数值(h),使用二级指针就可以了!

#include "iostream.h"
#include "malloc.h"
#define null 0
typedef struct node
{int data;
struct node *link;
}jd; 
/*计算单链表长度函数*/
void dlbcd (jd **h)
{
cout<<(*h)->data;
jd *p;
p=h;
while (p->link!=null)
{
    cout<<p->data;
    p=p->link;
}

}
/*建立单链表函数*/
dlbjl(jd **h,int n)
{
int i=0,a;
jd *p;
/*建立第一个结点*/
cin>>a;
(*h)->data=a;
(*h)->link=null;
/*前插法插入另外的n-1个结点*/
for (;i<n-1;i++)
{
  int a;
  cin>>a;
  p=(jd*)malloc(sizeof(jd));
  p->data=a;
  p->link=*h;
  (*h)=p;
}
//结点h始终指向单链表的第一个结点
cout<<(*h)->data; 
}
main()
{
  int n;
  jd *h;
  h=(jd*)malloc(sizeof(jd));
  cin>>n;
  dlbjl(&h,n);
  cout<<h->data;
  dlbcd(&h);
}


注意一下书写风格~_~

#4


谢谢各位的指点,根据lightning(lightning)所讲的方法,终于解决了这个我自认为不可理喻的问题,终于明白“如果希望一个函数能改变某个局部变量的值,需要用这个局部变量的地址作为函数的实参”,再次感谢。怎样加分啊?我不会!

#5


终于加上了!以后还要请各位不吝赐教!!!

#1



先确认一下cin的全部内容。
每取 一个值都验证一下对不对。

#2


1.dlbjl(jd *h,int n) -> dlbjl(jd ** h,int n);
2.cout<<h->data; ->   cout<<h->data << endl;

#3


在你的函数void dlbcd (jd *h)和dlbjl(jd *h,int n),中h 是一形参(只不过是一个指针而已),
你要想返回其中的数值(h),使用二级指针就可以了!

#include "iostream.h"
#include "malloc.h"
#define null 0
typedef struct node
{int data;
struct node *link;
}jd; 
/*计算单链表长度函数*/
void dlbcd (jd **h)
{
cout<<(*h)->data;
jd *p;
p=h;
while (p->link!=null)
{
    cout<<p->data;
    p=p->link;
}

}
/*建立单链表函数*/
dlbjl(jd **h,int n)
{
int i=0,a;
jd *p;
/*建立第一个结点*/
cin>>a;
(*h)->data=a;
(*h)->link=null;
/*前插法插入另外的n-1个结点*/
for (;i<n-1;i++)
{
  int a;
  cin>>a;
  p=(jd*)malloc(sizeof(jd));
  p->data=a;
  p->link=*h;
  (*h)=p;
}
//结点h始终指向单链表的第一个结点
cout<<(*h)->data; 
}
main()
{
  int n;
  jd *h;
  h=(jd*)malloc(sizeof(jd));
  cin>>n;
  dlbjl(&h,n);
  cout<<h->data;
  dlbcd(&h);
}


注意一下书写风格~_~

#4


谢谢各位的指点,根据lightning(lightning)所讲的方法,终于解决了这个我自认为不可理喻的问题,终于明白“如果希望一个函数能改变某个局部变量的值,需要用这个局部变量的地址作为函数的实参”,再次感谢。怎样加分啊?我不会!

#5


终于加上了!以后还要请各位不吝赐教!!!