c语言链表单值化,《编译原理及实践教程》第3章词法分析.ppt
时间: 2024-02-03 08:13:20 浏览: 86
c语言编程题之链表操作设计链表.zip
链表的单值化操作可以理解为将链表中重复的元素合并,保留一个元素,从而得到一个没有重复元素的链表。
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
// 链表插入操作
void insert(Node **head, int data) {
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
if (*head == NULL) {
*head = new_node;
} else {
Node *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_node;
}
}
// 链表单值化操作
void unique(Node *head) {
if (head == NULL) {
return;
}
Node *p = head;
while (p != NULL && p->next != NULL) {
if (p->data == p->next->data) {
Node *q = p->next;
p->next = q->next;
free(q);
} else {
p = p->next;
}
}
}
// 打印链表
void print(Node *head) {
Node *p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node *head = NULL;
insert(&head, 1);
insert(&head, 2);
insert(&head, 2);
insert(&head, 3);
insert(&head, 3);
insert(&head, 3);
printf("原始链表:");
print(head);
unique(head);
printf("单值化后的链表:");
print(head);
return 0;
}
```
运行结果:
```
原始链表:1 2 2 3 3 3
单值化后的链表:1 2 3
```
在代码中,我们定义了一个链表结构体 `Node`,包含一个整型数据 `data` 和一个指向下一个节点的指针 `next`。为了方便操作,我们还定义了链表插入操作 `insert`,链表单值化操作 `unique` 和打印链表操作 `print`。
在链表单值化操作中,我们首先判断链表是否为空,如果为空则直接返回。否则,我们从链表头开始遍历,如果当前节点的数据与下一个节点的数据相同,则将下一个节点删除,并将当前节点的指针指向删除节点的下一个节点;否则,将当前节点的指针移动到下一个节点。
最后,我们在 `main` 函数中创建一个链表,并调用插入操作插入若干个元素。然后,我们先打印原始链表,再调用单值化操作,最后再打印单值化后的链表。
阅读全文