C语言【问题描述】请根据输入的逆序数据采用头插法创建一个单链表,然后删除相同的数据,仅保留一个。 【输入形式】逆序的数据,数据0代表输入结束 【输出形式】创建成功的原始单链表的数据,以及删除某些元素后的单链表的数据,其中相同数据仅保留一个 【样例输入】 9 9 8 8 7 6 5 5 4 0 【样例输出】 4 5 5 6 7 8 8 9 9 4 5 6 7 8 9
时间: 2024-02-25 20:55:48 浏览: 64
以下是实现代码(C语言):
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表的节点
struct ListNode {
int val;
struct ListNode *next;
};
// 采用头插法创建单链表
struct ListNode *create_linked_list(int *nums, int n) {
struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode));
dummy->next = NULL;
for (int i = 0; i < n; i++) {
struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = nums[i];
node->next = dummy->next;
dummy->next = node;
}
return dummy->next;
}
// 删除相同数据,仅保留一个
struct ListNode *remove_duplicates(struct ListNode *head) {
if (!head) {
return head;
}
struct ListNode *p = head;
while (p->next) {
if (p->val == p->next->val) {
p->next = p->next->next;
} else {
p = p->next;
}
}
return head;
}
int main() {
// 读入输入的数据
int nums[100];
int n = 0;
while (1) {
int num;
scanf("%d", &num);
if (num == 0) {
break;
}
nums[n++] = num;
}
// 创建原始单链表
struct ListNode *head = create_linked_list(nums, n);
// 输出原始单链表的数据
while (head) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
// 删除相同数据,仅保留一个
head = remove_duplicates(head);
// 输出删除相同数据后的单链表的数据
while (head) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
return 0;
}
```
以下是代码的说明:
1. 定义一个 `ListNode` 结构体,表示单链表的节点。每个节点包含两个属性,一个是节点的值,一个是指向下一个节点的指针。
2. 定义 `create_linked_list` 函数,根据输入的逆序数据采用头插法创建一个单链表,并返回链表的头节点。
3. 定义 `remove_duplicates` 函数,删除相同数据,仅保留一个,并返回链表的头节点。
4. 读入输入的数据,创建原始单链表,并输出原始单链表的数据。
5. 删除相同数据,仅保留一个,输出删除相同数据后的单链表的数据。
在这个代码中,我们通过头插法创建单链表。头插法比较简单,就是先创建一个空的头节点 `dummy`,然后依次把输入的数据转化成节点,并插入到头节点之后。由于是逆序输入的数据,所以插入的顺序就是正序的。
删除相同数据的算法也比较简单,我们只需要维护一个指针 `p`,从头节点开始遍历单链表,如果 `p` 节点的值等于 `p->next` 节点的值,说明有重复的数据,直接删除 `p->next` 节点,然后继续遍历;否则,将指针 `p` 移动到下一个节点,继续遍历。
阅读全文