对Delete指针 和 链表中删除操作的一些理解

#include

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,也就是修改了指针的值,必须使用二级指针的传参方式。(否则,就会导致头指针指向的内存被释放了,但是地址却没有发生改变,还是指向原来的那块内存)

你可能感兴趣的:(c++学习笔记,奇怪的问题)