帮我用C语言写一个链表中删除值相同的多余节点算法
时间: 2023-05-25 11:02:46 浏览: 43
以下是一个基于单链表的算法,用于删除值相同的多余节点。具体思路是,首先遍历整个链表,判断每个节点的值是否与前面的节点的值相同。如果相同,则删除当前节点。注意,这种算法只会保留第一个出现的具有相同值的节点,后续的所有节点都将被删除。
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int val;
struct Node *next;
};
void delete_duplicates(struct Node *head) {
struct Node *p, *q, *tmp;
if (!head) {
return;
}
p = head;
while (p->next) {
q = p->next;
if (p->val == q->val) {
tmp = q;
p->next = q->next;
free(tmp);
} else {
p = q;
}
}
}
int main() {
struct Node *head, *p1, *p2, *p3, *p4, *p5;
p1 = (struct Node*) malloc(sizeof(struct Node));
p2 = (struct Node*) malloc(sizeof(struct Node));
p3 = (struct Node*) malloc(sizeof(struct Node));
p4 = (struct Node*) malloc(sizeof(struct Node));
p5 = (struct Node*) malloc(sizeof(struct Node));
p1->val = 1;
p1->next = p2;
p2->val = 2;
p2->next = p3;
p3->val = 2;
p3->next = p4;
p4->val = 3;
p4->next = p5;
p5->val = 3;
p5->next = NULL;
head = p1;
printf("Before:%d->%d->%d->%d->%d\n", p1->val, p2->val, p3->val, p4->val, p5->val);
delete_duplicates(head);
printf("After:%d->%d->%d->%d\n", p1->val, p2->val, p3->val, p4->val);
free(p1);
free(p2);
free(p3);
free(p4);
free(p5);
return 0;
}
```
输出结果:
```
Before:1->2->2->3->3
After:1->2->3
```