用c语言写出这个问题的代码
时间: 2024-10-15 14:20:57 浏览: 31
以下是一个简单的C语言代码示例,用于实现头结点的单链表差集运算。请注意,这里并没有真正的删除操作,因为我们是在原地更新A链表。实际应用中,可能需要借助临时变量或者更复杂的链表操作来实现。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建链表节点
ListNode* createNode(int val) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 差集运算函数
void differenceList(ListNode** A, ListNode** B) {
if (*A == NULL || *B == NULL) return; // 如果任一链表为空,返回
ListNode *p1 = *A, *p2 = *B;
while (p1 && p2) {
if (p1->val > p2->val) {
p1 = p1->next;
} else {
if (p1->val == p2->val) {
p1 = p1->next; // 忽略相等的元素
} else { // 删除A链表中大于B链表元素
ListNode *prev = p1->next;
prev->next = p1->next;
free(p1);
p1 = prev;
}
}
p2 = p2->next;
}
// 如果B链表还有剩余,将A链表中剩余的节点依次加入结果
while (p1) {
printf("%d ", p1->val); // 输出结果
p1 = p1->next;
}
}
// 示例链表初始化
void initLinkedList(ListNode** list, int* arr, int size) {
for (int i = 0; i < size; i++) {
*list = createNode(arr[i]);
*list = (*list)->next;
}
}
int main() {
int A[] = {5, 9, 12, 18};
int B[] = {4, 7, 12, 16, 18};
int lenA = sizeof(A) / sizeof(A[0]);
int lenB = sizeof(B) / sizeof(B[0]);
ListNode *A_head = NULL, *B_head = NULL;
initLinkedList(&A_head, A, lenA);
initLinkedList(&B_head, B, lenB);
differenceList(&A_head, &B_head);
return 0;
}
```
此代码首先创建了两个链表`A_head`和`B_head`,然后通过`differenceList`函数计算差集,最后输出结果。注意,这只是一个简化的版本,实际操作中可能需要考虑链表的内存管理、错误处理等问题。
阅读全文