帮我写出实现上述功能的c语言代码
时间: 2024-09-29 14:06:34 浏览: 34
如何写出高效优美的单片机C语言代码
以下是使用C语言实现删除非递减有序单链表中值相同多余节点的基本代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入节点到链表
void insert(Node** head, int val) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = val;
newNode->next = *head;
*head = newNode;
}
// 删除值相同的节点
Node* deleteDuplicates(Node* head) {
if (head == NULL || head->next == NULL) {
return head;
}
Node* current = head;
Node* previous = NULL;
while (current != NULL) {
Node* nextTemp = current->next;
// 检查当前节点是否需要删除
while (nextTemp != NULL && nextTemp->data == current->data) {
nextTemp = nextTemp->next;
}
// 更新指向新节点的位置
current->next = nextTemp;
// 移动前驱节点
previous = current;
current = nextTemp;
}
// 如果前驱节点未变,说明整个链表都是重复的,返回新的头节点
if (previous == NULL) {
return head->next;
} else {
return head;
}
}
int main() {
Node* head = NULL;
insert(&head, 1);
insert(&head, 2);
insert(&head, 2);
insert(&head, 3);
insert(&head, 3);
insert(&head, 4);
head = deleteDuplicates(head);
// 打印链表
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
return 0;
}
```
这段代码首先定义了一个链表节点结构,接着实现了插入节点和删除重复节点的功能。`deleteDuplicates`函数通过两个指针`current`和`previous`遍历链表,并根据找到的不同节点值更新它们之间的连接。
阅读全文