c: CLion 2023.1.1

news2024/11/19 22:34:04

/**
# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:https://www.learnc.net/c-data-structures/c-linked-list/
# 描述:https://blog.jetbrains.com/clion/2016/05/keep-your-code-documented/
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : CLion 2023.1.1 c17  windows 10
# Datetime  : 2023/11/11 6:10
# User      : geovindu
# Product   : CLion
# Project   : ctest
# File      : geovindu.c
# explain   : 学习
*/

//
// Created by geovindu on 2023/11/11.
//

#include "../includes/geovindu.h"

/**!
 * @brief
 * @param data
 *
 */
typedef void (*callback)(node* data);

/**
* @brief create a new node
    initialize the data and next field
    return the newly created node
* @param data
* @param next
@return
*/
node* create(int data,node* next)
{
    node* new_node = (node*)malloc(sizeof(node));
    if(new_node == NULL)
    {
        printf("Error creating a new node.\n");
        exit(0);
    }
    new_node->data = data;
    new_node->next = next;

    return new_node;
}

/**
  @brief  add a new node at the beginning of the list
  @param head
  @param data
*/
node* prepend(node* head,int data)
{
    node* new_node = create(data,head);
    head = new_node;
    return head;
}

/**
 *@brief   add a new node at the end of the list
 * @param head
 * @param data
*/
node* append(node* head, int data)
{
    if(head == NULL)
        return NULL;
    /* go to the last node */
    node *cursor = head;
    while(cursor->next != NULL)
        cursor = cursor->next;

    /* create a new node */
    node* new_node =  create(data,NULL);
    cursor->next = new_node;

    return head;
}

/**
 @brief insert a new node after the prev node
 @param head
 @param data
 @param prev
 @return
*/
node* insert_after(node *head, int data, node* prev)
{
    if(head == NULL || prev == NULL)
        return NULL;
    /* find the prev node, starting from the first node*/
    node *cursor = head;
    while(cursor != prev)
        cursor = cursor->next;

    if(cursor != NULL)
    {
        node* new_node = create(data,cursor->next);
        cursor->next = new_node;
        return head;
    }
    else
    {
        return NULL;
    }
}

/**
  *@brief  insert a new node before the nxt node
  *@param head
  * @param data
  * @param nxt
*/
node* insert_before(node *head, int data, node* nxt)
{
    if(nxt == NULL || head == NULL)
        return NULL;

    if(head == nxt)
    {
        head = prepend(head,data);
        return head;
    }

    /* find the prev node, starting from the first node*/
    node *cursor = head;
    while(cursor != NULL)
    {
        if(cursor->next == nxt)
            break;
        cursor = cursor->next;
    }

    if(cursor != NULL)
    {
        node* new_node = create(data,cursor->next);
        cursor->next = new_node;
        return head;
    }
    else
    {
        return NULL;
    }
}

/**
  *@brief  traverse the linked list
  * @param head
  * @param f
*/
void traverse(node* head,callback f)
{
    node* cursor = head;
    while(cursor != NULL)
    {
        f(cursor);
        cursor = cursor->next;
    }
}
/**
 *  @brief remove node from the front of list
 *  @param head

*/
node* remove_front(node* head)
{
    if(head == NULL)
        return NULL;
    node *front = head;
    head = head->next;
    front->next = NULL;
    /* is this the last node in the list */
    if(front == head)
        head = NULL;
    free(front);
    return head;
}

/**
 *@brief   remove node from the back of the list
 * @param head
*/
node* remove_back(node* head)
{
    if(head == NULL)
        return NULL;

    node *cursor = head;
    node *back = NULL;
    while(cursor->next != NULL)
    {
        back = cursor;
        cursor = cursor->next;
    }

    if(back != NULL)
        back->next = NULL;

    /* if this is the last node in the list*/
    if(cursor == head)
        head = NULL;

    free(cursor);

    return head;
}

/**
  *@brief  remove a node from the list
  * @param head
  * @param nd
  *
*/
node* remove_any(node* head,node* nd)
{
    if(nd == NULL)
        return NULL;
    /* if the node is the first node */
    if(nd == head)
        return remove_front(head);

    /* if the node is the last node */
    if(nd->next == NULL)
        return remove_back(head);

    /* if the node is in the middle */
    node* cursor = head;
    while(cursor != NULL)
    {
        if(cursor->next == nd)
            break;
        cursor = cursor->next;
    }

    if(cursor != NULL)
    {
        node* tmp = cursor->next;
        cursor->next = tmp->next;
        tmp->next = NULL;
        free(tmp);
    }
    return head;

}
/**
 *@brief   display a node
 * @param p
 *
*/
void display(node* n)
{
    if(n != NULL)
        printf("%d ", n->data);
}

/**
 *@brief   Search for a specific node with input data

    return the first matched node that stores the input data,
    otherwise return NULL
 *@param head
 * @param data
*/
node* search(node* head,int data)
{

    node *cursor = head;
    while(cursor!=NULL)
    {
        if(cursor->data == data)
            return cursor;
        cursor = cursor->next;
    }
    return NULL;
}

/**
 *@brief   remove all element of the list
 * @param head
 *
*/
void dispose(node *head)
{
    node *cursor, *tmp;

    if(head != NULL)
    {
        cursor = head->next;
        head->next = NULL;
        while(cursor != NULL)
        {
            tmp = cursor->next;
            free(cursor);
            cursor = tmp;
        }
    }
}
/**
 *@brief   return the number of elements in the list
 * @param head
*/
int count(node *head)
{
    node *cursor = head;
    int c = 0;
    while(cursor != NULL)
    {
        c++;
        cursor = cursor->next;
    }
    return c;
}
/**
 *@brief   sort the linked list using insertion sort
 * @param head
*/
node* insertion_sort(node* head)
{
    node *x, *y, *e;

    x = head;
    head = NULL;

    while(x != NULL)
    {
        e = x;
        x = x->next;
        if (head != NULL)
        {
            if(e->data > head->data)
            {
                y = head;
                while ((y->next != NULL) && (e->data> y->next->data))
                {
                    y = y->next;
                }
                e->next = y->next;
                y->next = e;
            }
            else
            {
                e->next = head;
                head = e ;
            }
        }
        else
        {
            e->next = NULL;
            head = e ;
        }
    }
    return head;
}

/**
  *@brief  reverse the linked list
  * @param head
*/
node* reverse(node* head)
{
    node* prev    = NULL;
    node* current = head;
    node* next;
    while (current != NULL)
    {
        next  = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    head = prev;
    return head;
}
/**
   *@brief display the menu
*/
void menu()
{
    printf("--- C Linked List Demonstration --- \n\n");
    printf("0.menu\n");
    printf("1.prepend an element\n");
    printf("2.append an element\n");
    printf("3.search for an element\n");
    printf("4.insert after an element\n");
    printf("5.insert before an element\n");
    printf("6.remove front node\n");
    printf("7.remove back node\n");
    printf("8.remove any node\n");
    printf("9.sort the list\n");
    printf("10.Reverse the linked list\n");
    printf("-1.quit\n");

}

/**
 * @brief 显示
 */
void displaynode()
{
    int command = 0;
    int data;

    node* head = NULL;
    node* tmp = NULL;
    callback disp = display;

    menu();
    while(1)
    {
        printf("\nEnter a command(0-10,-1 to quit):");
        scanf("%d",&command);

        if(command == -1)
            break;
        switch(command)
        {
            case 0:
                menu();
                break;
            case 1:
                printf("Please enter a number to prepend:");
                scanf("%d",&data);
                head = prepend(head,data);
                traverse(head,disp);
                break;
            case 2:
                printf("Please enter a number to append:");
                scanf("%d",&data);
                head = append(head,data);
                traverse(head,disp);
                break;
            case 3:
                printf("Please enter a number to search:");
                scanf("%d",&data);
                tmp = search(head,data);
                if(tmp != NULL)
                {
                    printf("Element with value %d found.",data);
                }
                else
                {
                    printf("Element with value %d not found.",data);
                }
                break;
            case 4:
                printf("Enter the element value where you want to insert after:");
                scanf("%d",&data);
                tmp = search(head,data);
                if(tmp != NULL)
                {
                    printf("Enter the element value to insert after:");
                    scanf("%d",&data);
                    head = insert_after(head,data,tmp);
                    if(head != NULL)
                        traverse(head,disp);
                }
                else
                {
                    printf("Element with value %d not found.",data);
                }
                break;
            case 5:
                printf("Enter the element value where you want to insert before:");
                scanf("%d",&data);
                tmp = search(head,data);
                if(tmp != NULL)
                {
                    printf("Enter the element value to insert before:");
                    scanf("%d",&data);
                    head = insert_before(head,data,tmp);

                    if(head != NULL)
                        traverse(head,disp);
                }
                else
                {
                    printf("Element with value %d not found.",data);
                }
                break;
            case 6:
                head = remove_front(head);
                if(head != NULL)
                    traverse(head,disp);
                break;
            case 7:
                head = remove_back(head);
                if(head != NULL)
                    traverse(head,disp);
                break;
            case 8:
                printf("Enter the element value to remove:");
                scanf("%d",&data);
                tmp = search(head,data);
                if(tmp != NULL)
                {
                    remove_any(head,tmp);
                    if(head != NULL)
                        traverse(head,disp);
                }
                else
                {
                    printf("Element with value %d not found.",data);
                }
                break;
            case 9:
                head = insertion_sort(head);
                if(head != NULL)
                    traverse(head,disp);
                break;
            case 10:
                head = reverse(head);
                if(head != NULL)
                    traverse(head,disp);
                break;
        }

    }
    dispose(head);
}

/**
# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : CLion 2023.1.1 c17  windows 10
# Datetime  : 2023/11/11 6:09
# User      : geovindu
# Product   : CLion
# Project   : ctest
# File      : geovindu.c
# explain   : 学习
*/
//
// Created by geovindu on 2023/11/11.
//

#ifndef CTEST_GEOVINDU_H
#define CTEST_GEOVINDU_H

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

/**
 * @brief
 *
 */
typedef struct node
{
    /**
     * @brief
     */
    int data;
    /**
     * @brief
     *
     */
    struct node* next;
} node;

/**
 * @brief 显示
 */
void displaynode();



#endif //CTEST_GEOVINDU_H

调用:

/**
# encoding: utf-8
# 版权所有 2013 涂聚文有限公司
# 许可信息查看:linked list
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : CLion 2023.1.1 c17  window10
# Datetime  : 2023 11.11
# User      : geovindu
# Product   : ctest
# Project   : ctest
# File      : main.c
# explain   : 学习
*/
#include <stdio.h>
#include "includes/geovindu.h"


/**
 * @brief
 * @return
 */
int main() {

    SetConsoleOutputCP(CP_UTF8);//终端中文乱码问题
    printf("Hello, World!涂聚文!\n");
    displaynode();

    return 0;
}

输出:

结构化文件夹,调用头文件即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年10 种用于最佳稳定扩散最佳方案

在过去的一年里&#xff0c;您可能已经看到了很多关于 ChatGPT 和其他 AI 自动纹理的新闻。但是&#xff0c;页面&#xff08;或屏幕&#xff09;上的文字远非现代组织和设计师使用人工智能的唯一方式。Stable Diffusion 等工具可帮助您创建令人惊叹的 AI 图像&#xff0c;供个…

CS224W5.1——消息传递和节点分类

从之前的文中&#xff0c;学习了如何使用图表示学习进行节点分类。在这节中&#xff0c;将讨论另一种方法&#xff0c;消息传递。将引入半监督学习&#xff0c;利用网络中存在的相关性来预测节点标签。其中一个关键概念是集体分类&#xff0c;包括分配初始标签的局部分类器、捕…

数据库安全:InfluxDB 未授权访问-Jwt验证不当 漏洞.

数据库安全&#xff1a;InfluxDB 未授权访问-Jwt验证不当 漏洞. InfluxDB 是一个开源分布式时序&#xff0c;时间和指标数据库。其数据库是使用 Jwt 作为鉴权方式&#xff0c;在用户开启认证时&#xff0c;如果在设置参数 shared-secret 的情况下&#xff0c;Jwt 认证密钥为空…

无人机航迹规划MATLAB:七种优化算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

Docker修改容器内部文件的三种方法

为啥要记录呀 今天在修改Docker内部文件的时候&#xff0c;安装vim居然失败了&#xff0c;在执行apt-get update时一直有几个404&#xff0c;解决无果&#xff0c;最后放弃安装vim&#xff0c;将文件拷贝出来修改&#xff0c;然后再拷贝到docker内部。记录一下如何修改Docker内…

软件测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】(web+app+h5+小程序)

前言&#xff1a; ​​大家好&#xff0c;我是阿里测试君。 最近很多小伙伴都在面试&#xff0c;但是对于自己的项目经验比较缺少。阿里测试君再度出马&#xff0c;给大家找了一个非常适合练手的软件测试项目&#xff0c;此项目涵盖web端、app端、h5端、小程序端&#xff0c;…

现在个人想上架微信小游戏已经这么难了吗...

点击上方亿元程序员关注和★星标 引言 大家好&#xff0c;最近我突然想起来我还有一款微信小游戏还没有上架&#xff0c;于是捣鼓了一天把游戏完善了一下&#xff0c;然后准备提交审核&#xff0c;却发现异常的艰难… 1.为什么难&#xff1f; 相信大家都大概知道&#xff0c…

【Github】git clone命令下载文件中途停止

方法一&#xff1a; 使用git clone命令下载github上的源代码时&#xff0c;有时文件下载到一定百分比时就停止不动&#xff0c; 这是因为我们所下载的文件很大&#xff0c;超过了git预先分配的Postbuffer容量&#xff0c;所以一直卡在那里。可以使用以下命令查看当前Postbuffe…

Docker和镜像安装

2.1、Docker安装 2.1.1、检查环境 Docker运行环境要求系统为64位、Linux系统内核版本为 3.8以上 查看自己虚拟机的内核&#xff1a; 2.1.2、搭建gcc环境&#xff08;gcc是编程语言译器&#xff09; yum -y install gcc yum -y install gcc-c 2.1.3、安装需要的软件包 yu…

合成数据如何改变制造业

人工智能正在工厂车间使用&#xff0c;以识别生产线中的低效率。它可以有效地预测设备何时需要维护&#xff0c;以避免停机。人工智能被用于发现产品中的缺陷。 为了完成所有这些工作&#xff0c;使用从人工智能应该学习的过程中收集的数据来创建或训练模型。对于缺陷识别&…

音频——解析 PCM 数据

文章目录 生成 PCM 数据16bit16bit mono16bit stereo16bit 4 channel16bit 8 channel24bit解析 PCM 数据解析 24bit 数据程序源码生成 PCM 源码解析 PCM 源码生成 PCM 数据 16bit 16bit mono int 48k_16bit_modo[] = {0, 4276, 8480, 12539, 16383, 19947, 23169, 25995, 28…

Cross-Origin跨站问题详解(跨站请求、跨站cookie)

背景&#xff1a;我部署frontend和backend到两个不同的docker容器&#xff0c;前端路径为http://localhost:3000&#xff0c;后端路径为http://localhost:4000。我设置了用户登录功能&#xff0c;并使用cookie进行session管理。当我的前端登录时&#xff0c;创建了一个session&…

【LeetCode笔试题】27.移除元素

问题描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新…

华为防火墙vrrp+hrp双机热备主备备份(两端为交换机)

默认上下来全两个vrrp主都是左边 工作原理&#xff1a; vrrp刚开机都是先initialize状态&#xff0c;然后切成active或standb状态。 hrp使用18514端口&#xff0c;且用的单播&#xff0c;要策略放行&#xff0c;由主设备发hrp心跳报文 如果设备为acitve状态时自动优先级为65…

计蒜客详解合集(2)期

目录 T1126——单词倒排 T1617——地瓜烧 T1612——蒜头君的数字游戏 T1488——旋转单词 T1461——校验信用卡号码 T1437——最大值和次大值 T1126——单词倒排 超级水的一道题&#xff0c;和T1122类似但更简单&#xff0c;分割后逆序输出即可~ 编写程序&#xff0c;读入…

什么是UV贴图?

UV 是与几何图形的顶点信息相对应的二维纹理坐标。UV 至关重要&#xff0c;因为它们提供了表面网格与图像纹理如何应用于该表面之间的联系。它们基本上是控制纹理上哪些像素对应于 3D 网格上的哪个顶点的标记点。它们在雕刻中也很重要。 为什么UV映射很重要&#xff1f; 默认情…

如果有一款专门用于3D纹理贴图的工具,大家会愿意用吗?

专业建模软件通常具有丰富的功能和工具&#xff0c;能够帮助用户进行三维建模、模拟分析、可视化呈现等多个方面的工作&#xff0c;几乎可满足用户所有的建模相关工作。 1、专业建模软件的使用门槛 学习曲线陡峭&#xff1a;专业建模软件通常需要较长时间来学习和掌握&#xf…

实力进阶,再攀高峰!触想智能获评国家级专精特新“小巨人”企业

近日&#xff0c;触想智能收获工业和信息化部颁发的专精特新“小巨人”企业证书&#xff0c;成功跻身全国中小企业实力评优最高梯队。 此项荣誉&#xff0c;不仅是国家权威对触想智能十余年潜心耕耘的深度回响&#xff0c;也进一步激发触想持续奋发、不懈探索的成长底气。 触想…

python 字典Dict

一种序列类型&#xff0c;使用键-值&#xff08;key-value&#xff09;存储&#xff0c;具有极快的查找速度。 目录 key的特性 创建字典 元素的访问 Get获取 修改 是否存在key 删除 删除单个 删除全部 遍历 遍历key与值 只遍历值 遍历key,value方法2 结合enumera…

Redis之主从复制

文章目录 一、什么是Redis主从复制&#xff1f;1.作用2.配置主从复制的原因3.环境配置 二、一主二从三、复制原理四、链路总结 一、什么是Redis主从复制&#xff1f; 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(ma…