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

如何在没有头/尾指针的C中添加多个节点到链表中?

在没有头/尾指针的C语言中,可以通过以下步骤将多个节点添加到链表中:

  1. 定义一个节点结构体,包含数据和指向下一个节点的指针。
  2. 创建一个头节点,并将其指针设置为NULL,表示链表为空。
  3. 创建要添加的节点,并为其分配内存空间。
  4. 将节点的数据赋值给要添加的数据。
  5. 遍历链表,找到最后一个节点。
  6. 将最后一个节点的指针指向要添加的节点。
  7. 将要添加的节点的指针设置为NULL,表示它是链表的最后一个节点。

以下是一个示例代码:

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

// 定义节点结构体
struct Node {
    int data;
    struct Node* next;
};

// 添加节点到链表中
void addNode(struct Node** head, int data) {
    // 创建新节点
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;

    // 如果链表为空,将新节点设置为头节点
    if (*head == NULL) {
        *head = newNode;
        return;
    }

    // 遍历链表,找到最后一个节点
    struct Node* lastNode = *head;
    while (lastNode->next != NULL) {
        lastNode = lastNode->next;
    }

    // 将新节点添加到链表的末尾
    lastNode->next = newNode;
}

// 打印链表
void printList(struct Node* node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
    printf("\n");
}

int main() {
    struct Node* head = NULL;

    // 添加节点到链表中
    addNode(&head, 1);
    addNode(&head, 2);
    addNode(&head, 3);

    // 打印链表
    printList(head);

    return 0;
}

这段代码演示了如何在没有头/尾指针的C语言中添加多个节点到链表中。通过定义节点结构体,创建新节点,并将其添加到链表的末尾。最后,打印链表以验证节点是否成功添加。

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

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发:https://cloud.tencent.com/product/mobdev
  • 腾讯云区块链服务:https://cloud.tencent.com/product/tbaas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据结构之链表

节点之间通过引用连接: 链表节点通过指针或引用相互连接。单向链表只有一个指向下一个节点引用,双向链表有两个引用,分别指向下一个节点和上一个节点。...链表节点用来表示链表起始点,而节点下一个节点通常为空(nil)。以下是单向链表主要特点和属性:特点和属性:每个节点包含两个部分:数据元素和指向下一个节点引用。...我们创建了链表节点和节点,并插入一个新节点。然后,我们展示了如何在前向和后向两个方向上遍历链表并打印节点数据。双向链表实现可以根据需要进行扩展,包括插入、删除、查找节点等操作。...带头链表可以用于各种链表问题,包括单向链表、双向链表、循环链表等不同类型链表。带头链表通常用于简化链表操作,因为它确保链表不为空,即使链表没有实际数据节点时,节点也存在。这减少了对特殊情况处理。...我们创建了一个带头链表,其中链表节点不包含实际数据,然后插入一个新节点到链表

28220

数据结构和算法-单向链表

单向链表操作 单向链表操作方式主要分为增、删、改、查等操作 4.1 单向链表建立,初始化 (1)若原链表为空,则将新建节点设置为节点 (2)若原链表为非空,则将新建节点添加到表 4.2 单链表插入操作...向一个链表插入一个新节点时,首先要新建一个节点,并将新建节点指针域初始化为空NULL,然后在链表寻找适当位置执行节点插入操作,此时需要考虑下面4种情况: (1)若原链表为空,则将新建节点p作为节点...若在结点前插入新节点,则将新节点指针域指向原链表结点,并且让head指向新节点p (3)若在原链表中间插入新节点,则将新节点p指针域指向下一点,并且让前一指针域指向新建节点p (4)若在表插入新节点...,则将前一指针域指向当前节点下一点,即可删除当前节点。...head = new Node(0, ""); /** * 添加点到单向链表,不考虑排序,在链表尾部加入节点 * 1.找到当前链表最后节点 * 2.将最后这个节点

34310
  • 数据结构与算法(三):双向链表

    一、双向链表 双向链表与单链表基本相似,但是最大区别在于双向链表在节点中除了指向下一next指针外,还有指向前一prev指针,这使得双向链表在可以在任意节点从头尾两个方向进行遍历,是“双向...添加与单向链表代码逻辑一样,但是新节点在添加时需要修改prev指针指向原来节点。...B.next指向A.next,也就是让Bnext指向C 让A.next.prev指向B,也就是让Cprev指向B 让A.next指向B /** * 添加点到链表 * @param node 要插入节点...//将节点指向即将插入新节点 temp.next = node; node.prev = temp; } /** * 按顺序添加点到链表 * @param node 要插入节点...举个例子,假设有节点A,B,C,现在要删除B: 找到B,让B.prev.next=B.next,也就是让Anext指向C 让B.next.prev=B.prev,也就是让Cprev指向A 如果要删除节点已经是节点了

    1.6K21

    虚拟节点秒杀链表问题

    删除排序链表重复元素 II 题意:删除排序链表中所有含有重复数字节点,只保留原始链表没有出现数字。 ? 解题思路 以链表 1->1->1->2->3 为栗子,删除值为 1 节点。...在原链表节点前增加虚拟节点: ? 定义两个指针 pre/cur,分别指向虚拟节点和头节点 ?...继续右移 cur,判断是否还有其指向节点值与其下一个节点值相等,同时右移 pre,直至 cur 指向链表节点 ?...= nullptr) { ListNode *cur = pre->next; /* 当前节点值等于其下一值,右移当前节点到其下一点 */ while (cur->next...循环判断当前节点值是否等于其下一值,如果等于,则将当前节点右移至其下一点,然后再递归删除当前节点下一点后面子链表所有重复数字节点;否则就递归当前节点下一点,挂接在当前节点后面。

    33440

    学习心得:C语言实现链表操作超详细

    1.什么是链表 链表理解要包含以下特征: (1).由n个节点离散分配; (2).每个节点通过指针连接 (3)每一个节点由一个前驱节点和一个后驱节点 (4).首节点没有前驱节点,节点没有后驱节点;...; (2)链表创建 在创建链表之前,我们需要需要了解一下专业术语: 首节点:存放第一个有效数据节点; 节点:存放最后一个有效数据节点; 节点:节点数据类型与首节点数据类型相同,并且节点是首节点前面的那个节点...指针:指向节点指针指针:指向节点指针; 首先,我们应该创建一个节点,并用指针指向它,用C语言描述:用malloc向计算机申请一块内存,并定义一个指向与节点数据类型相同指针(一定要判断申请内存是否成功...想想我们就可以发现,当我们要插入多个节点时,节点始终指向最后添加一个数据,以前节点通过头指针此时已经找不到了;我们定义一个指针pTail,始终用来指向链表结尾,每次只在pTail后面添加节点。...伪算法: (1)定义一个指针pTail,并初始化,使它指向节点,即pTail=pHead; (2)在pTail后面添加节点,修改指针: pTail->pNext=p; p->pNext=NULL;

    1.8K00

    数据结构——lesson3单链表介绍及实现

    1.什么是链表链表是一种 物理存储结构上非连续、非顺序存储结构,数据元素 逻辑顺序是通过链表 指针链 接次序实现 。...逻辑图如下: 可以看出链表有两个变量,一个存放数据,另一个存放指向下一指针; 此外链表还具有以下特征: (1)链表在逻辑上连续,但在物理上不一定连续; (2)链表节点在现实中一般都是在堆上开辟出来...实际更多是作为 其他数据结构子结 构,哈希桶、图邻接表等等。另外这种结构在 笔试面试中出现很多。 (2)带头双向循环链表: 结构最复杂,一般用在单独存储数据。...plist,所以需要指针指针pplist; (6)单链表删 // 单链表删 void SListPopBack(SListNode** pplist) { assert(pplist); assert...,单链表实现关键在于理解它逻辑结构,包括两个变量,一个是指向数据,另一个则指向下一指针,此外,单链表实现还涉及了二级指针内容以及动态内存函数内容,涉及代码知识更为广泛,但是只要抓住了关键点就会发现每个函数中心思想都是不变

    12510

    Redis双向链表一文全知道

    在Redis链表List应用非常广泛,但是Redis是采用C语言来写,底层采用双向链表实现(这边提一嘴,如果是科班出身或者大学有学过数据结构同学,可以划走啦)。...双向链表定义 节点ListNode 包括指针prev,指针next,当前值value,如下图所示。...指针head指向整个链表第一个节点,指针tail指向整个链表最后一个节点。 ​...1 return list; } 添加元素到表 添加元素到表,首先新建一个新节点node,判断是否有内存分配,如果有,则继续,如果没有,则返回NULL,退出方法。...举个例子,如果要在list插入节点f,首先将节点指针赋值为空(对应步骤1),然后将新节点指针指向最后一个节点(对应步骤2),将最后一个节点next指向新节点(对应步骤3),最后将list指针

    2.2K30

    C语言单链表基本操作总结(增删改查),建议收藏!

    链表中有一个指针变量,这个指针变量保存一个地址,通过这个地址来找到这个链表指针节点指向第一个节点,在链表每个节点包含两个部分:数据部分和指针部分。...虽然结构体不能含有与本身类型相同结构,但是可以含有之相同类型结构指针,这种定义是链表基础,链表每一项都包含在何处能找到下一项信息。...struct Node* head= NULL; struct Node* end = NULL; 2.3 创建链表,实现在链表增加一个数据(添加)————增 void AddListTill(...首先创建一个节点并申请一个节点内存,之后对传入节点数据进行赋值,注意添加新节点指针应指向空;此时分两种情况,1是链表中一个节点都没有,那么这个节点既是结点也是结点;2是已经有节点,那么新添加节点将成为最后一个节点...,而之前节点因为成为了倒数第二个节点了所以它指针应该指向新添加节点,之后全局变量结点应该指向现在节点(注意操作先后顺序不能变)。

    1.1K30

    【数据结构】链表经典OJ题,常见几类题型(二)

    在我们找节点时,我们可以顺便计算两链表长度,定义两链表指针slow,fast分别指向链表头节点,让指向长链表指针先走两链表长度差值,然后一起向后走,当slow == fast时就找到了相交节点。...我们便可写一个结束条件为fast && fast->next循环。因为如果此链表不带环,那么指针迟早会走到NULL;如果链表带环,那么便没有空节点,此循环便不会结束。...对于找入环第一个节点,我们可以先假设C为环长,L为环外面部分长,X为入环点到相遇节点长,n为两指针相遇时fast比slow多走圈数,此处长皆为节点数,那么我们便可得到如下图所示结构图:...此时我们可以定义两个结构体指针head,meet让他们分别从链表头节点和相遇节点向后走,根据此公式他们会在入环第一点相遇,于是就找到了入环第一个节点。...X部分反转; 如图中2处,最后需要将指向原位置指针指向NULL。

    6610

    C语言单链表基本操作总结(增删改查)「建议收藏」

    链表中有一个指针变量,这个指针变量保存一个地址,通过这个地址来找到这个链表指针节点指向第一个节点,在链表每个节点包含两个部分:数据部分和指针部分。...虽然结构体不能含有与本身类型相同结构,但是可以含有之相同类型结构指针,这种定义是链表基础,链表每一项都包含在何处能找到下一项信息。...struct Node* head= NULL; struct Node* end = NULL; 2.3 创建链表,实现在链表增加一个数据(添加)————增 void AddListTill(int...首先创建一个节点并申请一个节点内存,之后对传入节点数据进行赋值,注意添加新节点指针应指向空;此时分两种情况,1是链表中一个节点都没有,那么这个节点既是结点也是结点;2是已经有节点,那么新添加节点将成为最后一个节点...,而之前节点因为成为了倒数第二个节点了所以它指针应该指向新添加节点,之后全局变量结点应该指向现在节点(注意操作先后顺序不能变)。

    58310

    猿创征文 | 数据结构初步(七)- 链表oj挑战

    (2) 结构体指针cur开始指向原链表节点;结构体指针later记录cur下一个节点;结构体指针newhead记录新链表节点(开始没有节点时指向空)。...less,把大于 x 节点插到另一个新链表greater,再把小于 x 链表节点内部指针指向大于 x 链表存放数据结点,把大于 x 链表节点内部指针指向NULL;这样先分开原链表在链接两个新链表...,less链表节点指针指向greater链表哨兵节点下一个节点 /*这里因为哨兵节点存在,就算less链表没有有效数据节点, 至少tailLess还指向哨兵...为了表示给定链表环,评测系统内部使用整数 pos 来表示链表连接到链表位置(索引从 0 开始)。如果 pos 是 -1 ,则在该链表没有环。...+X) == L+k*C+X L == k*C - X; k==1时,L == C-X 含义是 从头节点到入环节点长度 与 从快慢指针第一次相遇节点到入环节点长度 相等 看慢指针和头指针情况

    51210

    【go】剑指offer: 删除链表结点O(1)时间复杂度

    添加结点我们需要注意是当链表长度为0时候,我们将结点数据存放在节点中。...= nil { head = head.m_pNext } head.m_pNext = &node 成功添加结点后,我们编写一个遍历链表函数,用来测试我们数据是否真正添加链表。...,回想一下我们数据结构删除链表结点时思路,通常我们会准备两个指针指向链表,不停移动指针,设p1、p2分别为前指针和后指针,那么当p2指向结点需要被删除时候,就是把p1指向结点指针域指向p2...不过这里我们需要注意结点没有下一点我们直接判断,还需注意是待删除结点必须真实存在与链表,值和next域均存在。...,删除节点(也是结点) l.head = nil } else { // 链表中有多个结点,删除结点 head := l.head

    63930

    【数据结构】链表最强结构-带头双向循环链表(超详解)

    链表类型区别 ---- 单向/双向 单向:节点结构只存在下一地址,所以难以从后一点找到前一点 双向:节点结构存在前一点和后一地址,寻找前一点和后一点很便利 图示...: 带头/不带头 带头:在本来结点之前还有一个哨兵卫节点作为节点,它址域指针指向节点,值域不做使用 不带头:没有哨兵卫节点,在插等问题中要考虑结点情况(局限) 图示:...,一般用在单独存储数据 实际 更多是作为 其他数据结构子结 构 ,哈希桶、图邻接表等等 使用链表数据结构,都是带头双向循环链表 其他 这种结构在...= newnode; newnode->next = pHead; } 链表删 注意: 考虑节点只剩哨兵卫情况 删前记录前一地址 注意构建节点关系逻辑 参考代码: // 双向链表删 void...free(tail); //构建节点前一点与哨兵卫结点关系 tailprev->next = pHead; pHead->prev = tailprev; return; } 链表头插

    26530

    前端学数据结构与算法(三):链表为什么能和数组相提并论?用链表实现数组bettle下

    简单来说链表是由一个个节点组成,而每个节点之间链接使用指针,通过指针把一个个节点串起来,形成一个链路。类似生活火车,火车有火车头,中间是火车车厢,最后一是尾车厢,再之后就是空。...我们知道从链表添加/移除元素很简单,但是从尾部添加/移除就很麻烦了,需要从头开始遍历到尾部才行。所以这个链表会有些不同,我们增加指向链表指针,这样的话用O(1)时间复杂度就能访问到尾部。...链表行走江湖多年,靠就是灵活。例如再将指针指向,就行成了一个环,也就是循环链表;如果每个节点再加一个指向上一个节点指针,那就成了双向链表。...// 更换新节点即可 if (this.tail === null) { // 如果是首次添加 this.tail = this.dummy.next; // 将指针设置添加第一个元素...添加与移除 如果只是从头尾添加或移除,链表时间复杂度都可以下降到O(1)(有指针缘故,双向链表会更方便);而数组如果从头部添加或移除元素,都会用O(n)复杂度去搬家。

    43000

    【数据结构】10道经典面试题目带你玩转链表

    newnode: 直到将待逆置链表全部插到newhead链表: 这时链表就逆置完毕了,这时返回newhead,即新链表即可....然后我们比较cur1和cur2值,将其中较小者插到newhead链表(假设两个值相同时我们默认将cur1插入到链表): 然后分别更新cur1指针和tail指针,使它们分别指向下一个结点和新链表结点...: 然后再比较cur1和cur2值,将它们较小者插入到新链表: 再更新cur2指针和tail指针: 直到某一链表结点全部插入到newhead,: 这时将不为空链表剩下全部结点直接链接在...为了表示给定链表环,评测系统内部使用整数 pos 来表示链表连接到链表位置(索引从 0 开始)。如果 pos 是 -1,则在该链表没有环。...题目详情: 解题思路: 思路一:逻辑等式求点法 如图,我们设起始点到入环点距离为L,入环点到相遇点距离为X,环长为C,则可有以下推导: 那么我们可以得到一个结论:如果一个指针从起始点开始走

    7510

    c语言 | 单链表实现

    今天分享是单链表。准确说,单链表不算是C语言中内容,而是属于数据结构内容,因为它没有知识点,只是利用了结构体和指针知识。...但是它在C语言中应用还是很广泛,在RTOS,也是非常多地方使用到了链表。今天暂时说一下单链表实现和简单应用,下一当中再介绍双链表。 首先,要对单链表有个概念。...链表是由一个个节点构成,每个节点之间用指针方式连接起来,有一个指针用来找到链表第一个节点,然后根据指针就可以找到每一个节点。...其实,在整个过程当中,指针总是指向p前一个节点,比如p当前指向了2点,那么指针就指向1点,本来1点是指向2,但是第一步操作让1点指向了NULL。...循环,导致最后一个节点没有连上倒数第二个节点,指针没有连上最后一个节点,这就需要自己再添加最后两句代码了。

    2K30

    计算机中使用数理逻辑学习笔记

    head/tail list 方法 它为每个子句设置两个引用指针,分别是指针指针,初始时,指针指向子句第一个文字,指针指向最后一个文字,每个子句文字存放在一个数组。...而对于句或句是非 (v) 子句,就需要移动头尾指针寻找下一个未被赋值字母,指针往后移,指针往前移,移动时可能会发生以下四种情况: 第一个遇到文字 (l) 已经体现为真了,那么子句就已经满足了...第一个遇到文字 (l) 是未赋值,且不是句,那么就把这个子句 (c) 从 (v) 链表移除,放入到 (l) 对应链表。...(m) 子句 2,3,4,5 还没有被满足,这些子句指针需要后移一位,转移后这些子句指针指向文字就不是 (m) 了,所以需要将表格 2,3,4,5 位置换一下,更换位置子句用红色标注...2-literal watching 这个方法与 H/T 类似,也要为每个子句关联两个指针,与 H/T 不同之处是,这两个指针没有先后次序,也就没有所谓概念,这样设置会带来很多好 处,比如初始时这两个指针位置可以是任意

    2.1K20

    《闲扯Redis三》Redis五种数据类型之List型

    二、操作命令 List数据类型在 Redis 相关命令:: 命令 描述 用法 LPUSH 1.将一个或多个值value插入到列表key表头2.如果有多个value值,那么各个value值按从左到右顺序依次插入表头...2、双端链表(linkedlist) 链表是一种常用数据结构,C 语言内部是没有内置这种数据结构实现,所以Redis自己构建了链表实现。...head ,表指针 tail 以及链表长度计数器 len ,dup、free、match 成员则是用于实现多态链表所需类型特定函数。...无环:表头节点 prev 指针和表节点 next 指针都指向 NULL,对链表访问以NULL为终点。...带表头指针和表指针:通过list结构 head 和 tail 指针,程序获取链表表头节点和表结点复杂度都是O(1)。

    42010

    JS数据结构与算法 — 链表

    上图中,我们说 data2 跟在 data1 后面,而不是说 data2 是链表第二个元素。上图,值得注意是,我们将链表元素指向了 null 节点,表示链接结束位置。...由于链表起始点的确定比较麻烦,因此很多链表实现都会在链表最前面添加一个特殊节点,称为 节点,表示链表头部。...下面我将用图片演示如何在 data2 节点 后面插入 data4 节点。 插入节点 同样,从链表删除一个节点,也很简单。...; 另一个是next,表示要指向链表中下一个元素指针。...属性都指向链表节点,换句话说,也就是链表节点指向了节点,形成了一个循环链表,如下图所示: 循环链表 原理相信你已经懂了,循环链表这里就不贴代码了,相信你自己能独立完成!

    1K10
    领券