好像是大话数据结构上的段子啊,我从昨天到今天也研究了这个问题,给你看看:
调用malloc函数初始化一个线性链表。
程序1如下:
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node * next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList *L)
{ *L=(LinkList)malloc(sizeof(Node));
if(!(*L))
return 0;
(*L)->next=NULL;
return 1;
}
void main()
{ LinkList L;
InitList(&L);
}
难点:在VC6.0中,要使用malloc函数,需要的头文件是
"stdlib.h" 。
请分析如下的程序2是否正确:
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node * next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList L)
{ L=(LinkList)malloc(sizeof(Node));
if(!L)
return 0;
L->next=NULL;
return 1;
}
void main()
{ LinkList L;
InitList(L);
}
分析:首先分析如下的程序:
#include<stdio.h>
void dayin(char x)
{x=getchar();}
void main()
{char L='a';
dayin(L);
printf("%c",L);
}
调用dayin()函数之时,就内存中开辟一个名称为x的临时变量,将L的值a赋值给x,然后x又通过getchar函数获得了一个新值(该值将存放在x中的原来的值a覆盖掉),调用完成后,释放掉x,而L中的值仍然为a。那么这个程序应该怎么改哪?方法是运用指针(运用指针方法破解这种问题谭浩强的书C程序设计(第三版)中讲过)。其实不采用指针而采用数组、全局变量、return函数都可以。
修改后的程序如下:
#include<stdio.h>
void dayin(char * x)
{*x=getchar();}
void main()
{char L='a';
dayin(&L);
printf("%c",L);
}
据此,我们可以分析程序2:
调用InitList函数时,内存中开辟一个临时指针变量L(类型是指向结构体类型),然后将实参L的值传递给形参L,然后调用malloc函数获得一个新指针,形参L的内存中原先存放的实参L的值被新指针覆盖掉,执行完InitList函数调用后,释放形参L的内存空间,而实参L的值被没有变化。因此,程序2是无法完成单链表的初始化的。因此应该采用程序1的方法,传递变量的指针(这种方式要记住,常用。谭浩强的C程序设计第三版讲过)。
参考文献:[1].程杰.《大话数据结构》第三章所带源程序:"02线性表链式存储_LinkList.c"。
[
本帖最后由 suishuhao 于 2012-10-12 21:22 编辑 ]