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日

相关文章

  • virtualenv安装

    Virtualenv安装攻略 virtualenv是一个用于创建Python虚拟环境的工具,它可以帮助您在同一台机器上管理多个项目,每个项目都有自己的依赖项和Python版本。在本文中,我们将介绍安装virtualenv并创建Python虚拟环境。 步骤1:安装pip 在安装virtualenv之前,您需要先安装pip,它是Python包管理器。在大多数Li…

    other 2023年5月9日
    00
  • SharedWorker 多页面相互通信示例详解

    让我来详细讲解一下“SharedWorker 多页面相互通信示例详解”。 什么是 SharedWorker SharedWorker 是一个 JavaScript API,其允许运行在同一源下的多个脚本访问共享的 Worker(线程)实例。 sharedWorker 通过名称创建,也就是说,一个相同名称的 sharedWorker 可以被多个页面/脚本访问,…

    other 2023年6月27日
    00
  • 假设检验(hypothesistesting)

    假设检验(hypothesis testing) 在统计学中,假设检验(hypothesis testing)是一种用来检验、评估某个假设是否成立的方法。在假设检验中,我们会建立一个零假设(null hypothesis),然后寻找足够的证据来判断是否需要拒绝这个假设。 零假设(null hypothesis)和备择假设(alternative hypoth…

    其他 2023年3月28日
    00
  • 魔兽世界7.3.5野德怎么堆属性 wow7.35猫德配装属性优先级攻略

    魔兽世界7.3.5野德怎么堆属性 野德属性优先级 在魔兽世界7.3.5版本中,野德的属性优先级排序为:爆击 > 急速 > 狂暴值 > 精通 爆击:因为野德的流派技能和伤害都能受到爆击的影响,所以在野德的属性排序中需要将爆击放在第一位。 急速:野德的优化是依赖于技能循环来完成的,而急速可以加速技能的循环,减少空余时间,所以放在第二位。 狂暴值…

    other 2023年6月27日
    00
  • 利用IDEA工具修改Maven多模块项目标识包名全过程记录

    利用IDEA工具修改Maven多模块项目标识包名全过程记录攻略 本攻略将详细介绍如何使用IDEA工具修改Maven多模块项目的标识包名。以下是完整的步骤记录: 步骤一:打开项目 首先,使用IDEA工具打开你的Maven多模块项目。 步骤二:定位要修改的包名 在项目结构中,定位到你想要修改的包名所在的模块。可以通过展开项目结构树,在src/main/java目…

    other 2023年9月7日
    00
  • mysql语句自增语句咋写

    以下是“MySQL语句自增语句咋写”的完整攻略: MySQL语句自增语句咋写 在MySQL中,可以使用自增语句来为表中的记录生成唯一标识符。本攻略将介绍如何在MySQL中编写自增语句。 步骤1:创建表 首先,您需要创建一个表来存储数据。以下是一个示例: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KE…

    other 2023年5月7日
    00
  • linux下的定时器:alarm()与setitimer()

    Linux下的定时器:alarm()与setitimer() 在Linux系统中,我们可以使用多种方式实现定时器的功能。其中,两种常用的方式是使用alarm()和setitimer()函数。本文将详细介绍这两个函数的使用方法及差异。 alarm()函数 alarm()函数定义在<unistd.h>头文件中,其原型如下: unsigned int …

    其他 2023年3月28日
    00
  • C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)

    下面是 C++ 基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)的详细攻略: 问题分析 题目要求我们判断两个二叉树的结构和数据是否完全相同。这里所说的“结构相同”指的是两棵树的节点数、节点的左右子树结构相同,而“数据相同”指的是两棵树的节点存储的数据值相等。 递归算法实现 递归是二叉树算法中最经典的算法之一,而判断两个二叉树结构是否相同…

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