typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}SLNode;
/*链表初始化*/
void ListInitiate(SLNode**head)/*为什么这里要把head设成指针的指针?*/
{
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)
exit(1);
(*head)->next=NULL;
}
/*撤销单链表,释放空间*/
void Destroy(SLNode **head)/*为什么这里要把head设成指针的指针?*/
{
SLNode *p,*p1;
p=*head;//这里的P开始是指向头节点吗?
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
*head=NULL;
}
/*应该使用指针的指针,因为指针参数表面上不同于值拷贝,但内部对于4字节的指针本身值还是值拷贝的。
若head仅是指针,假设(head)=1234,而1234是第一个头Node的内存地址;
那么调用 ListInitiate(SLNode *head):则会把1234作为实参,ListInitiate函数内部再拷贝一份形参,
函数内部malloc分配的新内存赋予了形参head,如(形参head=5678),但不会对实参(head=1234)产生影响;
可以参考:*/
/*先要理解什么是指针传值,先看看下列说明,将你的函数对照一下,就知道是哪里出问题了。 */
void GetMemory(char*p,int num) //假定形参p的地址1234
{
char*t =(char*)malloc(sizeof(char)*num); //假定申请的空间是3001-3200;
p = t; //在1234里存放3001
} // 1234临时空间收回 调用变化丢失 3001成孤指针
-------------------------
void GetMemory(char**p, int num) //假定形参p的地址1234 ===副本
{
char*t =(char*)malloc(sizeof(char)*num); //假定申请的空间是3001-3200;
*p = t; //在1234指向的地方存放3001
} // 1234临时空间收回 调用变化丢失,但对应1234指向地址数据保留 可后续读出
-------------------------
void GetMemory(char*&p,int num) //直接使用形参p代表实参的地址,假定是1234
{
char*t = (char*)malloc(sizeof(char)*num); //假定申请的空间是3001-3200;
p = t; //在1234里存放3001
} // 1234地址空间不收回,变化不丢失,3001可以读出
单向链表指针头结点的修改
最新推荐文章于 2023-04-07 11:02:16 发布