void DestroyList (LinkList head)
时间: 2024-05-14 09:17:23 浏览: 15
该函数的作用是销毁链表,释放链表中的所有节点所占用的内存空间。函数的参数 head 是链表的头指针。
函数的实现过程如下:
1. 定义两个指针,p 和 q,分别指向链表的头节点和第一个节点。
2. 循环遍历链表,直到链表末尾。
3. 在循环中,将 p 指向 q 所指向的节点,然后将 q 指向下一个节点。接着释放 p 所指向的节点的内存空间。
4. 将 p 和 q 指向下一个节点。
5. 重复步骤 3 和 4,直到遍历到链表末尾。
6. 最后释放链表头节点的内存空间,并将头指针设为 NULL。
函数的代码实现如下:
```
void DestroyList(LinkList head) {
ListNode *p = head, *q = head->next;
while (q != NULL) {
p = q;
q = q->next;
free(p);
}
free(head);
head = NULL;
}
```
相关问题
void DestroyList(LinkList *L) { LinkList q; while (*L) { q = (*L)->next; free(*L); //释放头结点 *L = q; //L指向原首元节点,实现头结点 } }
这是一个销毁带头结点的单链表的函数,函数名为DestroyList,参数为LinkList *L,其中LinkList是指向单链表结点的指针类型。
函数实现步骤为:
1. 定义结点指针q,用于保存当前结点的下一个结点;
2. 当*L不为空时,执行循环;
3. 将q指向*L的下一个结点,保存其地址;
4. 释放*L所指向的结点,即头结点;
5. 将*L指向q所指向的结点,即原首元结点,实现头结点的删除。
该函数的作用是销毁一个带头结点的单链表,先释放头结点,再释放每个结点,最后将头指针指向NULL。
补齐以下代码#include"stdio.h" #include"stdlib.h" typedef struct node{ char data; struct node *next; }Node; void creatList(Node * head); int delByPos(Node *h,int pos); void output(Node *h); void destroyList(Node *h); main() { Node *head=(Node *)malloc(sizeof(Node)); //创建头结点,不存放有效数据 head->next=NULL; int pos; //尾插法创建链表 creatList( head); //输出链表 output(head); //输入删除数据信息 scanf("%d",&pos); //删除数据,成功则再输出链表,失败则报错 if(delByPos(head,pos)) output(head); else printf("delete by pos failed!\n"); //销毁链表 destroyList(head); } @@1 @@1
代码中缺少函数 `creatList`,需要补充。
以下是完整代码:
```
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
char data;
struct node *next;
}Node;
void creatList(Node *head);
int delByPos(Node *h, int pos);
void output(Node *h);
void destroyList(Node *h);
int main() {
Node *head = (Node *)malloc(sizeof(Node)); // 创建头结点,不存放有效数据
head->next = NULL;
int pos;
// 尾插法创建链表
creatList(head);
// 输出链表
output(head);
// 输入删除数据信息
scanf("%d", &pos);
// 删除数据,成功则再输出链表,失败则报错
if (delByPos(head, pos))
output(head);
else
printf("delete by pos failed!\n");
// 销毁链表
destroyList(head);
return 0;
}
void creatList(Node *head) {
Node *p = head;
char data;
printf("请输入字符,以#结束:\n");
scanf("%c", &data);
while (data != '#') {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
p->next = newNode;
p = p->next;
scanf("%c", &data);
}
}
int delByPos(Node *h, int pos) {
Node *p = h;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || p->next == NULL) {
return 0;
}
Node *q = p->next;
p->next = q->next;
free(q);
return 1;
}
void output(Node *h) {
Node *p = h->next;
while (p != NULL) {
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
void destroyList(Node *h) {
Node *p = h;
while (p != NULL) {
Node *q = p->next;
free(p);
p = q;
}
}
```