C语言创建链表错误之通过指针参数申请动态内存实例分析
本文实例讲述了C语言创建链表中经典错误的通过指针参数申请动态内存,分享给大家供大家参考之用。具体实例如下:
#include<stdio.h>
#include<stdlib.h>//用malloc要包含这个头文件
typedefstructnode
{
intdata;
structnode*next;//这个地方注意结构体变量的定义规则
}Node;
voidcreateLinklist(Node*pHder,intlength)
{
inti=0;
Node*pTail=NULL;
Node*pTemp=NULL;
printf("create\n");
for(i=0;i<length;i++)
{
pTemp=(Node*)malloc(sizeof(Node));//本来以为错误在这个地方,原来是理解错了
/*这句话是给pTemp重新赋值,所以在for里边和for外边定义pTemp是无所谓的*/
pTemp->data=i*10;
pTemp->next=NULL;
if(NULL==pHder)
{
pHder=pTemp;//错误的关键
}
else
{
pTail->next=pTemp;
}
pTail=pTemp;
}
}
voidprint(Node*pHeader)
{
Node*p=pHeader;
printf("print\n");
while(p)
{
printf("%4d",p->data);
p=p->next;
}
putchar('\n');
}
intmain(void)
{
Node*pHeader=NULL;//C和C++中判断指针为空都是用NULL宏(全大写)
createLinklist(pHeader,10);//这是个很典型的错误,错误的原因就在这
/*pHeader是一个Node*型的变量*/
/*既然是个变量,那么在传递参数的时候,编译器必然会给这个变量制作一个临时副本*/
/*假设这个临时副本是_pHeader_*/
/*在刚刚传递进去的时候,pHeader和_pHeader_是相同的*/
/*但是在动态申请内存之后,_pHeader_指向了新的地址[[注意]]它不是在修改_pHeader_指向的内容的值,而是修改_pHeader_所指向的地址*/
/*而此时pHeader仍然指向原来的地址*/
/*所以,其实在createLinklist的整个运行过程中pHeader都没有受到影响*/
print(pHeader);
return0;
}
上述实例以注释的形式对易错点进行了详细的分析,相信不难理解。希望本文所述对大家C程序数据结构与算法设计的学习有所帮助。