c语言编程实现将顺序表中值重复的结点删除,使所得的结果链表中所有结点的值均不相同。
时间: 2024-09-09 15:12:20 浏览: 80
在C语言中,要实现顺序表(数组或者单链表)中删除重复节点,通常我们会遍历整个列表,对于每一个节点,如果它的值已经在之前遇到过,则删除它。这里提供一个简单的单链表的例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* create_node(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 删除重复节点(仅保留第一个出现的)
void remove_duplicates(Node** head) {
if (*head == NULL) {
return;
}
Node* current = *head;
Node* prev = NULL;
while (current != NULL) {
Node* temp = current->next;
if (prev != NULL && prev->data == current->data) {
free(current);
current = temp;
} else {
prev = current;
current = temp;
}
}
*head = prev; // 更新头指针,指向最后一个非重复节点
}
// 打印链表
void print_list(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
Node* list = create_node(1); // 初始化链表
list = create_node(2);
list->next = create_node(3); // 添加一些重复值
list->next->next = create_node(4);
list->next->next->next = create_node(3);
list->next->next->next->next = create_node(5);
printf("Original list with duplicates:\n");
print_list(list);
remove_duplicates(&list);
printf("List after removing duplicates:\n");
print_list(list);
return 0;
}
```
在这个例子中,`remove_duplicates` 函数会遍历链表并删除重复的节点。注意,这个函数修改了传入的头指针直接,所以`head`应该是一个指向指针的指针 (`Node**`)。
阅读全文