写一篇c语言,在线性表中,如果值相同的元素只有一个,则称该线性表为纯表。在给定的小型表中可能存在一些值相同的元素,请删除“多余”的数据元素,使该线性表变为纯表
时间: 2024-11-06 16:24:16 浏览: 7
在C语言中,要实现这个功能,我们通常会创建一个结构体表示线性表的元素,并实现一个函数来检查和修改线性表。这里是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义线性表节点结构体
typedef struct Node {
int value;
struct Node* next;
} Node;
// 检查并删除重复元素
void deleteDuplicates(Node** head) {
if (*head == NULL || (*head)->next == NULL) { // 如果表为空或只有一个元素
return;
}
Node* current = *head;
while (current->next != NULL) {
Node* temp = current->next;
while (temp != NULL && temp->value == current->value) { // 找到下一个非重复元素
Node* delNode = temp; // 保存当前需要删除的节点
temp = temp->next;
free(delNode); // 释放内存
}
current->next = temp; // 更新当前节点的下一个指针
current = current->next; // 移动到下一个元素
}
}
// 测试示例
int main() {
Node* list = malloc(sizeof(Node)); // 创建链表头结点
list->value = 5;
list->next = malloc(sizeof(Node));
list->next->value = 7;
list->next->next = malloc(sizeof(Node));
list->next->next->value = 5;
list->next->next->next = malloc(sizeof(Node));
list->next->next->next->value = 9;
printf("Before deletion: \n");
traverseList(list);
deleteDuplicates(&list); // 删除重复元素
printf("\nAfter deletion: \n");
traverseList(list);
// 函数来遍历链表显示元素
void traverseList(Node* node) {
while (node != NULL) {
printf("%d ", node->value);
node = node->next;
}
printf("\n");
}
return 0;
}
```
在这个例子中,`deleteDuplicates` 函数会在保持顺序的前提下,只保留每个值的第一个实例。运行 `main` 函数可以看到删除前后的线性表内容。
阅读全文