用c语言编写输入无序的元素,分别建立两个有3个结点的逆序单链表(有头结点)(显示排序后的链表),合并两个单链表使之仍然有序,显示合并后的单链表。
时间: 2024-12-02 19:16:54 浏览: 1
在 C 语言中,我们可以首先创建两个逆序链表,然后合并它们。这里是一个简单的步骤说明:
1. **创建逆序链表**:
- 定义结构体 `ListNode`,包含一个整数数据和指向下一个节点的指针。
- 使用循环接收用户输入,每次输入一个数字并插入到链表头部,形成逆序。
```c
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
ListNode* createList(int arr[], int n) {
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
ListNode* current = head;
for (int i = n - 1; i >= 0; i--) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = arr[i];
newNode->next = current;
current = newNode;
}
return head;
}
```
2. **合并两个逆序链表**:
- 定义一个函数 `mergeLists` 来合并两个逆序链表。我们维护两个指针,一个指向第一个链表,另一个指向第二个链表,并始终选择较小的数据。
- 创建一个新的头节点,并将当前较小的数据移动到新链表上。
```c
ListNode* mergeLists(ListNode* list1, ListNode* list2) {
ListNode* result = NULL;
ListNode* temp1 = list1, *temp2 = list2;
if (list1 && !list2) return list1;
else if (!list1 && list2) return list2;
else if (list1->data < list2->data) {
result = list1;
result->next = mergeLists(temp1->next, list2);
} else {
result = list2;
result->next = mergeLists(list1, temp2->next);
}
return result;
}
```
3. **显示合并后的链表**:
- 合并后,遍历合并后的链表,打印每个节点的数据即可。
```c
void printList(ListNode* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
// 示例
int main() {
int arr1[] = {5, 3, 7};
int arr2[] = {9, 2, 6};
ListNode* list1 = createList(arr1, sizeof(arr1)/sizeof(arr1[0]));
ListNode* list2 = createList(arr2, sizeof(arr2)/sizeof(arr2[0]));
ListNode* mergedList = mergeLists(list1, list2);
printf("Sorted and merged linked list: ");
printList(mergedList);
// 清理内存
// ...
return 0;
}
```
阅读全文