C语言完成链表节点的定义和初始化、查找、销毁等基本操作,再将(3,6,8,9)和(2,5,8,10,12,16)两个非递减的有序链表合并为一个非递增的有序链表,仍然用原来的存储空间,并且要有每步操作的注释。
时间: 2023-10-03 14:04:49 浏览: 68
C语言实现带头结点的链表的创建、查找、插入、删除操作
实现链表节点的定义和初始化、查找、销毁等基本操作,可以参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct ListNode {
int val; // 节点的值
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 初始化链表
ListNode* initList(int val) {
ListNode* head = (ListNode*)malloc(sizeof(ListNode)); // 创建头结点
head->val = val;
head->next = NULL;
return head;
}
// 添加节点
void addNode(ListNode* head, int val) {
ListNode* cur = head;
while (cur->next != NULL) {
cur = cur->next;
}
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
cur->next = newNode;
}
// 查找节点
ListNode* findNode(ListNode* head, int val) {
ListNode* cur = head;
while (cur != NULL) {
if (cur->val == val) {
return cur;
}
cur = cur->next;
}
return NULL;
}
// 销毁链表
void destroyList(ListNode* head) {
ListNode* cur = head;
while (cur != NULL) {
ListNode* tmp = cur->next;
free(cur);
cur = tmp;
}
}
```
接下来,实现将两个有序链表合并为一个非递增的有序链表的代码:
```c
// 合并有序链表
ListNode* mergeLists(ListNode* l1, ListNode* l2) {
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* newHead = NULL;
ListNode* cur = NULL;
// 比较两个链表的节点值,将较小的节点插入新链表中
while (p1 != NULL && p2 != NULL) {
if (p1->val <= p2->val) {
if (newHead == NULL) { // 第一次插入节点
newHead = p1;
cur = newHead;
} else {
cur->next = p1;
cur = cur->next;
}
p1 = p1->next;
} else {
if (newHead == NULL) { // 第一次插入节点
newHead = p2;
cur = newHead;
} else {
cur->next = p2;
cur = cur->next;
}
p2 = p2->next;
}
}
// 将剩余的节点插入新链表
if (p1 != NULL) {
cur->next = p1;
}
if (p2 != NULL) {
cur->next = p2;
}
// 反转链表得到非递增的有序链表
ListNode* prev = NULL;
cur = newHead;
while (cur != NULL) {
ListNode* tmp = cur->next;
cur->next = prev;
prev = cur;
cur = tmp;
}
newHead = prev;
return newHead;
}
int main() {
// 创建两个有序链表
ListNode* l1 = initList(3);
addNode(l1, 6);
addNode(l1, 8);
addNode(l1, 9);
ListNode* l2 = initList(2);
addNode(l2, 5);
addNode(l2, 8);
addNode(l2, 10);
addNode(l2, 12);
addNode(l2, 16);
// 合并两个有序链表为非递增的有序链表
ListNode* newHead = mergeLists(l1, l2);
// 打印新链表
ListNode* cur = newHead;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
// 销毁链表
destroyList(l1);
destroyList(l2);
destroyList(newHead);
return 0;
}
```
运行结果为:`16 12 10 9 8 8 6 5 3 2`。
阅读全文