引入
我们学习了用头插法和尾插发创建一个单链表,今天我们在学习如何删除整个单链表。
删除整个单链表
其实就是再内存中将它释放掉,留出空间给其它软件使用。
整表删除思路:
- 声明结点 p 和 q
- 第一个结点给 p,第二个结点给 q
- 释放完 p,将 q 指向的给 p
- 释放完 q,将 p 指向的给 q
- 循环执行,直到完全释放完毕
代码实现
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student{
int num;
char name[20];
float score;
struct Student *next;
};
struct Student *create(void){
struct Student *a,*b,*head;
a=(struct Student *)malloc(LEN); //创建结点
head=(struct Student *)malloc(LEN);
b=head; //b 是指向尾部的节点
printf("请输入学生信息:\n");
scanf("%d %s %f",&a->num,a->name,&a->score);
while(a->num!=0){
b->next=a;
b=a;
a=(struct Student *)malloc(LEN);
scanf("%d %s %f",&a->num,a->name,&a->score);
}
b->next=NULL;
return head;
}
void print(struct Student * p){
p=p->next;
while(p!=NULL){
printf("%d号%s的成绩是:%3.1f\n",p->num,p->name,p->score);
p=p->next;
}
}
void delete_p(struct Student * p){
struct Student *a,*b;
a=p->next; //先让 a 指向第一个结点
while(a){
b=a->next; //b 记住 a 的下一个结点
free(a); //释放 a
a=b; //a 成为第下一个结点
}
p->next=NULL;
}
int main(){
struct Student* stu_p;
stu_p=create();
print(stu_p);
delete_p(stu_p);
print(stu_p);
return 0;
}
其实就是让 a 在中间过渡了一下。
伪代码实现
#include <stdio.h>
#include <time.h>
#define ERROR 0
#define OK 1
typedef int Elemtype
struct Node{
Elemtype data;
struct Node * next;
};
//构建单链表
typedef struct Node* LinkList;
Status ClearList(LinkList *L){
LinkList *a,*b;
a=L->next;
while(a){
b=a->next;
free(a);
a=b;
}
L->next=NULL;
return OK;
}
非常简单~
一个先留着线索,另一个开始删,然后根据线索再找到下一个。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。
评论