数据结构 | 头插法创建单链表、遍历链表、删除链表 | C语言代码

题目:

        输入一系列自然数(0和正整数),输入-1时表示输入结束。按照输入的顺序,用头插法建立单链表,并遍历所建立的单链表,输出这些数据。注意 -1 不加入链表。

输入格式:

        第一行是一个正整数k,表示以下会有k组测试数据。

        每组测试数据是一系列以空格隔开的自然数(0和正整数)。数列末尾的 -1 表示本组测试数据结束。按照输入的顺序,用头插法建立单链表,并遍历所建立的单链表,输出这些数据。注意 -1 不加入链表。

输出格式:

        对于每组测试数据,输出链表中各节点的数据域。每个数据后有一个空格。每组测试数据的输出占1行。

输入样例:

3

1 2 3 4 5 -1

30 20 10 -1

4 2 2 1 1 2 0 2 -1

输出样例:

5 4 3 2 1

10 20 30

2 0 2 1 1 2 2 4

代码:

#include <stdio.h>
#include <stdlib.h>

// 定义单链表节点结构
struct Node {
    int data; // 数据域
    struct Node* next; // 指针域
};

// 创建链表的函数
struct Node* createLinkedList() {
    struct Node* head = NULL;
    int value;
 	
 	// 输入链表元素
    while (1) {
        scanf("%d", &value);
        
		// 判断是否插入节点
        if (value == -1) {
            break;
        }

		// 头插法
        struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
        newNode->data = value;
        newNode->next = head;
        head = newNode;
    }

    return head;
}

// 遍历链表
void traverseAndPrint(struct Node* head) {
    struct Node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

// 删除链表释放内存
void deleteLinkedList(struct Node* head) {
    struct Node* current = head;
    while (current != NULL) {
        struct Node* temp = current;
        current = current->next;
        free(temp);
    }
}

int main() {
	// 输入链表节点个数
    int k;
    scanf("%d", &k);

	// 输入元素
    for (int i = 0; i < k; i++) {
        struct Node* head = createLinkedList();
        traverseAndPrint(head);
        deleteLinkedList(head);
    }

    return 0;
}

### 回答1: 头插法创建单链表头插法是指在链表的头部插入新节点,从而创建链表。具体步骤如下: 1. 定义一个头节点,将其指针域置为空。 2. 读入第一个节点的数据,创建一个新节点,并将头节点的指针域指向该节点。 3. 读入第二个节点的数据,创建一个新节点,并将该节点的指针域指向头节点的下一个节点,再将头节点的指针域指向该节点。 4. 重复步骤3,直到读入所有节点的数据。 遍历链表遍历链表是指按照一定顺序依次访问链表中的每个节点。具体步骤如下: 1. 从头节点开始,依次访问每个节点。 2. 对于每个节点,输出其数据域的值。 3. 如果该节点的指针域不为空,将指针域指向的下一个节点作为当前节点,重复步骤2;否则结束遍历删除链表删除链表是指将链表中的所有节点都删除,释放内存空间。具体步骤如下: 1. 从头节点开始,依次访问每个节点。 2. 对于每个节点,释放其内存空间。 3. 如果该节点的指针域不为空,将指针域指向的下一个节点作为当前节点,重复步骤2;否则结束删除。 ### 回答2: 创建单链表的“头插法”是指,在链表的头部插入新节点的方法。其步骤具体如下: 1. 定义链表节点结构体; 2. 定义一个头节点指针,其初始值为NULL,用于标记链表的开始; 3. 依次输入每个新节点,并且把这个新节点加到链表的头部; 4. 将头节点指针更新为新节点。 头插法的好处在于,需要进行的间和空间复杂度都较为优秀。此外,头插法创建和后面的操作都十分简洁明了,使用起来十分方便。 对于遍历链表,需要从头节点开始依次遍历整条链表,直到尾节点。节点遍历,可以将其每个节点后继指针指向下一个节点的地址,循环进行每个节点查找,当查找到末尾节点,返回所有节点。 删除链表,需要遍历整个链表以定位需要删除的节点。删除节点的步骤包括: 1. 定位需要删除节点的前一个节点; 2. 将前一个节点的指针指向下一个节点,跳过需要删除的节点; 3. 释放需要删除的节点所占用的空间。 通过这三个步骤,就可以实现链表节点的删除。需要注意的是,在获取需要删除的节点前,必须通过遍历整个链表找到它的前一个节点,否则将无法对目标节点进行删除操作。 因此,单链表头插法创建方法、遍历方法和删除方法都是比较基础的,掌握它们可以帮助我们更好地理解和应用单链表结构。 ### 回答3: 头插法创建单链表头插法是一种插入节点的方法,它可以在链表的头部直接插入新的节点,使得新的节点成为链表的第一个节点,而链表的原有节点依次挤压到后面。因为头插法单链表的头部开始构链表,所以新创建的节点往往会先成为链表的第一个节点,从而使得链表顺序和插入的顺序相反。 例如,我们想要创建一个单链表,并把数列{1,2,3,4,5}加入到链表中。我们可以按照头插法的规则,先构头节点,然后依次将数列中的元素插入到链表的头部。具体的步骤如下: 1. 构头节点,将头节点的指针域置空。 2. 依次将数列中的元素插入到链表的头部,插入的过程包括以下几个步骤: (1) 申请一个节点的空间,将数列中的元素赋值给该节点,将该节点的指针域指向链表的头部节点; (2) 将链表的头节点指针指向新创建的节点。 3. 依次重复步骤2,直到将数列中的所有元素都插入到链表中。 当我们完成以上的步骤之后,就能够成功创建一个包含数列{1,2,3,4,5}的单链表了。 遍历链表: 在遍历链表,我们要从链表的头部开始依次遍历每个节点,并输出节点的值。因为单链表的节点只记录了下一个节点的地址,所以我们只能使用循环的方式来遍历链表。 例如,我们想要遍历刚刚创建链表,输出数列{1,2,3,4,5}。我们可以按照以下步骤进行遍历: 1. 从链表的头节点开始,依次遍历各个节点。 2. 对每个节点,输出节点所包含的元素。 3. 将指针指向下一个节点,重复上述步骤,直到遍历链表的结尾。 当我们完成以上的步骤之后,就能够成功遍历链表并输出所有的元素了。 删除链表: 当我们需要删除一个单链表,我们需要依次删除链表中的所有节点,然后释放节点的内存空间。因为单链表中的每个节点只记录了下一个节点的地址,所以我们需要使用循环的方式逐个删除节点。 例如,我们想要删除刚刚创建链表,释放其内存空间并将其删除。我们可以按照以下步骤进行删除: 1. 从链表的头节点开始,依次删除各个节点。 2. 对每个节点,先将该节点的指针域保存在一个临变量中,然后释放该节点的内存空间。 3. 将指针指向下一个节点,重复上述步骤,直到删除链表的结尾。 4. 最后,释放链表的头节点的内存空间。 当我们完成以上的步骤之后,就能够成功删除链表并释放内存空间了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值