C语言数据结构实现链表去重的实例

获取并处理链表的重复项是一种数据结构的基本操作,C语言数据结构中,我们可以使用链表来实现该操作。下面是一个实现链表去重的示例:

实现思路

  1. 从链表的头结点开始遍历链表;
  2. 对于每个节点,分别访问其后面的节点,找到与其值相同的节点并删除;
  3. 继续遍历链表,直到所有的重复节点均被删除。

代码实现

下面是一个完整的C语言代码示例实现链表去重:

#include<stdio.h>
#include<stdlib.h>

struct node {
    int data;
    struct node *next;
};

void removeDuplicates(struct node *head) {
    struct node *temp1, *temp2, *dup;
    temp1 = head;

    while (temp1 != NULL && temp1->next != NULL) {
        temp2 = temp1;

        while (temp2->next != NULL) {
            if (temp1->data == temp2->next->data) {
                dup = temp2->next;
                temp2->next = temp2->next->next;
                free(dup);
            } else {
                temp2 = temp2->next;
            }
        }
        temp1 = temp1->next;
    }
}

void printList(struct node *head) {
    struct node *temp = head;
    while (temp != NULL) {
        printf("%d->", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

void push(struct node **head_ref, int new_data) {
    struct node *new_node = (struct node*) malloc(sizeof(struct node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

int main() {
    struct node *head = NULL;
    push(&head, 10);
    push(&head, 12);
    push(&head, 11);
    push(&head, 12);
    push(&head, 11);
    push(&head, 11);
    push(&head, 10);
    printf("Linked list before removing duplicates:\n");
    printList(head);

    removeDuplicates(head);
    printf("\nLinked list after removing duplicates:\n");
    printList(head);
    return 0;
}

为了演示代码的正确性,我们构建了一个包含多个重复项的链表,并将该链表作为参数传递给removeDuplicates()函数。执行该函数后,我们可以看到所有的重复项已被删除,输出的结果为:

Linked list before removing duplicates:
10->12->11->12->11->11->10->NULL

Linked list after removing duplicates:
10->12->11->NULL

示例说明

示例一

请注意代码中的removeDuplicates()函数,这是实现去重操作的核心功能。代码使用两个指针temp1temp2在链表中遍历所有的节点。对于每个节点,内部的while循环检查是否存在与该节点相同的其他节点。如果找到了重复项,则将temp2指针移到下一个节点,并通过free函数释放重复的节点。如果没有找到重复项,则将temp2指针移到下一个节点继续循环。

示例二

在完整代码的main函数中,我们先构建了一个具有重复项的链表,该链表的顺序为10 -> 12 -> 11 -> 12 -> 11 -> 11 -> 10。我们将该链表传递给removeDuplicates()函数,并调用printList()函数打印输出结果。在输出结果中,我们可以看到所有重复项(10、12和11)均已被成功删除,链表的新顺序为10 -> 12 -> 11。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构实现链表去重的实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • linux 进行批量下载文件操作

    linux 进行批量下载文件操作 在日常的工作中,我们可能会需要下载许多文件,如果一个个手动下载会比较耗时费力。不过在 Linux 系统中,我们可以使用一些命令来进行批量下载,提高我们的效率。 使用 wget 下载文件 wget 是一个常用的下载工具,它可以从 HTTP、HTTPS、FTP 等协议中下载文件。使用 wget 下载文件非常简单,只需要在终端中输…

    其他 2023年3月29日
    00
  • Android 如何实现弹窗顺序&优先级控制

    Android 如何实现弹窗顺序&优先级控制 1. 弹窗顺序控制 要实现弹窗顺序控制,可以通过使用弹窗队列进行管理。以下是实现的步骤: 步骤 1:创建弹窗队列 public class PopupQueue { private static PopupQueue instance = null; private LinkedList<Popup…

    other 2023年6月28日
    00
  • python+opencv实现阈值分割

    Python+OpenCV实现阈值分割攻略 阈值分割是图像处理中常用的一种方法,用于将图像分割成不同的区域,以便进行后续的分析和处理。在本攻略中,我们将使用Python编程语言和OpenCV库来实现阈值分割。 步骤1:导入库和读取图像 首先,我们需要导入必要的库和模块,并读取待处理的图像。在这个例子中,我们将使用OpenCV的cv2模块来处理图像。 impo…

    other 2023年7月29日
    00
  • Angular工具方法学习

    Angular工具方法学习攻略 简介 Angular是一种流行的前端框架,它提供了许多实用的工具方法,可以帮助开发者更高效地构建Web应用程序。本攻略将详细介绍一些常用的Angular工具方法,并提供示例说明。 1. @ViewChild装饰器 @ViewChild装饰器用于在组件中获取对子组件、DOM元素或指令的引用。它可以帮助我们在父组件中与子组件进行通…

    other 2023年8月18日
    00
  • termius怎么使用?termius for mac使用ssh命令登陆服务器的方法教程

    Termius是一款跨平台的终端管理工具,主要用于连接和管理服务器、网络设备等。本文将为大家讲解Termius的使用方法,特别是在Mac上使用SSH命令登录服务器的方法。 Termius的安装和设置 首先,我们需要从官网下载并安装Termius客户端。 打开Termius客户端后,我们需要登录或注册一个Termius账号。 登录成功后,我们需要添加一个新的主…

    other 2023年6月26日
    00
  • Linux sed命令的使用

    下面是关于Linux sed命令的使用的完整攻略: Linux sed命令的使用 什么是sed命令? Linux中的sed命令是一种流编辑器,用于根据特定的规则来编辑文本。通过使用sed命令,用户可以轻松地进行文本编辑和转换,而不需要在原始文件中进行修改。sed命令通常与其他Linux命令一起使用,例如grep、awk和cut等。 sed命令的语法 sed …

    other 2023年6月26日
    00
  • 苹果ios8.1.3正式版固件下载地址汇总【附ios8.1.3升级教程】

    苹果iOS 8.1.3正式版固件下载地址汇总【附iOS 8.1.3升级教程】 iOS 8.1.3是苹果公司发布的一款重要的操作系统更新版本。本攻略将为您提供iOS 8.1.3正式版固件的下载地址,并附上升级教程,以帮助您顺利完成升级过程。 iOS 8.1.3正式版固件下载地址 您可以通过以下方式获取iOS 8.1.3正式版固件: 官方下载地址:您可以直接从苹…

    other 2023年8月4日
    00
  • 快速解决ip地址与网络上的其他系统有冲突不能上网

    快速解决IP地址与网络上的其他系统有冲突不能上网的攻略 当您的IP地址与网络上的其他系统发生冲突时,您可能无法正常上网。这种情况通常是由于网络中存在重复的IP地址引起的。下面是一些解决此问题的步骤: 步骤一:确认IP地址冲突 首先,您需要确认是否存在IP地址冲突。您可以通过以下步骤来检查: 打开命令提示符(Windows)或终端(Mac和Linux)。 输入…

    other 2023年7月30日
    00
合作推广
合作推广
分享本页
返回顶部