C语言中怎样用单链表删除重复元素
时间: 2024-04-29 15:21:15 浏览: 113
下面是一个用单链表删除重复元素的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node, *LinkedList;
LinkedList createList(int n); // 创建单链表
void printList(LinkedList list); // 输出单链表
void deleteDuplicates(LinkedList list); // 删除重复元素
int main()
{
int n;
LinkedList list;
printf("请输入单链表的元素个数:");
scanf("%d", &n);
list = createList(n);
printf("原始单链表:");
printList(list);
deleteDuplicates(list);
printf("删除重复元素后的单链表:");
printList(list);
return 0;
}
LinkedList createList(int n)
{
int i, data;
Node *head, *p, *q;
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
q = head;
for (i = 0; i < n; i++) {
printf("请输入第%d个元素:", i + 1);
scanf("%d", &data);
p = (Node *)malloc(sizeof(Node));
p->data = data;
p->next = NULL;
q->next = p;
q = p;
}
return head->next;
}
void printList(LinkedList list)
{
Node *p = list;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void deleteDuplicates(LinkedList list)
{
Node *p = list, *q, *r;
while (p != NULL) {
q = p;
while (q->next != NULL) {
if (q->next->data == p->data) {
r = q->next;
q->next = r->next;
free(r);
} else {
q = q->next;
}
}
p = p->next;
}
}
```
这个代码中,我们首先定义了一个`Node`结构体,表示单链表的节点,其中包括数据成员`data`和指向下一个节点的指针`next`。然后,我们定义了一个`LinkedList`类型,表示单链表。`createList`函数用来创建单链表,它接收一个参数`n`,表示单链表的元素个数。在函数内部,我们先创建一个头节点`head`,然后通过循环读入用户输入的元素,并创建一个节点`p`,把它插入到链表的尾部。最后,返回头节点的下一个节点,即为创建好的单链表。
`printList`函数用来输出单链表的所有元素,它接收一个参数`list`,表示要输出的单链表。在函数内部,我们通过循环遍历单链表的每个节点,依次输出它的数据成员`data`。
`deleteDuplicates`函数用来删除单链表的重复元素,它接收一个参数`list`,表示要处理的单链表。在函数内部,我们通过两重循环遍历单链表的每个节点,如果发现有重复的元素,则删除后面的那个节点。具体来说,我们用指针`p`遍历单链表的每个节点,用指针`q`遍历从`p`开始的后面的节点。如果发现`q`指向的节点的数据成员`data`与`p`指向的节点相同,则删除`q`指向的节点,否则,继续往后遍历。这样,当所有的`q`节点都遍历完后,我们再把`p`指向下一个节点,继续遍历。最终,所有的重复元素都被删除了。
阅读全文