#include<iostream>
using namespace std;
typedef struct Node{
char data;
Node* next;
}Node,*LinkList; //链表结构单元的声明
void InitList(LinkList* L) //参数是链表结构单元的二级指针 初始化函数没有返回值
{
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
void create_From_Head(LinkList L) //头插法建立链表
{
Node* s;
char c;
int flag = 1;
while (flag)
{
cin >> c;
if (c != '#')
{
s = (LinkList)malloc(sizeof(Node));
s->data = c;
s->next = L->next;
L->next = s;
}
else flag = 0;
}
}
void print(LinkList L)
{
LinkList temp = L->next;
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
cout << "End of the total run" << endl;
}
void deList(LinkList *L)
{
LinkList q,p = *L;
while (p != NULL)
{
q = p->next;
delete p; // delete一个指针是释放其指向的内存区域 指针的值就会变成一个随机值 (野指针)
// 上文是错误的理解 delete指针只是将指针指向的内存进行了回收 这块内存可以被重新分配而被改写 但是指针的值并不会变成野指针 还是指向那块地址
p = q;
}
*L = NULL; //头结点指向的内存已经都给扬了 可以delete头指针
//在函数中修改一个指针的值 要使用二级指针
//所有的结点都被delete了一次 所有的指针指向的内存都被释放了一次 这一系列的指针都成为了野指针
}
int main(void)
{
LinkList List, * L = &List;
InitList(L); //初始化指针是修改指针的值 必须使用双指针否则 就会在初始化函数里面被创建一个副本 无法将修改真正实现
List->data = 'H';
create_From_Head(List);
print(List);
printf("%p %c\n",List,List->data);
deList(&List); //delete后指针的值不会发生改变
//单独的delete函数是对一级指针的操作
InitList(L);
create_From_Head(List);
print(List);
return 0;
在初始化的操作中,是给头指针(空的,里面没有数据,只有一个指针有值),赋一个地址,是修改指针的值,必须采用二级指针的传参方式,否则在函数中就是使用的一个副本进行值得传递。
同样的在删除操作中,delete函数是将一个指针所指向的内存所释放,并不会修改指针的值,所以删除函数中的delete操作可以使用一级指针,但是在释放头结点的时候,为了避免利用头指针访问一个被释放了的不可访问的内存,必须将头指针的值修改为NULL,也就是修改了指针的值,必须使用二级指针的传参方式。(否则,就会导致头指针指向的内存被释放了,但是地址却没有发生改变,还是指向原来的那块内存)