《大话数据结构》学习体悟
关于结构体和指针的使用
1.结构体的申明
typedef struct Node
{
int data;
struct Node *next;
}Node ,* LinkList;
2.创建结构体指针变量,指针没有初始化,指针引用结构体成员会报错。
LinkList L,P; //定义结构体指针
L->data //指针未初始化,程序报错
L=P; //初始化结构体指针
L->data //OK
原因是指针在初始化之前,指针只知道的指向的是某个类型,指针的值不确定(指针的地址是确定的,声明指针的时候就开辟了内存空间),引用指针,起指向的内容不确定(指针在初始化之前,不能取出指针的值)。
3.调用函数,传递参数时,切记传递进来的参数在函数里面是一个临时的新的变量,新变量的值=传递的参数值,函数结束后,临时变量会被释放掉,只有通过指针才能够改变参数值。
LinkList InitList(LinkList L)
{
L=(LinkList)malloc(sizeof(Node));
printf("初始化函数建立的头结点地址:%p\n",L);
if(!L)
return ERROR;
L->next=NULL; /* 指针域为空 */
return OK;
}
这里初始化函数的作用是无效的,函数里面L的值发生了改变,函数外面L的值不变。
正确的做法是:
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!L) /* 存储分配失败 */
return ERROR;
(*L)->next=NULL; /* 指针 域为空 */
printf("线性表的地址:%p\n",*L);
return OK;
}