读书人

关于链表的一个有关问题无法改变值?

发布时间: 2012-08-30 09:55:54 作者: rapoo

关于链表的一个问题,无法改变值??
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可以通过地址访问到函数里面所创建的内容。

读书人网 >C语言

热点推荐