C语言编写一个链表

yizhihongxing

以下是C语言编写一个链表的完整攻略:

概述

链表是一种基本数据结构,它是由一系列不连续的节点组成的。每个节点包含两部分,一部分是数据,一部分是指向下一个节点的指针。链表中的数据可以是任何类型的,如int、char、结构体等。链表有单向链表和双向链表两种类型,本文主要介绍单向链表。

相关操作

链表的基本操作包括插入、删除、查找等。下面介绍单向链表的几个基本操作:

链表节点的定义

typedef struct _ListNode
{
    int val;
    struct _ListNode* next;
}ListNode;

链表节点包含两部分,一部分是节点的值,另一部分是指向下一个节点的指针。

在链表头插入一个节点

ListNode* addAtHead(ListNode* head, int val)
{
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->val = val;
    newNode->next = head;
    return newNode;
}

上述函数实现在链表头插入一个节点。

在链表尾插入一个节点

ListNode* addAtTail(ListNode* head, int val)
{
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->val = val;
    newNode->next = NULL; 

    if (head == NULL) return newNode;

    ListNode* cur = head;
    while (cur->next != NULL) {
        cur = cur->next;
    }
    cur->next = newNode;
    return head;
}

上述函数实现在链表尾插入一个节点。

删除链表中第一个值为给定值的节点

ListNode* deleteNode(ListNode* head, int val)
{
    if (head == NULL) return NULL;
    if (head->val == val) return head->next;

    ListNode* cur = head;
    while (cur->next != NULL && cur->next->val != val) {
        cur = cur->next;
    }
    if (cur->next != NULL) {
        cur->next = cur->next->next;
    }
    return head;
}

上述函数实现删除链表中第一个值为给定值的节点。

示例

下面给出两个示例:

示例1

输入:head = [1,2,3,4,5], val = 3
输出:[1,2,4,5]

ListNode* head = NULL;
head = addAtTail(head, 1);
head = addAtTail(head, 2);
head = addAtTail(head, 3);
head = addAtTail(head, 4);
head = addAtTail(head, 5);

printList(head);
head = deleteNode(head, 3);
printList(head);

示例2

输入:head = [1,2,3,4,5], val = 6
输出:[1,2,3,4,5]

ListNode* head = NULL;
head = addAtTail(head, 1);
head = addAtTail(head, 2);
head = addAtTail(head, 3);
head = addAtTail(head, 4);
head = addAtTail(head, 5);

printList(head);
head = deleteNode(head, 6);
printList(head);

总结

本文介绍了C语言编写一个链表的基本操作,包括链表节点的定义、在链表头插入一个节点、在链表尾插入一个节点、删除链表中第一个值为给定值的节点等。同时给出了两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言编写一个链表 - Python技术站

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

相关文章

  • Android实现遮罩层(蒙板)效果

    当在Android应用中需要实现遮罩层(蒙板)效果时,可以使用以下步骤: 创建遮罩层布局:首先,在应用的布局文件中创建一个遮罩层布局。这个布局将覆盖在其他视图之上,用于实现遮罩效果。可以使用FrameLayout或RelativeLayout等布局容器来实现。 示例代码: <RelativeLayout android:id=\"@+id/m…

    other 2023年9月5日
    00
  • centos如何扩充/增加磁盘

    当然,我可以为您提供有关“CentOS如何扩充/增加磁盘”的完整攻略,以下是详细说明: CentOS如何扩充/增加磁盘 在CentOS系统中如果需要扩充或增加磁盘,可以通过以下步骤完成: 步骤1:创建新的虚拟磁盘 首先,需要在虚拟中创建一个新的虚拟磁盘。这可以通过虚拟机管理软件(如VMware或VirtualBox)完成。在创建新的虚拟磁盘时,需要注意选择合…

    other 2023年5月7日
    00
  • 关于r:为什么使用as.factor()而不是factor()

    以下是关于“关于R:为什么使用as.factor()而不是factor()”的完整攻略,包含两个示例说明。 为什么需要使用as.factor() 在R语言中,factor()函数将一个向量转换为因子。但是,如果我们使用factor()函数将一个字符向量转换为因子时,R语言会将字符向量的每个元素作为一个水平。这可能会导致我们得到一个不正确的因子。例如: &gt…

    other 2023年5月9日
    00
  • android 获取文件的扩展名和去掉文件扩展名的小例子

    当我们处理文件时,有时需要获取文件的扩展名或者去掉文件的扩展名。下面是一个使用Java语言的示例,演示如何获取文件的扩展名和去掉文件的扩展名。 示例1:获取文件的扩展名 String fileName = \"example.txt\"; String extension = \"\"; int dotIndex = …

    other 2023年10月13日
    00
  • excel中怎么使用index嵌套match函数?

    当在Excel中需要根据某个条件在数据范围中查找特定值时,可以使用INDEX和MATCH函数的嵌套。INDEX函数用于返回指定范围内的单元格的值,而MATCH函数用于查找某个值在指定范围内的位置。 下面是使用INDEX和MATCH函数嵌套的完整攻略: 基本语法: INDEX函数的基本语法如下: INDEX(range, row_num, [column_nu…

    other 2023年7月28日
    00
  • premiere怎么自定义动态拼贴效果预设? pr制作预设模板的技巧

    这里为大家详细讲解“premiere怎么自定义动态拼贴效果预设? pr制作预设模板的技巧”的完整攻略。 什么是动态拼贴效果预设? 在 Premiere Pro 中,动态拼贴效果预设可以简化剪辑过程中的重复操作。它可以是一组不同图层的集合,也可以是已经应用于一个图层上的特效集合。可以通过自定义动态拼贴效果预设功能,将一些已经制作好的效果集合在一起,以便在以后的…

    other 2023年6月25日
    00
  • C语言中字符串的存储方法

    在C语言中,字符串被视为是一串字符数组。字符串的存储方法有两种,分别是“字符数组存储”和“指针存储”。 一、字符数组存储 在C语言中,字符串可以用字符数组存储,字符数组中的最后一个元素一定是字符‘\0’。 例如: char str[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}; printf("%s", str)…

    other 2023年6月20日
    00
  • C++ namespace命名空间解析

    C++ namespace命名空间解析攻略 命名空间(namespace)是C++中用于组织代码的一种机制,它可以避免命名冲突并提供更好的代码可读性和可维护性。命名空间解析(namespace resolution)是指在使用命名空间中的成员时,明确指定所使用的命名空间。 1. 命名空间的定义和使用 在C++中,可以使用namespace关键字来定义命名空间…

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