首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

XOR链表的C代码

XOR链表是一种特殊的链表数据结构,它通过使用异或运算(XOR)来实现链表节点之间的链接。每个节点中存储了前一个节点和后一个节点的地址的异或结果。

以下是XOR链表的C代码示例:

代码语言:c
复制
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

// 定义XOR链表节点结构
typedef struct Node {
    int data;
    struct Node* xor_ptr; // 存储前一个节点和后一个节点地址的异或结果
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->xor_ptr = NULL;
    return newNode;
}

// 在链表末尾插入节点
void insert(Node** head, int data) {
    Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
    } else {
        Node* curr = *head;
        Node* prev = NULL;
        Node* next;

        while (curr->xor_ptr != prev) {
            next = (Node*)((uintptr_t)prev ^ (uintptr_t)(curr->xor_ptr));
            prev = curr;
            curr = next;
        }

        newNode->xor_ptr = (Node*)((uintptr_t)curr ^ (uintptr_t)NULL);
        curr->xor_ptr = (Node*)((uintptr_t)prev ^ (uintptr_t)newNode);
    }
}

// 打印XOR链表
void printList(Node* head) {
    Node* curr = head;
    Node* prev = NULL;
    Node* next;

    while (curr != NULL) {
        printf("%d ", curr->data);
        next = (Node*)((uintptr_t)prev ^ (uintptr_t)(curr->xor_ptr));
        prev = curr;
        curr = next;
    }
    printf("\n");
}

int main() {
    Node* head = NULL;

    // 插入节点
    insert(&head, 1);
    insert(&head, 2);
    insert(&head, 3);
    insert(&head, 4);
    insert(&head, 5);

    // 打印链表
    printf("XOR链表内容:");
    printList(head);

    return 0;
}

这段代码实现了XOR链表的创建、插入和打印功能。XOR链表的优势在于它可以通过异或运算实现节点之间的链接,节省了额外的空间开销。它适用于需要高效地在链表中进行插入和删除操作的场景。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++链表-C++链表

C++链表   链表是由一系列连接在一起结点构成,其中每个结点都是一个数据结构。   ...除了数据之外,每个结点还包含一根后继指针指向链表下一个结点。   单个结点组成   非空链表第一个结点称为链表头。要访问链表结点,需要有一个指向链表指针。...从链表头开始,可以按照存储在每个结点中后继指针访问链表其余结点。最后一个结点中后继指针被设置为 以指示链表结束。   指向链表指针用于定位链表头部,所以也可以认为它代表了链表头。...由 3 个结点组成链表,其中显示了指向头部指针,链表 3 个结点以及表示链表末尾 指针。   链表结构图解   一、单向链表   单链表有一个头结点head,指向链表在内存首地址。...链表尾结点由于无后续结点c++链表,其指针域为空,写作NULL。

96520

c++链表-链表入门(C++)

从上链表基础知识学习,进行总结如下:   1.单链表介绍   单链表与数组不同,数组中只存储元素值,而单链表中除了数据值外还包括了指向下一个节点引用字段通常以next来表示。...SinglyListNode *next; SinglyListNode(int x) : val(x), next(NULL) {}   与数组区别,我们无法随机访问链表元素...2.链表添加   链表添加又分为在中间添加、在头部添加以及在尾部添加,首先是头部添加:   头结点是整个链表代表因此在头部进行添加节点时最重要是添加后更新head:   初始化一个cur;将该结点连接到...这样与数组进行对比我们只需要O(1)时间复杂度就可以将元素插入进链表。   ...因为cur节点下一个节点就是cur->nextc++链表,但是上一个节点需要遍历才可以找到c++链表,因此删除节点时间复杂度为O(N)。

84720
  • c++链表-C++实现简单链表

    链表是最常用一种数据结构,无论什么语言,学习数据结构,都绕不开链表,下面通过c++来实现简单链表,所谓简单链表,就是构建链表,然后遍历打印链表。   ...c++中构建链表,最简单是使用结构体来定义节点,节点定义很简单:节点数据,下一个节点c++链表,这就是链表全部,另外,为了通过new时候,直接创建一个节点,我们可以通过定义一个带参数构造函数来实现...链表结构体定义如下:   这里,我们通过循环来构建一个简单链表链表节点数据就是一个数组[0,1,2,3,4]各个元素:   如下图所示,这种简单构建方式,构建链表过程是一种特殊构建方式c++...链表,和我们平时理解不太一样。   ...运行结果如下所示:   最后给出完整代码: #include using namespace std; struct node{ int data; node *next; node

    84010

    C语言链表详解_c语言中链表使用

    链表是一种常见基础数据结构,结构体指针在这里得到了充分利用。...链表可以动态进行存储分配,也就是说,链表是一个功能极为强大数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放是一个地址。...链表节点分为两类,头结点和一般节点,头结点是没有数据域链表中每个节点都分为两部分,一个数据域,一个是指针域。...作为有强大功能链表,对他操作当然有许多,比如:链表创建,修改,删除,插入,输出,排序,反序,清空链表元素,求链表长度等等。...下面是一个传入链表和要修改节点,来修改值函数。

    4.2K10

    C++ 数据结构链表实现代码

    https://blog.csdn.net/sinat_35512245/article/details/54600187 C++ 链表 之前一直没怎么在意C++中链表,但是突然一下子让自己写...总结: 1、链表List基本单元是节点Node,因此想要操作方便,就必须为每一步打好基础,Node基本结构如下: class Node { public: int data; Node...2、第二步就是创建我们链表了,同样我们这里先给出链表代码,再进行一一解释。...然后是重要六个函数,各自功能不言而喻咯,其实最重要是在每一个函数中我们都默认能操作head和tail两个成员变量,这样能简化我们参数列表,使得函数更加优雅。...下面是我一个单链表实现,包含创建链表,插入值,删除特定值,查找特定值得在链表位置。

    2K10

    C语言-链表(单向链表、双向链表)

    链表结构介绍 在前面章节已经学习了数组使用,数组空间是连续空间,数组大小恒定,在很多动态数据存储应用场景下,使用不方便;而这篇文章介绍链表结构,支持动态增加节点,释放节点,比较适合存储动态数据应用场景...链表节点是不连续,需要通过每个节点指针,来找到上一个节点或者下一个节点地址。...链表每个节点就是一个结构体变量,节点里有一个或者两个指针,可以保存上一个节点和下一个节点地址,方便遍历链表,删除、插入节点时定位位置。 2....实现功能如下: 初始化链表头 插入节点函数(链表任意位置插入,链表尾插入) 删除节点函数(链表任意位置删除、链表尾删除) 遍历链表,输出链表所有信息 #include #include...案例: 单向循环链表 代码直接在上面的案例2例子上改造,区别就是尾结点指向了头结点而不是NULL。

    2.1K30

    C语言链表实例--玩转链表

    下图为最一简单链表示意图: 第 0 个结点称为头结点,它存放有第一个结点首地址,它没有数据,只是一个指针变量。...这样一种连接方式,在数据结构中称为“链表”。 而使用动态分配时,每个结点之间可以是不连续(结点内是连续)。...链表基本操作对链表主要操作有以下几种: 1. 建立链表; 2. 结构查找与输出; 3. 插入一个结点; 4. 删除一个结点; 建立一个三个结点链表,存放学生数据。...可编写一个建立链表函数 creat。...下方为创客专门针对C语言链表分析视频资料,对链表感兴趣可以看看学习下 1 C语言玩转链表 http://www.makeru.com.cn/live/1392_338.html?

    2K31

    C语言】链表使用及链表实现原理

    链表是什么? 1.逻辑结构上⼀个挨⼀个数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中各个位置,这种存储结构称为线性表链式存储。...2.由于分散存储,为了能够体现出数据元素之间逻辑关系,每个数据元素在存储同时,要 配备⼀个指针,⽤于指向它直接后继元素,即每⼀个数据元素都指向下⼀个数据元素 ** 本身信息,称为“数据域”...下面是一个单链表实现过程 #include #include #include //结构体是⼀种⼯具,⽤这个⼯具可以定义⾃⼰数据类型 typedef struct...Student Stu; struct tagNode *pNext; } Node; //定义链表第...⼀个学⽣,即学⽣单链表头结点 Node *head = NULL; void printfNode() //遍历元素

    99410

    C语言链表实例--玩转链表

    下图为最一简单链表示意图:   第 0 个结点称为头结点,它存放有第一个结点首地址,它没有数据,只是一个指针变量。...链表每一个结点都是同一种结构类型。   指针域: 即在结点结构中定义一个成员项用来存放下一结点首地址,这个用于存放地址成员,常把它称为指针域。   ...这样一种连接方式,在数据结构中称为“链表”。   而使用动态分配时,每个结点之间可以是不连续(结点内是连续)。...链表基本操作对链表主要操作有以下几种:   1. 建立链表;   2. 结构查找与输出;   3. 插入一个结点;   4. 删除一个结点;   建立一个三个结点链表,存放学生数据。...可编写一个建立链表函数 creat。

    1.6K20

    链表代码详解

    链表相对与顺序表 空间动态分配,减少空间浪费 但在存取删除时需要从头结点开始遍历,时间复杂度为O(n) 插入删除操作需要修改指针 #define OK 1 #define ERROR 0 #define...,其值是函数结果状态代码,如OK等 ElemType类型根据实际情况而定,这里假设为int 先定义结构体 Status visit(ElemType c) { printf("%d ",c);...p || j > i) return ERROR; /* 第i个元素不存在 */ s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数...初始化随机数种子 */ *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; /* 先建立一个带头结点链表...将当前新结点定义为表尾终端结点 */ } r->next = NULL; /* 表示当前链表结束 */ } 主函数 int main() {

    14920

    XOR算法原理和实现

    XOR算法原理和实现 XOR算法这种方法原理 当一个数A和另一个数B进行异或运算会生成另一个数C,如果再将C和B进行异或运算则C又会还原为A。 相对于其他简易加密算法,XOR算法优点如下。...XOR算法实现 上一部分介绍了如何使用XOR运算进行加密/解密原理,本节将使用其加密用户登录信息。根据上一小节介绍XOR加密算法原理,不难写出以下加密解密函数。首先列出加密算法。 ?...第4行定义了加密函数myEncrypt(),输入参数$string为明文,而$key为密钥;输出为使用$key作为密钥并使用XOR加密算法产生密文。...第6~12行外层for循环对明文字符串每一个字符进行循环,而内层for循环(第8~11行)对明文每一字符循环与密钥每一位做异或运算。其原理已经在上一小节中介绍,不再重述。...第4行定义了解密函数myDecrypt(),输入参数$string为密文,而$key为密钥;输出为使用$key作为密钥并使用XOR解密算法产生明文。

    3.1K70

    C语言之单链表实现以及链表介绍

    针对以上顺序表中存在问题,有人就设计出了链表这一结构。下面我将就链表中结构最简单链表做一个详细介绍。...二、链表介绍 2.1链表概念和结构 概念:链表是一种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表指针链接次序实现 。...结构:链表逻辑图和物理图结合  从上图我们可以看出:链表每一个结点都包含数据域和指针域,头结点存储是第一个节点地址,最后一个节点指针域为空指针。...2.2链表分类 1.单向或双向 2.带头或不带头 3.循环或非循环 虽然有这么多链表结构,但是我们实际中最常用还是两种结构: 三、单链表实现 见以下代码: #pragma once #include...SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x) { SLTNode* newnode = BuyListNode(x); //以下两行代码顺序不能调换

    9010

    C语言 | 链表概述

    在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历是日积月累学习。 那么如何学习呢?当然是每天都练习一道C语言题目!! ? 作者 闫小林 白天搬砖,晚上做梦。...C语言链表概述 链表是一种常见重要数据结构。它是动态地进行存储分配一种结构,是根据需要开辟内存单元。 链表有一个“头指针”变量,它存放一个地址,该地址指向一个元素。...链表中每一个元素称为“结点”,每个结点都应包括两个部分 用户需要实际数据。 下一个结点地址。 链表中各元素在内存中地址可以是不连续。...要找某一元素,必须先找到上一个元素,根据它提供下一元素地址才能找到下一个元素。如果不提供“头指针”,则整个链表都无法访问。 链表如同一条铁链一样,一环扣一环,中间是不能断开。...C语言使用链表输出学号和成绩 #include//头文件 struct student //定义学生结构体 { int num; //学号 float score;//成绩

    1.2K30
    领券