删除链表中的重复结点
1、定义链表结构体Node.
2、实现单链表构建函数createLink,并使用createLink函数接收数据创建单链表,并返回链表头指针。
3、完成函数dubdel的编写,该函数删除单向链表中的重复结点,如果链表中存在重复结点(除next指针外的其它
数据成员的值相同)时,保留离链首最近的结点,然后返回链表头指针。
4、输出删除重复值后的单链表的值。
输入以-1结束
样例输入:12324-1
样例输出:1234
怎么写一个简单易懂程序
注意:使用这个结构
程序中,首先定义了链表结构体,包含数据成员data和next指针。然后,实现了一个创建链表的函数createLink,该函数通过读取输入的数据,动态创建链表并返回链表头指针。接着,实现了一个删除重复结点的函数dubdel,该函数通过遍历链表,找到重复结点并删除。最后,实现了一个输出链表的函数printLink,用于输出删除重复结点后的链表。
在主函数中,首先调用createLink函数创建链表,然后调用dubdel函数删除重复结点,最后调用printLink函数输出链表的值。
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体Node
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建单链表,并返回链表头指针
Node *createLink() {
int data;
Node *head = NULL, *tail = NULL;
// 读取数据,创建链表
while (1) {
scanf("%d", &data);
if (data == -1) break;
Node *p = (Node *) malloc(sizeof(Node));
p->data = data;
p->next = NULL;
if (head == NULL) {
head = tail = p;
} else {
tail->next = p;
tail = p;
}
}
return head;
}
// 删除单向链表中的重复结点,保留离链首最近的结点
Node *dubdel(Node *head) {
if (head == NULL) return NULL;
Node *p = head;
while (p != NULL) {
Node *q = p->next, *prev = p;
while (q != NULL) {
if (p->data == q->data) {
prev->next = q->next;
free(q);
q = prev->next;
} else {
prev = q;
q = q->next;
}
}
p = p->next;
}
return head;
}
// 输出单链表的值
void printLink(Node *head) {
Node *p = head;
while (p != NULL) {
printf("%d", p->data);
p = p->next;
}
}
int main() {
Node *head = createLink();
head = dubdel(head);
printLink(head);
return 0;
}