请用C语言实现这个代码
时间: 2024-10-29 07:11:09 浏览: 9
爱心代码c语言实现的爱心代码资料.zip
为了用C语言实现这个题目,我们可以创建一个结构体表示链表节点,以及一些函数来创建链表、插入节点、删除节点和输出链表。以下是简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct ListNode {
int val; // 键值
struct ListNode* next; // 指向下一个节点
struct ListNode* dup; // 指向重复节点链表
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
newNode->dup = NULL;
return newNode;
}
// 插入节点到链表
void insertToList(ListNode** head, ListNode* node) {
if (*head == NULL) {
*head = node;
} else {
ListNode* curr = *head;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = node;
}
}
// 删除重复节点
void deleteDuplicates(ListNode** head, ListNode** dupHead) {
ListNode* curr = *head;
ListNode* dupCurr = *dupHead;
while (curr != NULL && dupCurr != NULL) {
if (curr->val == -dupCurr->val) {
free(curr);
curr = curr->next;
dupCurr = dupCurr->next;
} else {
curr = curr->next;
}
}
*dupHead = dupCurr;
}
// 输出链表
void printList(ListNode* head) {
ListNode* curr = head;
while (curr != NULL) {
printf("%d ", curr->val);
curr = curr->next;
}
printf("\n");
}
int main() {
ListNode* listHead = NULL;
ListNode* dupHead = NULL;
// 初始化和插入示例数据
insertToList(&listHead, createNode(21)); // 00100 21
insertToList(&listHead, createNode(-15)); // 23854 -15
insertToList(&listHead, createNode(15)); // 87654 15
insertToList(&listHead, createNode(-15)); // 00000 -15
insertToList(&listHead, createNode(21)); // 又遇到 00100 21,重复
insertToList(&listHead, createNode(-7)); // 99999 -7
// 删除重复节点
deleteDuplicates(&listHead, &dupHead);
// 输出去重后的链表
printList(listHead);
// 输出被删除的重复链表
if (dupHead != NULL) {
printf("Duplication chain: ");
printList(dupHead);
}
return 0;
}
```
这段代码定义了链表节点、插入、删除和打印功能,并在`main`函数中展示了整个流程。注意,这里假设输入的节点地址作为整数传递,实际应用中可能需要其他方式解析。此外,由于题目的输入和输出格式比较复杂,上述代码仅实现了核心功能,实际输出可能需要额外的格式转换。
阅读全文