一.题目描述描述
牛牛从键盘输入一个长度为 n 的数组,问你能否用这个数组组成一个链表,并顺序输出链表每个节点的值。
输入描述:
第一行输入一个正整数 n ,表示数组的长度
输出描述:
制作一个链表然后输出这个链表的值
示例1
输入:
4 5 4 2 1
复制输出:
5 4 2 1 复制说明: 请实现链表后再遍历输出结果!
二.尾插法
尾插法的特点就是链表数据的顺路可以与你输入的顺序一样,下面用图展现这个过程
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
struct Node {
int data;
struct Node* next;
};
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
fprintf(stderr, "内存分配失败\n");
return 1;
}
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 创建链表
struct Node* head = NULL;
struct Node* tail = NULL;
for (int i = 0; i < n; i++) {
// 创建新节点
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
fprintf(stderr, "内存分配失败\n");
free(arr);
return 1;
}
newNode->data = arr[i];
newNode->next = NULL;
// 插入节点到链表尾部
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
// 遍历链表并输出
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
// 释放链表内存
while (head != NULL) {
struct Node* temp = head;
head = head->next;
free(temp);
}
free(arr);
return 0;
}
三.头插法
头插法得到的链表是与输入的顺序相反的,我要按照输入的顺序输出,就需要在用头插法之前就将数字的顺序转换好,过程如下图所示
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
fprintf(stderr, "内存分配失败\n");
return 1;
}
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 反转数组(为了使用头插法保持顺序)
for (int i = 0; i < n/2; i++) {
int temp = arr[i];
arr[i] = arr[n-1-i];
arr[n-1-i] = temp;
}
// 头插法构建链表
struct Node* head = NULL;
for (int i = 0; i < n; i++) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
fprintf(stderr, "内存分配失败\n");
free(arr);
return 1;
}
newNode->data = arr[i];
newNode->next = head;
head = newNode;
}
// 输出链表
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
// 释放链表内存
while (head != NULL) {
struct Node* temp = head;
head = head->next;
free(temp);
}
free(arr);
return 0;
}