用c语言写一算法,实现正位序输入 n 个数据元素的值,建立带头结点的单链表,要求时间复杂度是线性阶的。
时间: 2024-10-16 11:16:42 浏览: 38
数据结构:不带头结点单链表的实现及其一些基本操作.cpp
5星 · 资源好评率100%
在C语言中,我们可以使用线性遍历的方式来实现正向顺序输入n个数据元素并建立单链表。以下是简单的步骤:
```c
#include <stdio.h>
#include <stdlib.h> // 包含malloc函数
// 定义链表节点结构体
typedef struct Node {
int data; // 节点的数据域
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建新节点并分配内存
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 分配空间
if (newNode != NULL) {
newNode->data = value;
newNode->next = NULL;
}
return newNode;
}
// 输入n个元素并将它们添加到链表中
void insertInOrder(int n, Node** headRef) {
Node* current = *headRef;
for (int i = 0; i < n; i++) {
int input;
printf("请输入第 %d 个数: ", i + 1);
scanf("%d", &input);
// 如果链表为空或者当前节点值小于输入值,则将新节点插入
if (current == NULL || current->data > input) {
current = createNode(input); // 创建新节点
*headRef = current; // 将头节点指向新节点
} else {
Node* temp = current; // 遍历找到正确位置
while (temp->next != NULL && temp->next->data < input) {
temp = temp->next;
}
current->next = createNode(input); // 新节点连接到适当位置
current = current->next; // 更新当前节点为新节点
}
}
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
int n;
printf("请输入链表的长度: ");
scanf("%d", &n);
Node* head = NULL; // 初始化链表头节点
insertInOrder(n, &head);
printf("链表按照输入顺序是: \n");
printList(head);
return 0;
}
```
这个程序首先创建一个空链表,然后循环读取用户输入,每次读取都按顺序检查是否应该插入新节点。由于我们仅对每个元素进行一次操作,并且整个过程只遍历了一次元素,所以时间复杂度是O(n),满足线性阶的要求。
阅读全文