用C语言实现一个删除两个双向链表中相同结点的函数
时间: 2024-01-22 18:19:26 浏览: 112
以下是用C语言实现删除两个双向链表中相同结点的函数的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
void deleteNode(Node* node) {
if (node == NULL) {
return;
}
if (node->prev != NULL) {
node->prev->next = node->next;
}
if (node->next != NULL) {
node->next->prev = node->prev;
}
free(node);
}
void deleteCommonNodes(Node* list1, Node* list2) {
Node* p = list1;
while (p != NULL) {
Node* q = list2;
while (q != NULL) {
if (p->data == q->data) {
deleteNode(p);
deleteNode(q);
break;
}
q = q->next;
}
p = p->next;
}
}
int main() {
Node* list1 = createNode(1);
list1->next = createNode(2);
list1->next->prev = list1;
list1->next->next = createNode(3);
list1->next->next->prev = list1->next;
Node* list2 = createNode(2);
list2->next = createNode(3);
list2->next->prev = list2;
deleteCommonNodes(list1, list2);
Node* p = list1;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
Node* q = list2;
while (q != NULL) {
printf("%d ", q->data);
q = q->next;
}
printf("\n");
return 0;
}
```
在此示例代码中,我们定义了一个 `Node` 结构体表示链表的结点,其中包括数据、前驱结点和后继结点三个成员变量。我们还定义了 `createNode` 函数用于创建链表结点,以及 `deleteNode` 函数用于删除某个结点。
在 `deleteCommonNodes` 函数中,我们对两个链表中的每一个结点进行比较,如果它们的数据相同,则删除它们。在删除结点时,我们调用 `deleteNode` 函数删除结点,并将该结点的前驱结点和后继结点进行连接。
在 `main` 函数中,我们创建了两个双向链表并分别赋值,然后调用 `deleteCommonNodes` 函数删除它们的相同结点。最后,我们遍历两个链表并输出它们的值,以检查删除操作是否成功。
需要注意的是,此示例代码仅适用于数据类型为整数的链表。若要支持其他数据类型,需要相应地修改代码。
阅读全文