设计算法(类C语言描述) 将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。
时间: 2024-10-14 15:15:36 浏览: 83
链表-使用C语言实现带头结点的单链表.zip
算法描述(用C语言):
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val; // 节点值
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 创建新节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (newNode != NULL) {
newNode->val = val;
newNode->next = NULL;
}
return newNode;
}
// 分解链表函数
void splitList(ListNode* head, ListNode** result) {
ListNode* current = head;
ListNode* negativeHead = NULL;
ListNode* positiveHead = NULL;
while (current != NULL) {
if (current->val < 0) {
if (negativeHead == NULL) {
negativeHead = current;
} else {
negativeHead->next = current;
}
} else {
if (positiveHead == NULL) {
positiveHead = current;
} else {
positiveHead->next = current;
}
}
current = current->next;
}
*result = negativeHead;
negativeHead->next = NULL; // 防止形成环
if (positiveHead != NULL) {
*result = positiveHead;
}
}
int main() {
// 初始化链表A...
// ...
ListNode* B = NULL; // 存储负数链表头
ListNode* C = NULL; // 存储正数链表头
splitList(head_of_A, &B);
splitList(head_of_A, &C);
printf("分解后的链表B: ");
printLinkedList(B);
printf("\n分解后的链表C: ");
printLinkedList(C);
return 0;
}
// 辅助函数:打印链表
void printLinkedList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
```
阅读全文