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

tech2022-11-27  108

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

最新回复(0)