关于链表的一个有关问题,无法改变值?
关于链表的一个问题,无法改变值??
http://topic.csdn.net/u/20120728/21/1ee56666-32b5-452b-a3c8-981f79048fa0.html?72670
在看到上面的帖子的问题,有了以下的回答后,我自己也跑了下程序 改成这样
结果是在Creat里面 L->NULL;不起作用 尽管执行该语句,但是L->next不改变,为oxffffffff;
而且在p->next = L->next;
L->next = p; 这里的L->next = p; 执行了也没用,也就是说L->next 是没法改变的??
但是将代码改为
就可以了 也就是将p=(LinkList)malloc(sizeof(LNode));申请头节点的内存放在外面就可以了
这是为什么呢 是因为在main里面 p没有申请就直接使用了么 可是在里面申请不也可以么
我IDE是codelite,望解答 谢谢
------解决方案--------------------
CreateList(p,10);第一种方法你未申请内存就传入了p,虽然在CreateList(p,10);中申请内存了,但是出了CreateList(p,10);是不会生效的,因为是传的值进去的
------解决方案--------------------
LinkList p;
CreateList(p,10);
p是一个指向无效区域的指针,一般我们会初始化为NULL,
然后CreateList里面的p则是一个拷贝,所以不管函数里面的p怎么变化,外面的p所存储的地址都是不变的,自然也访问不了函数里面p所指向的地址的内容。
可以这样void CreateList(LinkList &L, int n), 或者void CreateList(LinkList *L, int n)
LinkList p;
p=(LinkList)malloc(sizeof(LNode));
CreateList(p,10);
这种之所以可以是因为p是一个有效区域的指针,虽然传进去的是一个p的拷贝,但是外面的p可以通过地址访问到函数里面所创建的内容。
http://topic.csdn.net/u/20120728/21/1ee56666-32b5-452b-a3c8-981f79048fa0.html?72670
在看到上面的帖子的问题,有了以下的回答后,我自己也跑了下程序 改成这样
- C/C++ code
#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; void CreateList(LinkList L, int n) { int i; LNode *p; p=(LinkList)malloc(sizeof(LNode)); if(!L) exit(0); L->next = NULL; for(i=n;i>0;i--) { p=(LNode *)malloc(sizeof(LNode)); if(!p) exit(0); scanf("%d",&p->data); p->next = L->next; L->next = p; } } int main() { LinkList p; CreateList(p,10); return 0; }
结果是在Creat里面 L->NULL;不起作用 尽管执行该语句,但是L->next不改变,为oxffffffff;
而且在p->next = L->next;
L->next = p; 这里的L->next = p; 执行了也没用,也就是说L->next 是没法改变的??
但是将代码改为
- C/C++ code
#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; void CreateList(LinkList L, int n) { int i; LNode *p; if(!L) exit(0); L->next = NULL; for(i=n;i>0;i--) { p=(LNode *)malloc(sizeof(LNode)); if(!p) exit(0); scanf("%d",&p->data); p->next = L->next; L->next = p; } } int main() { LinkList p; p=(LinkList)malloc(sizeof(LNode)); CreateList(p,10); return 0; }
就可以了 也就是将p=(LinkList)malloc(sizeof(LNode));申请头节点的内存放在外面就可以了
这是为什么呢 是因为在main里面 p没有申请就直接使用了么 可是在里面申请不也可以么
我IDE是codelite,望解答 谢谢
------解决方案--------------------
CreateList(p,10);第一种方法你未申请内存就传入了p,虽然在CreateList(p,10);中申请内存了,但是出了CreateList(p,10);是不会生效的,因为是传的值进去的
------解决方案--------------------
LinkList p;
CreateList(p,10);
p是一个指向无效区域的指针,一般我们会初始化为NULL,
然后CreateList里面的p则是一个拷贝,所以不管函数里面的p怎么变化,外面的p所存储的地址都是不变的,自然也访问不了函数里面p所指向的地址的内容。
可以这样void CreateList(LinkList &L, int n), 或者void CreateList(LinkList *L, int n)
LinkList p;
p=(LinkList)malloc(sizeof(LNode));
CreateList(p,10);
这种之所以可以是因为p是一个有效区域的指针,虽然传进去的是一个p的拷贝,但是外面的p可以通过地址访问到函数里面所创建的内容。