用c语言写一个 两条单链表查找相同的元素并删除
时间: 2024-09-11 12:11:16 浏览: 76
C语言通讯录
在C语言中,实现两条单链表查找相同元素并删除的算法通常涉及以下步骤:
1. 定义单链表的数据结构,通常包括数据域和指向下一个节点的指针。
2. 实现两个链表的遍历函数,用于遍历每个链表中的节点。
3. 创建一个辅助函数,用于比较两个节点的值是否相同。
4. 对每对节点使用辅助函数比较,如果相同且不是头节点,则删除该节点。
以下是一个简单的示例代码,演示了上述逻辑:
```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));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 向链表添加元素的函数
void appendNode(ListNode **head, int val) {
ListNode *newNode = createNode(val);
if (*head == NULL) {
*head = newNode;
} else {
ListNode *current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 删除链表中的节点函数
void deleteNode(ListNode **head, int val) {
ListNode *current = *head, *prev = NULL;
while (current != NULL && current->val != val) {
prev = current;
current = current->next;
}
if (current == NULL) {
return; // 没有找到该值
}
if (prev == NULL) {
// 删除的是头节点
*head = current->next;
} else {
prev->next = current->next;
}
free(current);
}
// 查找两条链表的相同元素并删除
void deleteCommonElements(ListNode **head1, ListNode **head2) {
ListNode *current1 = *head1, *current2 = *head2;
while (current1 != NULL && current2 != NULL) {
if (current1->val == current2->val && current1 != *head1) {
// 找到相同元素,删除当前1的节点
ListNode *temp = current1;
current1 = current1->next;
deleteNode(head1, temp->val);
deleteNode(¤t2, temp->val);
} else if (current1->val < current2->val) {
current1 = current1->next;
} else {
current2 = current2->next;
}
}
}
// 打印链表的函数
void printList(ListNode *head) {
ListNode *current = head;
while (current != NULL) {
printf("%d ", current->val);
current = current->next;
}
printf("\n");
}
int main() {
ListNode *head1 = NULL, *head2 = NULL;
// 向链表1中添加元素
appendNode(&head1, 1);
appendNode(&head1, 2);
appendNode(&head1, 3);
appendNode(&head1, 4);
// 向链表2中添加元素
appendNode(&head2, 2);
appendNode(&head2, 4);
appendNode(&head2, 5);
printf("链表1: ");
printList(head1);
printf("链表2: ");
printList(head2);
// 删除相同元素
deleteCommonElements(&head1, &head2);
printf("删除相同元素后的链表1: ");
printList(head1);
printf("删除相同元素后的链表2: ");
printList(head2);
// 释放链表内存
// ...
return 0;
}
```
在这个示例中,我们首先定义了链表节点的结构体,然后实现了创建节点、添加节点到链表末尾、删除节点、打印链表以及查找并删除相同元素的函数。`main` 函数中创建了两条链表,并调用 `deleteCommonElements` 函数删除了两个链表中相同的元素。
阅读全文