链表(C语言版)

这篇具有很好参考价值的文章主要介绍了链表(C语言版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链表是一种基于指针实现的线性表,它的特点是动态存储,可以方便地进行插入和删除操作。以下是一个简单的单向链表的实现(C语言版)。

#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode {
    int data;               // 数据元素
    struct ListNode *next;  // 指向下一个节点的指针
} ListNode, *ListPtr;

// 初始化链表
void InitList(ListPtr *L) {
    *L = NULL;
}

// 判断链表是否为空
int isEmpty(ListPtr L) {
    return L == NULL ? 1 : 0;
}

// 获取链表长度
int getLength(ListPtr L) {
    int len = 0;
    for (ListPtr p = L; p != NULL; p = p->next) {
        len++;
    }
    return len;
}

// 获取指定位置的元素
int getElem(ListPtr L, int i) {
    if (i < 1 || i > getLength(L)) {
        printf("Error: Index out of range.\n");
        exit(1);
    }
    ListPtr p = L;
    for (int j = 1; j < i; j++) {
        p = p->next;
    }
    return p->data;
}

// 在指定位置插入元素
void insertElem(ListPtr *L, int i, int e) {
    if (i < 1 || i > getLength(*L)+1) {
        printf("Error: Index out of range.\n");
        exit(1);
    }
    ListPtr newNode = (ListPtr)malloc(sizeof(ListNode));
    newNode->data = e;
    if (i == 1) {  // 插入到头结点
        newNode->next = *L;
        *L = newNode;
    } else {  // 插入到其他位置
        ListPtr p = *L;
        for (int j = 1; j < i-1; j++) {
            p = p->next;
        }
        newNode->next = p->next;
        p->next = newNode;
    }
}

// 删除指定位置的元素
void deleteElem(ListPtr *L, int i) {
    if (i < 1 || i > getLength(*L)) {
        printf("Error: Index out of range.\n");
        exit(1);
    }
    if (i == 1) {  // 删除头结点
        ListPtr p = *L;
        *L = (*L)->next;
        free(p);
    } else {  // 删除其他位置
        ListPtr p = *L;
        for (int j = 1; j < i-1; j++) {
            p = p->next;
        }
        ListPtr q = p->next;
        p->next = q->next;
        free(q);
    }
}

// 输出链表中的所有元素
void printList(ListPtr L) {
    printf("List: ");
    for (ListPtr p = L; p != NULL; p = p->next) {
        printf("%d ", p->data);
    }
    printf("\n");
}

int main() {
    ListPtr L;
    InitList(&L);

    // 插入元素
    insertElem(&L, 1, 1);
    insertElem(&L, 2, 2);
    insertElem(&L, 3, 3);
    insertElem(&L, 4, 4);
    insertElem(&L, 5, 5);
    printList(L);  // List: 1 2 3 4 5

    // 删除元素
    deleteElem(&L, 3);
    printList(L);  // List: 1 2 4 5

    // 获取元素
    printf("Element at index 2 is %d\n", getElem(L, 2));  // Element at index 2 is 2

    // 获取长度
    printf("Length of the list is %d\n", getLength(L));  // Length of the list is 4

    return 0;
}

在这个实现中,我们使用结构体 ListNode 来表示链表中的节点,其中 data 表示数据元素,next
表示指向下一个节点的指针。我们实现了初始化链表、判断链表是否为空、获取链表长度、获取指定位置的元素、在指定位置插入元素、删除指定位置的元素、输出链表中所有元素等操作。文章来源地址https://www.toymoban.com/news/detail-787436.html

到了这里,关于链表(C语言版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言实现链表--数据结构

    魔王的介绍:😶‍🌫️一名双非本科大一小白。 魔王的目标:🤯努力赶上周围卷王的脚步。 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍🔥大魔王与你分享:很喜欢宫崎骏说的一句话:“不要轻易去依赖一个人,它会成为你的习惯当分别来临,你失去的不是某个人而是你精

    2024年02月02日
    浏览(41)
  • C语言数据结构之链表

    在上一篇博客中我们提到,线性表包括顺序表和链表,顺序表在上篇博客中已经介绍,本篇博客介绍一下另一种线性表—— 链表 。 概念:链表是⼀种 物理存储结构上⾮连续、⾮顺序 的存储结构,数据元素的 逻辑顺序是通过链表中的指针链接次序实现的 。 链表的结构跟⽕

    2024年04月22日
    浏览(44)
  • C语言数据结构-双向链表

    带头链表的头结点,实际是\\\"哨兵位\\\",哨兵位节点不存储任何有效元素,只是站在这里\\\"放哨的\\\". 哨兵位的意义:遍历循环链表避免死循环. 笔者在删除,插入数据时,画好图后,也好了代码,但是在调试中多次出现 代码位置出错 ,导致写的代码的含义不符合预期. 所以说思路一定要清晰

    2024年02月04日
    浏览(48)
  • 双向链表--C语言实现数据结构

    本期带大家一起用C语言实现双向链表🌈🌈🌈 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的;简单来说,线性表的链式存储结构生成的表,称作“链表”。 每个元素本身由两部分组成: 1、本身的信息,称

    2024年02月04日
    浏览(59)
  • 数据结构——双向链表(C语言版)

    上一章: 数据结构——单向链表(C语言版)-CSDN博客 目录 什么是双向链表? 双向链表的节点结构 双向链表的基本操作 完整的双向链表示例 总结 什么是双向链表? 双向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含两个指针:一个指向前一个节点,一个

    2024年03月26日
    浏览(56)
  • 数据结构——单向链表(C语言版)

    在数据结构和算法中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C语言中,我们可以使用指针来实现单向链表。下面将详细介绍如何用C语言实现单向链表。 目录 1. 定义节点结构体 2. 初始化链表 3. 插入节点 4. 删除节点

    2024年03月24日
    浏览(43)
  • <数据结构> 链表 - 单链表(c语言实现)

    哨兵位结点也叫哑节点。哨兵位结点 也是头结点 。该节点 不存储有效数据,只是为了方便操作 (如尾插时用带哨兵位的头结点很爽,不需要判空)。 有哨兵位结点的链表,第一个元素应该是链表第二个节点(head - next,head为哨兵位结点)对应的元素。 有哨兵位结点的链表

    2023年04月11日
    浏览(134)
  • Go语言数据结构(一)双向链表

    Go语言中list容器定义在\\\"container/list\\\"包中,实现了一个双向链表。本文第一部分总结源码包中的方法,第二部分展示使用list包的常见示例用法以及刷题时的用法。 食用指南:先看第二部分的常用示例用法然后再用到时在第一部分找对应的方法。 更多内容以及其他Go常用数据结

    2024年01月19日
    浏览(38)
  • C语言进阶——数据结构之链表(续)

    hello,大家好呀,我是Humble,本篇博客承接之前的 C语言进阶——数据结构之链表 的内容 (没看过的小伙伴可以从我创建的专栏C语言进阶之数据结构 找到那篇文章并阅读后在回来哦~) ,上次我们重点说了链表中的 单链表 ,即 不带头单向不循环链表 还说到了链表的分类虽

    2024年01月25日
    浏览(59)
  • 【数据结构】—C语言实现双向链表(超详细!)

                                          食用指南:本文在有C基础的情况下食用更佳                                       🔥 这就不得不推荐此专栏了:C语言                                     🍀 双向链表 前 置知识 :单链表      

    2024年02月13日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包