关于C语言的简单问题

删除链表中的重复结点
1、定义链表结构体Node.
2、实现单链表构建函数createLink,并使用createLink函数接收数据创建单链表,并返回链表头指针。
3、完成函数dubdel的编写,该函数删除单向链表中的重复结点,如果链表中存在重复结点(除next指针外的其它
数据成员的值相同)时,保留离链首最近的结点,然后返回链表头指针。
4、输出删除重复值后的单链表的值。
输入以-1结束
样例输入:12324-1
样例输出:1234
怎么写一个简单易懂程序
注意:使用这个结构

img

程序中,首先定义了链表结构体,包含数据成员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;
}