编写一个程序Split_你的名字拼音全拼.c,已给定值x为基准将单链表分割为两部分, 所有小于x的结点排在大于或等于x的结点之前,并进行时间复杂度的分析。 提示:利用单链表头插法和尾插法建表实现。
时间: 2024-10-08 18:23:29 浏览: 38
首先,我将以"王五"为例,编写一个名为`Split_Wangwu.c`的程序,该程序会接收用户输入的一个整数`x`作为基准,然后将链表中的节点按照大小关系分为两部分:小于`x`的节点放在大于等于`x`的节点前面。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
struct Node* next;
} Node;
Node* createNode(int val) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->value = val;
newNode->next = NULL;
return newNode;
}
// 插入节点到链表的头部
void insertAtHead(Node** head, int val) {
Node* newNode = createNode(val);
newNode->next = *head;
*head = newNode;
}
// 插入节点到链表的尾部
void insertAtTail(Node** head, int val) {
Node* newNode = createNode(val);
if (*head == NULL) {
*head = newNode;
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
// 分割链表并返回两个新的链表头部
Node** splitList(Node* head, int x) {
Node* smaller_head = NULL;
Node* larger_head = NULL;
Node* current = head;
while (current != NULL) {
if (current->value < x) {
insertAtHead(&smaller_head, current->value);
} else {
insertAtTail(&larger_head, current->value);
}
current = current->next;
}
return (Node**)malloc(sizeof(Node*) * 2); // 分配空间保存两个链表头部
}
int main() {
int x, input;
printf("请输入一个整数x: ");
scanf("%d", &x);
Node* list = NULL; // 示例链表,可以自定义生成
// ...(这里添加链表初始化和填充数据)
Node** result = splitList(list, x);
printf("分割后的链表如下:\n");
Node* smaller_list = result[0];
while (smaller_list != NULL) {
printf("%d ", smaller_list->value);
smaller_list = smaller_list->next;
}
printf("\n");
Node* larger_list = result[1];
while (larger_list != NULL) {
printf("%d ", larger_list->value);
larger_list = larger_list->next;
}
printf("\n");
free(result); // 释放内存
return 0;
}
```
时间复杂度分析:
- 创建节点的时间复杂度为O(1),因为固定大小的结构体。
- 在`splitList`函数中,遍历整个链表一次,所以时间复杂度为O(n),其中n为链表长度。插入操作(头插法和尾插法)都是常数时间操作,不会影响总时间复杂度。
总的来说,这个程序的时间复杂度是线性的。
阅读全文