使用c语言代码完成以下操作:删除递增链表中重复结点,仅保留第一个。我的思想是:对链表使用循环,每遇到一个不同的元素则插入新的链表,遇到相同的就跳到下一个元素。
时间: 2024-10-23 10:12:48 浏览: 17
c语言数据结构实验:掌握线性表的链式存储结构 熟练掌握循环链表的存储特征和建立方法,掌握线性表的链式存储结构 下面是源码的txt
在 C 语言中,你可以使用结构体表示链表节点,并编写一个函数来遍历并处理链表。以下是一个简单的示例,实现了删除递增链表中的重复节点:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* newNode(int val) {
Node* node = (Node*)malloc(sizeof(Node));
if (node == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
node->data = val;
node->next = NULL;
return node;
}
// 删除重复节点
Node* removeDuplicates(Node* head) {
if (head == NULL || head->next == NULL) {
return head;
}
Node* current = head;
while (current != NULL && current->next != NULL) {
if (current->data > current->next->data) {
current = current->next;
} else {
Node* temp = current->next;
while (temp != NULL && temp->data == current->data) {
// 将当前节点的下一个指向重复的下一个节点
current->next = temp->next;
free(temp); // 释放重复节点的内存
temp = current->next; // 更新临时指针
}
current = current->next;
}
}
return head;
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 初始化链表示例
Node* list = newNode(1);
list->next = newNode(2);
list->next->next = newNode(2);
list->next->next->next = newNode(3);
list->next->next->next->next = newNode(4);
// 删除重复节点
list = removeDuplicates(list);
// 打印结果
printList(list);
return 0;
}
```
在这个例子中,`removeDuplicates` 函数会遍历链表,遇到值大于下一个节点的节点(即递增序列),则直接移动到下一个。如果遇到值等于当前节点的节点,则查找所有重复的节点并释放它们。`main` 函数创建了一个简单的链表并展示了删除重复后的结果。
阅读全文