使用c语言,编译一个程序,使用单链表,从键盘输入一些整数,删除重复元素,并使剩余元素间的相对次序保持不变。(在输入每个元素前,先查询元素是否存在,如果不存在,则将元素插入链表)
时间: 2024-09-29 09:03:30 浏览: 31
C语言基本语法归纳公开课获奖课件.pptx
在C语言中,我们可以使用链表数据结构来实现这个功能。首先,我们需要创建一个单链表节点结构,包括一个整数值和指向下一个节点的指针。然后,编写函数分别处理添加新元素、查找元素和删除重复元素。
以下是一个简单的实现步骤:
1. **定义链表节点结构**:
```c
struct Node {
int data;
struct Node* next;
};
```
2. **初始化链表头指针**:
```c
struct Node* head = NULL;
```
3. **添加元素(如果不存在则插入)**:
```c
void insert(int num) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = num;
if (head == NULL) {
head = newNode;
} else {
struct Node* temp = head;
while (temp->next != NULL && temp->next->data != num) {
temp = temp->next;
}
if (temp->next == NULL) {
temp->next = newNode;
}
}
}
```
4. **查找元素(用于判断是否已存在)**:
```c
int search(int num) {
struct Node* temp = head;
while (temp != NULL) {
if (temp->data == num) {
return 1; // 存在
}
temp = temp->next;
}
return 0; // 不存在
}
```
5. **删除重复元素**:
```c
void removeDuplicates() {
if (head == NULL || head->next == NULL) {
return;
}
struct Node *current = head, *prev = NULL;
while (current != NULL) {
if (search(current->data)) { // 如果当前元素存在
prev = current->prev; // 更新上一个节点指针,准备删除
} else {
if (prev) { // 如果不是第一个元素
prev->next = current->next; // 删除当前节点
} else { // 如果是第一个元素,更新头指针
head = current->next;
}
free(current); // 释放内存
current = prev; // 移动到上一个节点
}
}
}
```
6. **打印链表**:
```c
void printList() {
struct Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
```
为了完成整个程序,你需要包含必要的头文件并在一个主函数`main()`中调用上述函数,循环读取用户输入,直到用户停止输入。
**相关问题--:**
1. 为什么需要检查`prev`而不是直接修改`head`?
2. 这种算法的时间复杂度是多少?
3. 如何优化这个删除重复元素的过程?
阅读全文