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

C语言的链表实现(仅打印最后两个节点)

C语言的链表实现是一种数据结构,用于存储和操作一系列节点的集合。链表由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表可以分为单向链表和双向链表。单向链表的每个节点只有一个指针指向下一个节点,而双向链表的每个节点有两个指针,分别指向前一个节点和后一个节点。

链表的优势在于插入和删除节点的效率高,因为只需要修改指针的指向,而不需要移动其他节点。另外,链表的大小可以动态调整,不像数组需要预先分配固定大小的内存空间。

链表的应用场景包括但不限于:实现栈和队列、LRU缓存淘汰算法、大整数运算、图的表示等。

腾讯云提供了云原生应用开发平台TKE(Tencent Kubernetes Engine),可以用于部署和管理容器化的应用程序。TKE支持使用Docker容器来运行应用程序,并提供了自动扩展、负载均衡、监控等功能,适用于构建和部署基于容器的微服务架构。

关于链表实现的具体代码和打印最后两个节点的方法,可以参考以下示例:

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

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

// 打印链表的最后两个节点
void printLastTwoNodes(struct Node* head) {
    if (head == NULL || head->next == NULL) {
        printf("链表节点数不足两个\n");
        return;
    }

    struct Node* first = head;
    struct Node* second = head->next;

    while (second->next != NULL) {
        first = second;
        second = second->next;
    }

    printf("倒数第二个节点的值:%d\n", first->data);
    printf("最后一个节点的值:%d\n", second->data);
}

int main() {
    // 创建链表节点
    struct Node* head = (struct Node*)malloc(sizeof(struct Node));
    struct Node* second = (struct Node*)malloc(sizeof(struct Node));
    struct Node* third = (struct Node*)malloc(sizeof(struct Node));
    struct Node* fourth = (struct Node*)malloc(sizeof(struct Node));

    // 设置节点的值和指针
    head->data = 1;
    head->next = second;

    second->data = 2;
    second->next = third;

    third->data = 3;
    third->next = fourth;

    fourth->data = 4;
    fourth->next = NULL;

    // 打印最后两个节点
    printLastTwoNodes(head);

    // 释放内存
    free(head);
    free(second);
    free(third);
    free(fourth);

    return 0;
}

以上代码实现了一个简单的链表,并打印了最后两个节点的值。注意在实际应用中,需要注意内存的分配和释放,以避免内存泄漏。

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

相关·内容

打印两个链表的第一个公共节点

「力扣上剑指offer52,打印两个链表的第一个公共节点。」 ? 举个栗子 很多问题都有多种算法可以解决。...暴力解题 最最最简单的就是暴力解题,你说两个链表的第一个公共节点,那好,我就挨个遍历就完事了。 对于A链表中的每个节点,都遍历B链表,如果有相同的节点,则返回该节点。...将两个链表中的节点全都入栈,判断两个栈顶元素,如果相同则出栈;如果不同则返回刚出栈的元素。...题目没有实现直接获取链表长度的方法,所以需要先遍历分别遍历两个链表一次,才能知道哪个链表长。之后再进行实际的快慢指针。...如果最后有相同部分,说明两个链表相交,如果没有相同部分,则说明两个链表没有交点,返回null。 /** * Definition for singly-linked list.

84010

单向链表之删除节点(C语言实现)「建议收藏」

大家好,又见面了,我是你们的朋友全栈君。 链表的创建查看 删除节点就是将某一节点从链中摘除。 将待删节点与其前一节点解除联系(中间或尾部)或本阶段删除(头节点),并释放相应空间(free)。...删除的第一步是找到要删除的节点,同链表查找,如果找不到或链表为空,提示未找到,找到后根据情况删除此节点。删除节点两种情况:第一个节点,后面节点。...步骤: 1、链表为空:不用删除 2、链表不为空:先循环找要删除的节点 1)找到了 1>找到的节点是头节点 被删除节点是第一个节点:只需使head指向第二个节点即可 2>找到的节点是普通节点...(STU **p_head,char *name) { STU * pb,*pf; pb=*p_head;//让pb指向头节点 if(*p_head == NULL)//链表为空链表...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

2.5K10
  • 【C语言】Leetcode 876. 链表的中间节点

    题目 通过题目的要求可以判断出有两种示例要解决,一种是偶数节点的链表,一种是奇数节点的链表,应对这两种情况我们需要使程序对二者都可以兼容。...我们可以用快慢指针的思想来进行查找,定义一个慢指针,再定义一个是慢指针速度二倍的快指针,这样的话当快指针到最后的位置的时候慢指针指向的就是中间节点了。...但是在查找的时候还要同时解决上面提到的两种情况: ①奇数链表 从两个指针的初始开始研究,当前两个指针都处在第一个节点的位置,然后我们开始移动。...可以发现,在奇数数量节点的链表中,当fast到达最后一个节点的时候slow刚好指向了中间节点。这样就完成了查找中间节点的目的,该遍历循环的条件是fast -> next !...因为是偶数链表,所以需要查找到的中间节点的位置是中间两个节点中的第二个,当循环后发现,当fast到达NULL的时候slow指向的才是中间的第二个节点,所以该情况的循环条件为fast != NULL。

    12810

    c语言 | 单链表的实现

    今天分享的是单链表。准确的说,单链表不算是C语言中的内容,而是属于数据结构的内容,因为它没有新的知识点,只是利用了结构体和指针等的知识。...但是它在C语言中应用还是很广泛的,在RTOS中,也是非常多的地方使用到了链表。今天暂时说一下单链表的实现和简单应用,下一节当中再介绍双链表。 首先,要对单链表有个概念。...单链表其实是对数组的扩展,数组是为了存储很多个数据而产生的,但是它有两个缺陷,第一个缺陷就是数组里面所有的元素都是同样的类型,为了解决这个问题,产生了结构体。...说明:在本次实验中,使用的是vscode编辑器,编译环境是gcc,不建议使用VC6.0,因为VC6.0使用的c语言标准太老了,很多语法都不支持,并且,VC6.0使用体验极差,没有代码高亮功能等等。...再测试其他的情况,也都没有问题,说明我们的代码实现了预定目标。

    2.1K30

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

    链表是什么? 1.逻辑结构上⼀个挨⼀个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。...下面是一个单链表的实现过程 #include #include #include //结构体是⼀种⼯具,⽤这个⼯具可以定义⾃⼰的数据类型 typedef struct...⼀个学⽣,即学⽣单链表的头结点 Node *head = NULL; void printfNode() //遍历元素...,并不知道怎么去访问这个数据 if(head == NULL) { head = node; //一开始没有任何节点,那么传入的节点作为头结点 } else {...=NULL) //,获取最后一个节点的位置,跳出循环的那时候是最后一个节点,判断后继节点是否为空 { p = p->pNext; } p->pNext=node; //下一个指针域指向新节点

    1K10

    【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)

    剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。...2、代码 C++实现: /** * Definition for singly-linked list....在遍历列表时,将当前节点的 next 指针改为指向前一个元素. 2、代码 C++: /** * Definition for singly-linked list....输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。...两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可。使用递归就可以轻松实现。

    87510

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

    二、链表的介绍 2.1链表的概念和结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。...结构:链表逻辑图和物理图的结合  从上图我们可以看出:链表的每一个结点都包含数据域和指针域,头结点存储的是第一个节点的地址,最后一个节点的指针域为空指针。...2.2链表的分类 1.单向或双向 2.带头或不带头 3.循环或非循环 虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构: 三、单链表的实现 见以下代码: #pragma once #include...int SLTDateType; typedef struct SListNode { SLTDateType data; struct SListNode* next; }SLTNode; //打印链表的数据域的内容...; exit(-1); } newnode->data = x; newnode->next = NULL; return newnode; } //打印链表的数据域的内容

    9210

    单向循环链表-链表(单链表)的基本操作及C语言实现

    由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素(最后一个指向NULL(空))。   ...; } return p; }   链表中查找某结点一般情况下,链表只能通过头结点或者头指针进行访问,所以实现查找某结点最常用的方法就是对链表中的结点进行逐个遍历。   ...i=1; inext; } //创建插入结点c link * c=(link*)malloc(sizeof(link)); c->elem=elem; //向链表中插入结点 c->next=temp...从链表中删除节点当需要从链表中删除某个结点时,需要进行两步操作:   使用malloc函数申请的空间,一定要注意手动free掉。...,p是链表,elem是插入的结点的数据域,add是插入的位置 link insertElem(link p,int elem,int add); //删除结点的函数,p代表操作链表,add代表删除节点的位置

    98830

    joseph约瑟死亡游戏-C语言循环链表的实现

    先来看看程序运行的效果  这个 死亡游戏的大致规则就是:以上面的程序为例,先选7个人出来,再给七个人进行编号,选编号为六个人出来,然后顺时针(逆时针)每个人开始报数,从1开始,一直数到20,数到20...的那个人出局,然后继续循环,直到最后一个人出局 typedef struct Lnode { int data; struct Lnode *next; }joseph; 自定义结构体类型...s=(joseph*)malloc(sizeof(joseph)); s->data=i; p->next=s; p=s; } p->next=L; } 创建循环链表...jnext; } printf("%d,",p->data); Delete_List(p,q); p=q->next; } printf("%d,",p->data);//输出最后一个节点...jnext; } printf("%d,",p->data); Delete_List(p,q); p=q->next; } printf("%d,",p->data);//输出最后一个节点

    37220

    【数据结构】C语言实现双链表的基本操作

    对指针这一块的知识掌握的不牢固的朋友可以通过【C语言总集篇】指针篇这篇博客来复习一下指针的相关知识点 我们在对双链表初始化之后就可以来通过头插法或者尾插法来创建一个双链表了; 四、双链表的创建 由于双链表的结点结构与单链表的结点结构不同...: 新结点的后继指针指向头结点的后继指针指向的对象,即NULL; 新结点的前驱指针指向头结点; 头结点的后继指针指向新结点; 用C语言来描述的话则是: //头插法创建第一个表头结点的插入步骤 New_Node...,即表头结点; 头结点后继指针指向对象的前驱结点指向新结点; 新结点的前驱指针指向头结点; 头结点的后继指针指向新结点; 用C语言描述的话则是: //头插法创建第二个及以上的头结点的插入步骤 New_Node...: 将当前结点的前驱结点的后继指针指向当前结点的后继结点; 将当前结点的后继结点的前驱指针指向当前结点的前驱结点; 释放当前结点的空间; 将其转换成C语言则是: //双链表的删除操作 DNode->prior...);//释放当前结点的内存空间 如果是删除的结点为表尾结点,则我们只需要将表尾结点的前驱结点指向空指针,然后直接释放表尾结点的空间就行,转换成C语言则是如下所示: //删除表尾结点 DNode->prior

    49010

    C语言中的链表:定义、操作与实现

    由于链表的每个结点都有指针域,所以链表可以动态分配内存。 链表的类型 链表主要分为单链表和双链表两种。单链表只有一个指针域,指向下一个结点,而双链表则有两个指针域,分别指向前驱结点和后继结点。...C语言中的链表 在C语言中,链表可以通过结构体和指针来实现。结构体可以存储结点的数据域和指针域,而指针则可以实现结点之间的连接。...traverseList(head); deleteNode(&head, 2); printf("\n"); traverseList(head); return 0; } 以上就是C语言中链表的定义...在C语言中,我们可以通过结构体和指针来实现链表,并定义相关函数来支持链表的各种操作。在实际应用中,链表可以用来实现队列、栈等数据结构,也可以用来实现其他的应用,如链表排序等。...总之,链表是一种重要的数据结构,在C语言编程中有着广泛的应用。通过学习和练习,可以深入理解链表的实现原理和应用场景,提高编程能力。

    2.2K30

    数据结构——链表的游标实现(C语言)

    上一篇博文我们用指针实现了链表,但是诸如BASIC和FORTRAN等许多语言都不支持指针。如果需要链表而又不能使用指针,这时我们可以使用游标(cursor)实现法来实现链表。...在链表的实现中有两个重要的特点: 数据存储在一组结构体中。每一个结构体包含有数据以及指向下一个结构体的指针。...一个新的结构体可以通过调用malloc而从系统全局内存(global memory)得到,并可以通过free而被释放。 游标法必须能够模仿实现这两条特性 。...Advance( const Position P ); ElementType Retrieve( const Position P ); #endif /*_CUrsor_H */ 可以从上面的代码上看到,链表的游标实现跟链表的接口定义几乎是一样的...: %d\n", IsEmpty(L)); printf("Hello World\n"); return 0; } 实现过程比较简单,最后的main函数是对游标链表的测试。

    2.4K20
    领券