c语言在单链表中删除值相同
时间: 2023-05-30 11:06:11 浏览: 93
的节点可以通过遍历单链表,逐个比较节点的值,如果找到值相同的节点,则将该节点从链表中删除。
具体实现可以采用一个指针p指向当前节点,另一个指针q指向p的前一个节点。在遍历过程中,如果发现p节点的值与目标值相同,则将q节点的next指针指向p节点的next指针,然后释放p节点的内存空间。如果p节点不是目标节点,则将q指针指向当前节点p,继续遍历下一个节点。
示例代码如下:
```
void deleteNode(int value, Node **head) {
Node *p, *q;
p = *head;
q = NULL;
while (p != NULL) {
if (p->data == value) {
if (q == NULL) {
// 删除头节点
*head = p->next;
} else {
// 删除中间或尾部节点
q->next = p->next;
}
free(p);
p = q->next;
} else {
q = p;
p = p->next;
}
}
}
```
相关问题
用C语言删除单链表中重复的元素
以下是用C语言删除单链表中重复元素的代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
void deleteDuplicates(struct Node* head) {
struct Node *cur, *pre, *temp;
cur = head->next;
while (cur != NULL) {
pre = cur;
while (pre->next != NULL) {
if (pre->next->data == cur->data) {
temp = pre->next;
pre->next = pre->next->next;
free(temp);
} else {
pre = pre->next;
}
}
cur = cur->next;
}
}
void printList(struct Node* head) {
struct Node* cur = head->next;
while (cur != NULL) {
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
int main() {
struct Node* head = (struct Node*)malloc(sizeof(struct Node));
head->data = 0;
head->next = NULL;
struct Node* node1 = (struct Node*)malloc(sizeof(struct Node));
node1->data = 1;
head->next = node1;
struct Node* node2 = (struct Node*)malloc(sizeof(struct Node));
node2->data = 2;
node1->next = node2;
struct Node* node3 = (struct Node*)malloc(sizeof(struct Node));
node3->data = 2;
node2->next = node3;
struct Node* node4 = (struct Node*)malloc(sizeof(struct Node));
node4->data = 3;
node3->next = node4;
printf("Original list: ");
printList(head);
deleteDuplicates(head);
printf("List after deleting duplicates: ");
printList(head);
return 0;
}
```
该程序创建了一个单链表,然后调用 `deleteDuplicates` 函数来删除重复的元素。该函数使用两个指针 `cur` 和 `pre`,其中 `cur` 指向当前要查找重复元素的节点,`pre` 则指向 `cur` 的前一个节点。函数内部使用嵌套循环,第一个循环遍历链表中的每个节点,第二个循环则从 `pre` 开始遍历节点,查找与当前节点 `cur` 的元素是否相同。如果找到了相同的元素,则删除该节点,并更新 `pre` 的 `next` 指针,否则继续向后遍历。最终,函数将删除所有重复的元素。
输出结果如下所示:
```
Original list: 1 2 2 3
List after deleting duplicates: 1 2 3
```
用C语言设计算法,删除单链表中相同的元素
1. 定义一个结构体来表示单链表的节点,包含一个数据域和一个指向下一个节点的指针:
```
struct ListNode {
int val;
struct ListNode* next;
};
```
2. 实现删除相同元素的算法,具体步骤如下:
(1)定义一个指针p指向头节点,一个指针q指向p的下一个节点;
(2)循环遍历单链表,直到p指向尾节点为止;
(3)如果p节点的值和q节点的值相同,就将q节点从链表中删除,即令p的next指向q的next,释放q节点的内存空间;
(4)如果p节点的值和q节点的值不同,就将指针p和q都向后移动一个节点;
(5)重复执行步骤(3)和(4),直到p指向尾节点为止。
```
void deleteDuplicates(struct ListNode* head) {
struct ListNode* p = head;
while (p != NULL && p->next != NULL) {
struct ListNode* q = p->next;
if (p->val == q->val) {
p->next = q->next;
free(q);
} else {
p = q;
}
}
}
```
3. 完整代码如下:
```
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode* next;
};
void deleteDuplicates(struct ListNode* head) {
struct ListNode* p = head;
while (p != NULL && p->next != NULL) {
struct ListNode* q = p->next;
if (p->val == q->val) {
p->next = q->next;
free(q);
} else {
p = q;
}
}
}
int main() {
struct ListNode* node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node4 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node5 = (struct ListNode*)malloc(sizeof(struct ListNode));
node1->val = 1;
node2->val = 2;
node3->val = 2;
node4->val = 3;
node5->val = 3;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = NULL;
printf("Before deleting duplicates: ");
struct ListNode* p = node1;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
deleteDuplicates(node1);
printf("After deleting duplicates: ");
p = node1;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
free(node1);
free(node2);
free(node3);
free(node4);
free(node5);
return 0;
}
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)