C语言 超详细模拟实现单链表的基本操作建议收藏

yizhihongxing

C语言 超详细模拟实现单链表的基本操作建议收藏

前言

单链表是C语言数据结构中十分基础的一种。以下是单链表的定义:

typedef struct Node {
    int val;
    struct Node *next;
} Node, *LinkedList;

其中,Node 表示单链表中的一个节点,包括 val 和指向下一个节点的指针 next。而 LinkedList 则是指向单链表第一个节点的指针。

基本操作

1. 初始化单链表

初始化单链表,可以简单地将 LinkedList 指针赋值为 NULL

LinkedList initList() {
    LinkedList head = NULL;
    return head;
}

2. 判断单链表是否为空

首先判断单链表的头节点是否为空,即指向的节点是否为 NULL

int isEmpty(LinkedList head) {
    if(head == NULL) {
        return 1;
    } else {
        return 0;
    }
}

3. 获取单链表长度

从头节点开始遍历单链表,每遍历一个节点计数器加1,直到遍历到链表尾节点为止:

int length(LinkedList head) {
    int len = 0;
    Node *p = head;
    while(p != NULL) {
        len++;
        p = p->next;
    }
    return len;
}

4. 遍历单链表

从头节点开始遍历单链表,输出所有节点的 val 值:

void traverseList(LinkedList head) {
    Node *p = head;
    while(p != NULL) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

5. 在单链表末尾插入节点

从头节点开始遍历单链表,找到链表尾节点,将其指针指向新节点:

LinkedList insertAtTail(LinkedList head, int val) {
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->val = val;
    newNode->next = NULL;
    if(head == NULL) {
        head = newNode;
    } else {
        Node *p = head;
        while(p->next != NULL) {
            p = p->next;
        }
        p->next = newNode;
    }
    return head;
}

6. 在单链表指定位置插入节点

从头节点开始遍历单链表,找到指定位置的前驱节点,将其指针指向新节点,将新节点指针指向后继节点:

LinkedList insertAtIndex(LinkedList head, int index, int val) {
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->val = val;
    newNode->next = NULL;
    if(head == NULL && index != 1) {
        printf("Error: Invalid Index\n");
        return NULL;
    } else if(index == 1) {
        newNode->next = head;
        head = newNode;
    } else {
        int i = 1;
        Node *p = head;
        while(i < index - 1 && p != NULL) {
            p = p->next;
            i++;
        }
        if(p == NULL) {
            printf("Error: Invalid Index\n");
            return NULL;
        }
        newNode->next = p->next;
        p->next = newNode;
    }
    return head;
}

7. 在单链表中删除节点

从头节点开始遍历单链表,找到指定节点的前驱节点,将其指针指向后继节点,将该节点从内存中删除:

LinkedList deleteNode(LinkedList head, int val) {
    if(head == NULL) {
        printf("Error: List is Empty\n");
        return NULL;
    }
    Node *p = head;
    Node *pre = NULL;
    while(p != NULL && p->val != val) {
        pre = p;
        p = p->next;
    }
    if(p == NULL) {
        printf("Error: No Element Found\n");
    } else if(pre == NULL) {
        head = p->next;
        free(p);
    } else {
        pre->next = p->next;
        free(p);
    }
    return head;
}

示例说明

示例1

int main() {
    LinkedList head = initList();
    head = insertAtTail(head, 1);
    head = insertAtTail(head, 2);
    head = insertAtTail(head, 3);
    head = insertAtTail(head, 4);
    head = insertAtIndex(head, 2, 5);
    head = deleteNode(head, 3);
    traverseList(head);
    return 0;
}

输出:

1 5 2 4

示例2

int main() {
    LinkedList head = initList();
    printf("%d\n", isEmpty(head));
    head = insertAtTail(head, 1);
    head = insertAtTail(head, 2);
    printf("%d\n", length(head));
    traverseList(head);
    head = deleteNode(head, 3);
    head = deleteNode(head, 2);
    head = deleteNode(head, 1);
    printf("%d\n", isEmpty(head));
    traverseList(head);
    return 0;
}

输出:

1
2
1 2
Error: No Element Found
Error: No Element Found
1

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 超详细模拟实现单链表的基本操作建议收藏 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Excel无法桌面右键新建工作表怎么办 Excel无法桌面右键新建工作表解决方法

    这里是详细讲解“Excel无法桌面右键新建工作表怎么办 Excel无法桌面右键新建工作表解决方法”的完整攻略。 问题描述 当我在桌面上右键点击Excel图标,选择“新建工作表”时,发现工作表没有被新建出来。这是什么问题?有什么解决方法吗? 可能原因 这个问题有几种可能的原因,包括: Excel没有正确安装或受到病毒的侵扰; 你的系统或Excel设置发生了错误…

    other 2023年6月27日
    00
  • ie8/9下Activex控件无法加载的两种解决方法

    下面我将为大家详细讲解“ie8/9下Activex控件无法加载的两种解决方法”。 原因分析 在IE8/9浏览器下,Activex控件无法正常加载的问题主要有以下两个原因: 安全设置过高导致浏览器屏蔽了Activex控件。 IE8/9只能使用针对32位操作系统的Activex控件,而无法使用64位Activex控件。 解决方法 方法一:修改IE浏览器的安全设置…

    other 2023年6月25日
    00
  • switch续航版续航如何 switch续航版游玩时间介绍

    当涉及到Switch续航版的游玩时间,有几个因素需要考虑,包括游戏类型、屏幕亮度、网络连接和使用的功能。以下是一个完整的攻略,包含两个示例说明: 1. 游戏类型对续航时间的影响 不同类型的游戏对Switch续航版的电池寿命有不同的影响。例如,图形复杂、要求高性能的游戏(如《塞尔达传说:荒野之息》)会消耗更多的电池电量,而简单的像素游戏(如《超级马里奥奥德赛》…

    other 2023年10月19日
    00
  • 从头学习C语言之for语句和循环嵌套

    从头学习C语言之for语句和循环嵌套攻略 1. for语句的基本语法 for语句是C语言中最常用的循环结构之一,它可以重复执行一段代码块,直到满足指定的条件为止。for语句的基本语法如下: for (初始化表达式; 循环条件; 更新表达式) { // 循环体 } 其中,初始化表达式用于初始化循环变量,循环条件是一个逻辑表达式,当其为真时循环继续执行,更新表达…

    other 2023年7月28日
    00
  • C# WinForm遍历窗体控件的3种方法

    下面是详细讲解“C# WinForm遍历窗体控件的3种方法”的完整攻略。 1. 使用控件容器的Controls属性 在C# WinForm中,遍历窗体控件的一种常见方法就是使用控件容器的Controls属性。Controls属性是一个Control.ControlCollection类型的对象,可以用来获取一个控件容器中的所有子控件。 示例代码如下: // …

    other 2023年6月27日
    00
  • Windows XP加速设置之终极技巧篇

    这里给您详细讲解一下“Windows XP加速设置之终极技巧篇”的完整攻略。 操作步骤: 步骤 1:升级硬件 升级硬件是提升操作系统运行速度的必要步骤之一。例如,增加内存条、更换硬盘等方法都可以提升Windows XP的速度。另外,如果您有经济实力,可以考虑升级至Solid State Drive(SSD)硬盘。 步骤 2:关闭无用服务 根据用户的需求,关闭…

    other 2023年6月28日
    00
  • [matlab] 17.网格矩阵

    网格矩阵是MATLAB中的一个重要概念,用于表示二维或三维网格数据。以下是“[MATLAB]17.网格矩阵”的完整攻略: 创建网格矩阵 在MATLAB中,可以使用meshgrid函数来创建网格矩阵。meshgrid函数的语法如下: [X,Y] = meshgrid(x,y) 其中,x和y是向量,X和Y是网格矩阵。X和Y的大小相同,且X(i,j)和Y(i,j)…

    other 2023年5月5日
    00
  • mybatis之嵌套查询和嵌套结果有哪些区别

    MyBatis之嵌套查询和嵌套结果的区别 在使用MyBatis进行数据库操作时,嵌套查询和嵌套结果是两个常用的特性。它们可以帮助我们在查询数据库时获取更复杂的数据结构。下面将详细讲解嵌套查询和嵌套结果的区别,并提供两个示例说明。 嵌套查询 嵌套查询是指在一个查询语句中嵌套另一个查询语句,以获取更多的相关数据。嵌套查询可以通过使用MyBatis的<sel…

    other 2023年7月27日
    00
合作推广
合作推广
分享本页
返回顶部