带头节点链表的前插法,后插法,顺序添加法

如何在Tagetik系统中抽取处理SAP系统财务数据 如何在Tagetik系统中抽取处理不同核算系统财务数据:以SAP为例,简单讲一下Tagetik对接SAP数据的基本情况 阅读详情
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct student
{
    long id;
    char name[32];
    char sex[8];
    int age;
    float math;
    struct student *next;//指向下一个节点的指针
}stu,*pstu;

stu *head;//全局变量在main函数执行之前初始化,指针默认初始化为NULL

//函数声明
stu *frontadd(stu *head);
stu *rearadd(stu *head);
stu *squadd(stu *head);
stu *delete(stu *head);
void print_list(stu *head);
void free_list(stu *head);

int main()
{
    int sel=0;
    //先给头节点申请内存空间,但不存值
    head=(stu *)malloc(sizeof(stu));
    if(NULL==head)
    {
        printf("head malloc failed\n");
        return -1;
    }
    head->next=NULL;//next指针必须赋空

    while(1)
    {
        printf("\t1:前插法添加节点\n\t2:后插法添加节点\n\t3:顺序添加节点\n\t4:删除节点\n\t5:查看节点\n\t6:退出\n");
        printf("请输入选项:");
        scanf("%d",&sel);
        getchar();//取出缓冲区中的'\n'
        switch(sel)
        {
            case 1:
                head=frontadd(head);
                break;
            case 2:
                head=rearadd(head);
                break;
            case 3:
                head=squadd(head);
                break;
            case 4:
                head=delete(head);
                break;
            case 5:
                print_list(head);
                break;
            case 6:
                //释放链表内存
                free_list(head);
                exit(0);
            default:
                printf("reinput 1-6\n");        
        }
    }
    return 0;
}
stu *frontadd(stu *head)
{
    if(NULL==head)
    {
        printf("head null\n");
        return NULL;
    }

    while(1)
    {
        stu *s=NULL;
        s=(stu *)malloc(sizeof(stu));
        if(NULL==s)
        {
            printf("s malloc failed\n");
            return NULL;
        }
        s->next=NULL;
        printf("请输入学号:\n");
        scanf("%ld",&s->id);
        printf("请输入姓名:\n");
        scanf("%s",s->name);
        printf("请输入性别:\n");
        scanf("%s",s->sex);
        printf("请输入年龄:\n");
        scanf("%d",&s->age);
        printf("请输入数学成绩:\n");
        scanf("%f",&s->math);

        s->next=head->next;
        head->next=s;

        char judge;
        while(getchar()!='\n');//清空缓冲区
        printf("是否继续添加(y/n):");
        judge=getchar();
        if(judge=='y')
        {
            continue;
        }
        else
        {
            break;
        }
    }

    return head;
}

stu *rearadd(stu *head)
{
    if(NULL==head)
    {
        printf("head null\n");
        return NULL;
    }

    while(1)
    {
        stu *s=NULL;
        s=(stu *)malloc(sizeof(stu));
        if(NULL==s)
        {
            printf("s malloc failed\n");
            return NULL;
        }
        s->next=NULL;
        printf("请输入学号:\n");
        scanf("%ld",&s->id);
        printf("请输入姓名:\n");
        scanf("%s",s->name);
        printf("请输入性别:\n");
        scanf("%s",s->sex);
        printf("请输入年龄:\n");
        scanf("%d",&s->age);
        printf("请输入数学成绩:\n");
        scanf("%f",&s->math);

        //添加节点
        stu *p=NULL;
        stu *q=NULL;
        q=p=head;
        while(p!=NULL)
        {
            q=p;
            p=p->next;
        }

        q->next=s;

        char judge;
        while(getchar()!='\n');//清空缓冲区
        printf("是否继续添加(y/n):");
        judge=getchar();
        if(judge=='y')
        {
            continue;
        }
        else
        {
            break;
        }
    }
    return head;
}

stu *squadd(stu *head)
{
    if(NULL==head)
    {
        printf("head null\n");
        return NULL;
    }

    while(1)
    {
        stu *s=NULL;
        s=(stu *)malloc(sizeof(stu));
        if(NULL==s)
        {
            printf("s malloc failed\n");
            return NULL;
        }
        s->next=NULL;
        printf("请输入学号(大于0):\n");
        scanf("%ld",&s->id);
        printf("请输入姓名:\n");
        scanf("%s",s->name);
        printf("请输入性别:\n");
        scanf("%s",s->sex);
        printf("请输入年龄:\n");
        scanf("%d",&s->age);
        printf("请输入数学成绩:\n");
        scanf("%f",&s->math);

        //添加节点
        stu *p=NULL;
        stu *q=NULL;
        q=p=head;
        head->id=0;
        while((p!=NULL)&&(s->id>p->id))
        {
            q=p;
            p=p->next;
        }
        q->next=s;
        s->next=p;        

        char judge;
        while(getchar()!='\n');//清空缓冲区
        printf("是否继续添加(y/n):");
        judge=getchar();
        if(judge=='y')
        {
            continue;
        }
        else
        {
            break;
        }
    }
    return head;
}

stu *delete(stu *head)
{
    if(NULL==head)
    {
        printf("delete head null\n");
        return NULL;
    }

    while(1)
    {
        if(NULL==head->next)
        {
            printf("valid list empyt\n");
            return head;
        }

        long x=0;
        printf("请输入删除的数据:\n");
        scanf("%ld",&x);

        stu *p=NULL;
        stu *q=NULL;
        q=p=head;
        //q=p=head->next;
        while((p!=NULL)&&(p->id!=x))
        {
            q=p;
            p=p->next;
        }

        if(NULL==p)
        {
            printf("this %ld not in list\n",x);
            return head;
        }
        else
        {
            q->next=p->next;
            free(p);
            p=NULL;
        }

        char judge;
        printf("是否继续删除(y/n):");
        while(getchar()!='\n');
        judge=getchar();
        if(judge=='y')
        {
            continue;
        }
        else
        {
            break;
        }
    }
    return head;
}

void print_list(stu *head)
{
    if(NULL==head)
    {
        printf("head null\n");
        return;
    }

    if(NULL==head->next)
    {
        printf("valid list empty\n");
        return;
    }

    stu *p=NULL;
    p=head->next;
    printf("学号\t姓名\t性别\t年龄\t数学\n");
    while(p!=NULL)
    {
        printf("%ld\t%s\t%s\t%d\t%.2f\n",p->id,p->name,p->sex,p->age,p->math);
        p=p->next;
    }
    return;
}

void free_list(stu *head)
{
    if(NULL==head)
    {
        printf("head null\n");
        return;
    }

    stu *p=NULL;
    stu *q=NULL;

    p=head;
    while(p!=NULL)
    {
        q=p;
        p=p->next;
        free(q);
        q=NULL;
    }

    return;
}
SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例) 本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。 阅读详情

相关推荐

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

链表:头部插入一个节点

将head声明为全局变量 #include<iostream> using namespace std; struct Node { int data; Node* next; }; Node* head;//将head声明为全局变量 void Insert(int x) { Node* temp = new Node; temp -> data = x; temp -> next = head; head = temp; } void Prin

EDGNB6666的博客 988

如何利用东南大学齿轮箱数据集进行故障诊断?从数据采集到模型训练全流程解析

本文详细解析如何利用东南大学齿轮箱数据集进行故障诊断,涵盖从数据采集到模型训练的全流程。通过信号预处理、特征工程构建及多种机器学习模型对比,帮助开发者高效实现工业设备健康管理。特别适合希望将AI技术应用于工业场景的Python开发者。

m2n3b4v5c6的博客 376

C语言结构体链表 节点插入方法(从前和从后)

1.如果是从头节点前插入,则直接令新节点的下一个等于头节点,然后返回新节点即可。第三个参数是要插入的节点的位置,用结构体的值来表示(实际项目可自由更改)第四个参数是插入方式(前AHEAD/后BEHIND)第一步那么新节点的NEXT等于P->NEXT。第一步那么新节点的NEXT等于P->NEXT。第二步P的NEXT指向新节点。第二步P的NEXT指向新节点。第二个参数是要插入的新节点地址。第一个参数是原链表头节点地址。...

m0_52870614的博客 6963

39-Halcon-- fit_primitives_object_model_3d函数功能(从3D数据中提取几何基元)

Halcon算子fit_primitives_object_model_3d工业应用精要 该算子专为3D几何特征提取设计,支持平面、球体、圆柱等基元拟合。核心优势: 参数化输出:返回几何元素的数学参数(如平面方程、球心半径) 智能控制:通过max_dist、min_size等参数调节拟合精度 工业场景适配:针对薄壁件、孔系等提供专用优化方案 典型应用流程: 数据预处理(点云降噪/采样) 基元类型与参数设置 多阶段拟合(先平面后圆柱) 几何精度验证 误差控制在0.1%-1.2%范围内(视点云密度而定),适用于

weixin_45590420的博客 1161

OpenOCD入门到精通:第 4 章 配置文件体系详解

本文深入解析OpenOCD配置文件的体系结构和工作机制。首先介绍了配置文件的搜索路径优先级和加载顺序,以及配置阶段与运行阶段的区别。然后详细分析了interface配置文件的适配器参数调优方法,包括ST-Link、CMSIS-DAP和FTDI等常见调试器的配置示例。最后重点讲解了target配置文件的核心结构,包括TAP声明、目标创建和工作区设置等关键步骤,并以stm32f1x为例展示了完整的配置流程。通过本文可以全面了解OpenOCD配置文件的分层设计理念和参数化配置方法。

从事嵌入式linux android驱动开发,拥有全栈能力 594

插入排序算法详解(从前往后)

本篇讲述的插入排序算法中排序的范围为从前往后 当把第一个数当成升序数组时,得到结果为数组中的所有数符合升序规律 当把第一个数当成降序数组时,得到结果为数组中的所有数符合降序规律

SSS4362的博客 1206

【数字IC刷题】华为海思数字IC笔试题(3)详细解析版

【数字IC刷题】华为海思数字IC笔试题(3)详细解析版

MoorePlus的博客 2370

单链表的前插法和后插法创建

根据结点插入位置的不同,链表的创建方法可分为前插法和后插法 前插法 前插法是通过将新节点逐个插入链表的头部(头节点之后)来创建链表,每次申请一个新节点,读入相应的数据元素值,然后将新节点插入到头节点之后。 后插法 后插法是通过将新节点逐个插入到链表的尾部来创建链表。同前插法一样,每次申请一个新节点,读入相应的数据元素值。不同的是,为了使新节点能够插入到表尾,需要增加一个尾指针 r 指向链表的尾结点。 前插法创建单链表过程示意图 后插法创建单链表过程示意图 C++代码 #include<iostre

weixin_47700137的博客 1万+

【红外技术】DDE算法:HE在红外图像可视化上的应用(附源码)

并且数据一般是以 8 的整数倍的位宽在电子系统中应用,因此大多数的显示器的显示位宽为 8bit,共 256 个灰阶。为了使红外图像可视化,因此需要一种“数据压缩”技术,还需要既可能的不丢失原始图像信息。HE后的图像直方图分布比较均匀离散,图像对比度好。但是HE算法只是适用某些图像,它是将灰度集中区域进行拉伸得到,也会放大该集中区域的噪声,它是一种“不公平”的映射。以下是红外细节增强算法的演示,很明显右边的图像,展现了更多的图像细节,对于小目标的观测非常友好。文章已于2019-12-02修改。

sunwindl91181的博客 911

YOLOv8与UNetV2融合:一种面向目标检测与图像分割的混合方法【附核心代码】

我们提出了一种基于YOLOv8和UNetV2相结合的混合架构。该架构利用YOLOv8作为主干进行目标检测,同时在YOLOv8的特征提取过程中,引入UNetV2来进行图像分割任务的增强。在该架构中,YOLOv8负责大范围目标检测和位置预测,而UNetV2则在检测网络的特征图基础上,通过其高效的上下文信息提取和细节恢复能力,进一步优化分割任务。在本文中,我们提出了一种改进YOLOv8的方法,通过引入图像分割网络UNetV2来提高图像分割检测性能。

一键难忘的博客 3525

如何实现单链表中结点的前插操作?

学过数据结构的小伙伴们都知道,如果想要对单链表进行插入操作,一般都需要寻找到要插入结点的前一个结点进行后插入操作,即 s->next = p->next; //s为插入结点,p为前一个结点 p->next = s; 但是如果要求给定一个结点p,要求在这个结点p之前前插一个结点s该怎么办呢,我们是无法找到结点p之前结点的指针的,所以按照正常的思路是无法进行插入的。 这时我们可以改变思路,偷天换日,巧妙解题,将 结点s 依旧插入 结点p 的之后, 再对结点s和p进行值交换,这样就完成了

西小庄村高伟 的博客 5091

PCL ICP算法实现点云精配准【2026最新版】

PCL1.14.1 及之前版本所实现的迭代最近点ICP算法。博客长期更新,本文最新更新时间为:2026年4月17日。

点云侠的博客 31万+

不带头节点链表的前插法,后插法,顺序添加法

C语言创建链表的方法:前插法,后插法,顺序添加法。

fengjunwang1980的专栏 1116

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据结构——创建一个带头节点的单链表(C语言)

基础的单链表的构建,以及前插法、后插法在输入数据时的应用。还有一些细小的不同引发的非法访问及其解决方法。

weixin_73849400的博客 7391

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

链表笔记 (前插法 后插法 头插法 尾插法)

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

will_wu99的博客 1687

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

(详解)数据结构线性表的创建——前插法、后插法

前插法又称头插法,后插法又称尾插法。 前插法与后插法属于链表的创建方法。 链表的创建与顺序表不同,链表是一种动态结构。整个可用存储空间可以为多个 链表共同享用,每个链表不需要像顺序表那样提前分配好占用空间,而是由系统按照需求即使生成。 即从空表的初始化后,依次建立各元素结点,并逐个插入链表。

StarPrayers.的博客 4030

单链表的初始化、建立(前插法/头插法,后插法/尾插法)、遍历和销毁

结构体类型 typedef struct Lnode{ //声明节点的数据类型和指针类型 ElemType data; //节点的数据域 struct Lnode *next; //节点的指针域 }SqList,*Linklist; //Linklist指向结构体Lnode的指针类型 单链表的初始化 分配一块内存空间,建立一个空链表 Status InitList_Sq(SqList *L) //初始.

髣髴兮若轻云之蔽月 1713

数据结构,单链表后插法 C++

#include<iostream> using namespace std; #include<stdlib.h> #define ok 1 #define error 0 typedef int ElemType; typedef int status; //单链表的存储结构 typedef struct LNode{ ElemType data;//结点的数据域 struct LNode *next; //结点的指针域 }LNode,*LinkList; //定义结

一季南凉的博客 1260

C语言实现单链表的前后插

#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;typedef struct List{ int data;    //数据域 struct List *next;         //指针域} List;void HeadCreatList(List *L) //前插法建立链表{ List *s;                //不用像后插法...

givemeway 5059

数据结构——单链表基本操作实现 (c++)

单链表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这里存储单元可以是连续的,也可以是不连续的),为了表示每个数据元素a与其直接后继数据元素之间的逻辑关系,除了存储信息本身外还要存储一个指示其直接后继的信息(地址).这两部分信息组成数据元素a的存储映像称为结点,它包括两个域:存储信息的称为数据域,存储直接后继存储地址的域称为指针域,指针域中存储的信息称作指针或链。

weixin_74794504的博客 3400

单链表的创建,删除,插入,查找及源码(c++实现)

单链表节点的结构体 typedef struct LNode{ ElemType data;//节点的数据域 struct LNode *next; //节点的指针域---(结构体自引用),指向结构体的指针,指向同一类型不同结构 }LNode,*LinkList; 创建单链表 前插法 因为每次插入在链表的头部,所以应该逆序输入数据 void createlist(LinkList &L,int n,char b[]){ L=new Lnode; L->next=NULL;//创建一个

weixin_44226752的博客 2418

单链表的插入和删除节点操作

插入操作需要修改两个指针属性,删除操作只需要修改一个指针属性。插入操作s.next=s语句与s.next=p.next顺序不能颠倒,不然会操作错误。·输入元素值赋给新结点*p的数据域;·将新结点*p插入尾结点*r之后;·尾指针r指向新的尾结点*P。在单链表中,插入和删除节点是最常用的操作。·输入元素值赋给新结点*p的数据域;.将新结点*p插入到头结点之后。3>被删除的节点,将不会有其他的指向,会被垃圾回收机制回收。删除节点操作:1>我们找到需要删除的这个节点的前一个节点。·生成一个新结点*p;

算法与编程之美 511

单链表操作实现getelem_线性表的实现和操作

1.顺序表(顺序存储)对于非空的线性表和线性结构,有以下特点:1.存在唯一的一个被称作”第一个“的数据元素2.存在唯一一个被称作”最后一个“的数据元素3.除了第一个之外,结构中的每个数据元素均有一个前驱4.除了最后一个之外,结构中的每个数据元素都有一个后继。顺序链表的实现:0.定义最大长度#define MAXSIZE 100 #define OK 1 #define ERROR 0创建表结构//...

weixin_28864057的博客 2760

数据结构单链表基本操作

1.定义 相比较于顺序表,单链表在内存中存储数据时是不连续的,可以说是一种见缝插针的方式。因为存储时是不连续存储,因此在每一个节点都需要一个指向下一个节点的指针,如此才能把每一个节点串起来,形成一个链表。 2.基本操作 1.初始化链表 2.创建链表(头插法或尾插法) 3.插入节点(前插法或后插法) 4.删除节点 5.查找节点(按序号查找或按值查找) 6.遍历链表 7.释放链表 3.Show Code #include <stdio.h> #include <stdlib.h> #

polkmn666的博客 1765

Python实现单链表,顺序表

图文解析-python实现单链表和顺序表的原理,简单易学

m0_64397715的博客 1245
上一篇: 不带头节点链表的前插法,后插法,顺序添加法
下一篇: C语言数组方式实现 直接插入,冒泡排序,选择排序
卫水金波
博客等级 码龄12年 73粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值