//本程序使用前插法建立单链表并求其长度
#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;
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);
}
注意一下书写风格~_~
你要想返回其中的数值(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;
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);
}
注意一下书写风格~_~
你要想返回其中的数值(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
终于加上了!以后还要请各位不吝赐教!!!