首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

链表初始化有关问题

2012-08-26 
链表初始化问题C/C++ code#include stdio.h#include malloc.htypedef char ElemTypetypedef struct n

链表初始化问题

C/C++ code
#include "stdio.h"#include "malloc.h"typedef char ElemType;typedef struct node{    ElemType data;    struct node *next;}LinkList;void InitList(LinkList *L)//初始化单链表{    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;}void main(){    int i;    ElemType e;    LinkList *L;    InitList(L);}
#include "stdio.h"
#include "malloc.h"
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}LinkList;
void InitList(LinkList *L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void main()
{
  int i;
  ElemType e;
  LinkList *L;
  L=(LinkList *)malloc(sizeof(LinkList));
  L->next=NULL;
}
为什么第一个源程序中调用链表初始化函数会出错,而第二个源程序中不调用函数,直接把函数里的代码写在主函数中就可以正常运行?[color=#FF0000][/color]

[解决办法]
C/C++ code
void InitList(LinkList *L)//初始化单链表{    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;}
[解决办法]
C/C++ code
对比下下面两段代码LinkList *L;void InitList(LinkList *L){    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;}int l;void InitInt(int l){    l = 5;} //这个应该知道吧打个比方吧LinkList *L;&L = 0x101此时L的值未知如图0x100+---+     |   |0x101+---+     | ? | --> L  &L = 0x101,L的值未知         0x102+---+     |   |0x103+---+     |   |0x104+---+InitList(L); 只是把L的值(?)传进去,并没有把L的地址(0x101)传进去0x200+---+     |   |0x201+---+     | ? | --> l  &l = 0x201,l的值未知         0x202+---+     |   |0x203+---+     |   |0x204+---+InitInt(l); // 只传递了l的值(?),并没有传地址(0x201)两者是不是很相似呢所以应该怎么改  你懂的
[解决办法]
你在函数里分配内存必须要用指针的指针,只用一个指针的话,是不行的。

编译器要给函数的每一个参数做一个副本,当你修改指针指向的内存空间的值的时候,他能够返回正确的结果,因为指针的副本还是内存地址,当你在函数中分配内存的时候,它做的是把副本的指针指向了新的内存空间了,但原指针是得不到这块内存的。

参考林锐的 《C/C++高质量编程》相关章节
[解决办法]
给void InitList(LinkList *L)传参只是值传递.函数退出后L将被系统回收

可以这样改:
C/C++ code
void InitList(LinkList **L)//初始化单链表{    *L =(LinkList *)malloc(sizeof(LinkList));    (*L)->next=NULL;}
[解决办法]
正确方法如下:
C/C++ code
#include "stdio.h"#include "malloc.h"typedef char ElemType;typedef struct node{    ElemType data;    struct node *next;}LinkList;void InitList(LinkList **L)//初始化单链表{    *L=(LinkList *)malloc(sizeof(LinkList*));    (*L)->next=NULL;}void main(){    int i;    ElemType e;    LinkList *L;    InitList(&L);    L->data = 'A';    printf("linkdata = %c\n",L->data);}
[解决办法]
void InitList(LinkList **L)//初始化单链表
{
*L = NULL;
}
其实这个问题就像,void swap();函数那样,传指针可以实现两个数据的交换,而传数据不可以实现两个数据的交换。传地址是穿的源数据的地址,修改的是源数据;传数据,实际上是传的源数据的副本,修改是源数据的副本,副本是在栈上申请的,函数执行结束后会自动释放,没有返回到调用函数。
你可以使用struct LinkList *InitList(LinkList *L) {...;return L;}然后把你的返回值返回到调用函数。
但是我建议你还是使用我上面的链表的初始方法,你对节点的空间申请都放在创建链表函数内。初始化就是只管初始化。

热点排行