首页 > 其他分享 >单链表的创建以及插入<上>

单链表的创建以及插入<上>

时间:2025-01-02 11:27:00浏览次数:3  
标签:单链 curnode 创建 list next 链表 插入 Student 节点

1:此次学习参考的是b站up主【【一听就懂】C语言单链表(合集)!学完C语言还没学会写单链表吗?一节课教你有头单链表的全部知识!】https://www.bilibili.com/video/BV1Mm4y1V7Ww?vd_source=fa5bfcb2d5af224272cc17f6b40b10c3

易错点

2.1 在   creatlist   和   creatNode   函数中,如果   malloc   分配内存失败,程序会打印错误信息并返回   NULL  。这是正确的处理方式,但实际使用中可能需要更详细的错误处理。

2.2

 在   push_back_student   和   ins_pos   函数中,如果链表为空(即   list   为   NULL  ),这些函数的行为可能不正确。特别是在   push_back_student   中,如果链表为空,  curnode   将是一个空指针,导致程序崩溃。

2.3

在   ins_pos   函数中,如果   pos   大于链表长度,插入操作可能会在链表尾部之后进行,这可能不是预期的行为。

2.4

 在   find   函数中,如果找到了匹配的值,返回节点指针;如果未找到,返回   NULL  。调用者需要正确处理这两种情况。

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

typedef int Data;
typedef struct Student {
    Data data;
    struct Student *next;
}Student;

// 创建链表头节点
Student* creatlist() {
    Student* head = malloc(sizeof(Student)); // 分配内存空间给头节点
    if (!head) { // 如果内存分配失败
        printf("creat head with failed"); // 打印错误信息
        return NULL; // 返回 NULL
    }
    memset(head,0,sizeof(Student)); // 将头节点初始化为0
    return head; // 返回头节点
}

// 创建新节点
Student* creatNode(Data val) {
    Student* node=malloc(sizeof(Student)); // 分配内存空间给新节点
    if (!node) { // 如果内存分配失败
        printf("creat with failed"); // 打印错误信息
        return NULL; // 返回 NULL
    }
    node->data=val; // 设置新节点的数据
    node->next=NULL; // 新节点的下一个节点指针初始化为NULL
    return node; // 返回新节点
}

// 头插入法
void push_front_student(Student* list,Data val) {
    Student* newnode = creatNode(val); // 创建一个新节点
    newnode->next = list->next; // 新节点的下一个节点是当前头节点的下一个节点
    list->next = newnode; // 头节点的下一个节点变为新节点,完成插入
}

// 尾插入法
void push_back_student(Student *list,Data val) {
    Student* curnode = list; // 从头节点开始遍历
    while (curnode->next) { // 遍历到链表的末尾
        curnode = curnode->next;
    }
    Student* newnode = creatNode(val); // 创建新节点
    curnode->next = newnode; // 将新节点插入到链表末尾
}

// 指定位置插入
void ins_pos(Student* list,int pos,Data data) {
    Student* curnode = list; // 从头节点开始遍历
    for (int i=0; i<pos && curnode->next; i++) { // 遍历到指定位置的前一个节点
        curnode = curnode->next;
    }
    Student* newnode = creatNode(data); // 创建新节点
    newnode->next = curnode->next; // 新节点的下一个节点是当前节点的下一个节点
    curnode->next = newnode; // 将新节点插入到当前节点之后
}

// 在指定节点后插入
void ins_item(Student* list,Student* item,Data val) {
    Student* newnode = creatNode(val); // 创建新节点
    newnode->next = item->next; // 新节点的下一个节点是指定节点的下一个节点
    item->next = newnode; // 将新节点插入到指定节点之后
}

// 查找指定值的节点
Student* find(Student* list,Data val) {
    Student* curnode = list->next; // 从头节点的下一个节点开始遍历,因为头节点通常不存储数据
    while (curnode) { // 遍历链表直到末尾
        if (curnode->data == val) { // 如果找到匹配的值
            return curnode; // 返回节点指针
        }
        curnode = curnode->next; // 移动到下一个节点
    }
    return NULL; // 如果未找到,返回 NULL
}

// 打印链表
void showList(Student* head) {
    Student* current = head->next; // 从头节点的下一个节点开始遍历,因为头节点通常不存储数据
    while (current != NULL) { // 遍历链表直到末尾
        printf("%d -> ", current->data); // 打印当前节点的数据
        current = current->next; // 移动到下一个节点
    }
    printf("NULL\n"); // 表示链表结束
}

// 主函数
int main() {
    Student* list = creatlist(); // 初始化链表头节点

    push_back_student(list,1); // 尾插入数据1
    push_back_student(list,2); // 尾插入数据2
    push_back_student(list,3); // 尾插入数据3
    push_back_student(list,4); // 尾插入数据4
    showList(list); // 打印链表

    ins_pos(list,0,99); // 在位置0插入数据99
    ins_pos(list,2,100); // 在位置2插入数据100
    ins_pos(list,3,93); // 在位置3插入数据93
    showList(list); // 打印链表
    Student* item = find(list,93); // 查找值为93的节点
    if (item) { // 如果找到节点
        ins_item(list,item,9999); // 在该节点后插入数据9999
    }
    showList(list); // 打印链表

    return 0; // 程序结束
}

标签:单链,curnode,创建,list,next,链表,插入,Student,节点
From: https://blog.csdn.net/mbvcxg/article/details/144792700

相关文章

  • 【Unity 环境插件】Autumn Valley - Level 丰富的自然元素,如秋季的树木、灌木、草地、
    AutumnValley-Level是一款专为Unity开发者设计的环境插件,旨在帮助快速创建美丽且具有沉浸感的秋季山谷景观。这个插件包含了丰富的自然元素,如秋季的树木、灌木、草地、岩石以及天气效果,可以在游戏中实现动态变化的秋季景观。无论是角色扮演游戏、冒险游戏、模拟类游戏,还......
  • 【Unity 植物与地形资源插件】Advanced Foliage Pack 2.0 丰富的自然植被素材和地形装
    AdvancedFoliagePack2.0是一款高质量的植物与地形资源插件,为Unity开发者提供了丰富的自然植被素材和地形装饰工具。该插件特别适合用于创建逼真的户外场景,如森林、草原和其他充满自然生机的环境。其出色的美术设计和优化的性能,使其成为开发开放世界、冒险类和模拟类游戏......
  • 如何使用NodeJS创建Web服务器?
    要使用Node.js创建一个简单的Web服务器,你需要使用Node.js的内置模块http。下面是一个简单的示例,展示如何使用这个模块来创建一个基本的Web服务器:安装Node.js:首先,确保你已经在你的计算机上安装了Node.js。你可以从Node.js官网下载并安装它。2.创建服务器文件:创建一个新的Jav......
  • 如何在 Ubuntu 22.04 上使用 Flask 创建 REST API 教程
    简介在本教程中,我们将解释如何使用Flask在Ubuntu服务器上创建你的第一个RESTAPI。RESTAPI(RepresentationalStateTransferApplicationProgrammingInterfaces)对于构建可扩展的Web应用程序至关重要。Flask是一个用于Python的微型Web框架,由于其简单性和灵......
  • 一个实例用全创建型模式
      目录:《一个实例讲完23种设计模式》当前:单件+抽象工厂+创建者+工厂方法需求:坦克大战创建两种坦克坦克类型射程速度b7070米时/70公里b5050米时/50公里设计说明1.抽象工厂(AbstractFActory)承担了创建部件的任务2.创建者(IBuilder)承担了讲部件组装的任务3.工厂方法(IF......
  • Linux 定时任务:轻松创建与精准执行
    Linux定时任务:轻松创建与精准执行在Linux系统的运维与自动化管理领域,定时任务扮演着举足轻重的角色。它能够让系统在预设的时间点或周期性时段,自动执行特定的脚本、命令,极大地减轻了管理员的工作负担,提升工作效率。接下来,就让我们深入探究Linux定时任务的创建与执行细......
  • 表的创建与删除:从理论到实践的全面指南
    title:表的创建与删除:从理论到实践的全面指南date:2025/1/1updated:2025/1/1author:cmdragonexcerpt:表是关系数据库的基本存储结构,承载着核心数据及其关联关系。在数据库设计与管理中,表的创建与删除是至关重要的操作,它直接影响数据库的结构、数据的完整性以及查询的......
  • 函数递归与栈帧的创建与销毁
    目录函数递归函数栈帧的创建与销毁概述 main函数栈帧的创建变量的创建如何传参子函数栈帧的创建函数如何返回值(1)子函数栈帧的销毁函数如何返回值(2)函数递归将复杂的问题层层化为与原问题相似的规模较小的问题。递----递推、归----回归 递推:函数一直......
  • (王道练习代码仓库)单链表操作
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>typedefintElemtype;//节点定义typedefstructLNode{ Elemtypedata; structLNode*next;}LNode,*LinkList;//求链表的长度intLenthList(LinkListhead){ LNode*p=head->next;......
  • 搜索插入位置(二分查找)
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输......