#include <stdio.h>
#include <stdlib.h>
struct node //结点数据类型
{
char data;
struct node *next;
};
void traverse(struct node* head) {
struct node* current = head;
while (current!= NULL) {
printf("%c ", current->data);
current = current->next;
}
printf("\n");
}
void destroy(struct node* head) {
struct node* current = head;
while (current!= NULL) {
struct node* temp = current;
current = current->next;
free(temp);
}
}
struct node* tailinsert(void) {
struct node* head = NULL;
struct node* tail = NULL;
char input;
while (scanf("%c", &input)!= EOF && input!= '\n') {
struct node* newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = input;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
int main()
{
struct node *head=NULL;
head=tailinsert(); //用尾插法创建链表
traverse(head); //遍历链表
destroy(head); //释放资源,销毁链表中所有结点
return 0;
}
以下是对这段代码的分析:
一、功能概述
这段 C 语言代码实现了一个单链表的创建、遍历和销毁功能。通过尾插法创建链表,然后遍历链表输出其中的数据,最后释放链表所占用的内存资源。
二、函数分析
struct node
结构体定义了链表的节点,包含一个字符型数据data
和一个指向下一个节点的指针next
。traverse
函数用于遍历链表,其参数为链表的头指针head
。函数通过循环依次访问链表中的每个节点,并输出节点中的数据。destroy
函数用于销毁链表,释放链表中所有节点所占用的内存空间。函数接受链表的头指针head
,通过循环依次释放每个节点的内存。tailinsert
函数用于通过尾插法创建链表。函数内部使用循环逐个读取输入字符,创建新节点并插入到链表尾部。当输入字符为特定值(如换行符或文件结束符)时,停止创建链表并返回链表的头指针。
三、代码执行流程
- 在
main
函数中,首先定义了一个链表头指针head
并初始化为NULL
。 - 调用
tailinsert
函数创建链表,并将返回的链表头指针赋值给head
。 - 调用
traverse
函数遍历链表并输出其中的数据。 - 调用
destroy
函数销毁链表,释放内存资源。 - 最后,
main
函数返回 0,表示程序正常结束。
四、注意事项
- 在使用尾插法创建链表时,需要确保输入的字符数据是有效的,并且在适当的时候停止输入以避免创建无限长度的链表。
- 在销毁链表时,需要确保遍历完整个链表并释放每个节点的内存,以防止内存泄漏。