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

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.

82110

单向链表之删除节点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.1K10

C语言】Leetcode 876. 链表中间节点

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

10310

c语言 | 单链表实现

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

2K30

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; //下一个指针域指向新节点

97010

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

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

83110

基于Python和C++实现删除链表节点

给定单向链表头指针和一个要删除节点值,定义一个函数删除该节点。 返回删除后链表节点。...示例 1: 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 第二个节点,那么在调用了你函数之后,该链表应变为 4 – 1 –...示例 2: 输入: head = [4,5,1,9], val = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 第三个节点,那么在调用了你函数之后,该链表应变为 4 – 5 –...思路:   建立一个空节点作为哨兵节点,可以把首尾等特殊情况一般化,且方便返回结果,使用双指针将更加方便操作链表。...postPtr.next break prePtr = prePtr.next postPtr = postPtr.next return tempHead.next C+

69131

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; } //打印链表数据域内容

8110

数据结构——链表游标实现(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

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

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

1.5K30

单向循环链表-链表(单链表基本操作及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代表删除节点位置

87330

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);//输出最后一个节点

34320
领券