描述
建立一个升序链表并遍历输出。
输入描述:
输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。
示例1
输入:
4 3 5 7 9
复制输出:
3 5 7 9
分析
如果不用链表则本题较为简单,只需使用qsort函数将数组元素进行升序排列即可。
#include <stdio.h>
#include <stdlib.h>
int cmp(int* a, int* b) {//排为升序数组
return *a - *b;
}
int main() {
#define NUMSIZE 1000
int a, b;
int n;
int num[NUMSIZE];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
qsort(num, n, sizeof(int), cmp);
for (int i = 0; i < n; i++) {
printf("%d ", num[i]);
}
return 0;
}
答案
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 插入节点到升序链表
struct ListNode* insertNode(struct ListNode* head, int val) {
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = NULL;
if (head == NULL || val < head->val) {
newNode->next = head;
return newNode;
}
struct ListNode* curr = head;
while (curr->next != NULL && val > curr->next->val) {
curr = curr->next;
}
newNode->next = curr->next;
curr->next = newNode;
return head;
}
// 遍历链表并输出
void traverseList(struct ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
struct ListNode* head = NULL;
for (int i = 0; i < n; i++) {
int val;
scanf("%d", &val);
head = insertNode(head, val);
}
traverseList(head);
// 释放链表节点内存
struct ListNode* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
return 0;
}
详解
带头结点的单链表实现:
-
链表节点结构体定义:
struct ListNode { int val; struct ListNode *next; };
这个结构体定义了链表的节点,每个节点包含一个整数值
val
和一个指向下一个节点的指针next
。 -
插入节点到升序链表的函数
insertNode
:struct ListNode* insertNode(struct ListNode* head, int val) { // 创建新节点 struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->val = val; newNode->next = NULL; // 如果链表为空或者新节点的值比头节点的值小,则将新节点插入到链表头部 if (head == NULL || val < head->val) { newNode->next = head; return newNode; } // 否则,在升序链表中找到合适的位置插入新节点 struct ListNode* curr = head; while (curr->next != NULL && val > curr->next->val) { curr = curr->next; } newNode->next = curr->next; curr->next = newNode; return head; }
这个函数接受一个链表头指针
head
和一个整数值val
,将整数值val
插入到升序链表中的合适位置。如果链表为空或者新节点的值小于头节点的值,则将新节点插入到链表头部;否则,在升序链表中找到合适的位置插入新节点。 -
遍历链表并输出的函数
traverseList
:void traverseList(struct ListNode* head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); }
这个函数接受一个链表头指针
head
,遍历整个链表并输出其中的每个节点的值。 -
主函数
main
:主函数中使用一个循环来处理多组测试数据。对于每一组测试数据,首先创建一个空链表,然后读入输入的整数并依次插入到链表中,接着遍历链表并输出其中的元素。最后,在程序结束时,释放链表节点所占用的内存以防止内存泄漏。