C语言单链表的窗口化操作

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

// 定义链表的节点结构
struct Node {
    int data;
    struct Node* next;
};

// 初始化链表
void initialize(struct Node** head) {
    *head = NULL;
}

// 在链表末尾插入节点
void insert(struct Node** head, int value) {
    // 创建新节点
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = value;
    newNode->next = NULL;
    

    if (*head == NULL) {
        // 如果链表为空,将新节点设为头节点
        *head = newNode;
    } else {
        // 找到链表末尾节点并插入新节点
        struct Node* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }

    printf("节点插入成功!\n");
}

// 删除链表中指定值的节点
void removeNode(struct Node** head, int value) {
    struct Node* prev = NULL;
    struct Node* current = *head;

    while (current != NULL) {
        if (current->data == value) {
            // 找到要删除的节点
            if (prev == NULL) {
                // 如果是头节点,则更新头指针
                *head = current->next;
            } else {
                // 否则,修改前一个节点的指针
                prev->next = current->next;
            }

            // 释放内存
            free(current);
            printf("节点删除成功!\n");
            return;
        }

        prev = current;
        current = current->next;
    }

    printf("未找到要删除的节点!\n");
}

// 查找链表中指定值的节点
void search(struct Node* head, int value) {
    struct Node* current = head;
    int index = 0;
    int found = 0;

    while (current != NULL) {
        if (current->data == value) {
        	found = 1;
            index++;
            printf("找到节点:%d,位置:%d\n", value, index);
            
        }

        current = current->next;
        index++;
    }

    if (!found) {
        printf("未找到节点:%d\n", value);
    }
}

// 打印链表中的所有节点值
void printList(struct Node* head) {
    struct Node* current = head;

    if (current == NULL) {
        printf("链表为空!\n");
        return;
    }

    printf("链表中的节点值:");
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

// 释放链表的内存
void freeList(struct Node** head) {
    struct Node* current = *head;
    struct Node* next = NULL;

    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }

    *head = NULL;
    printf("链表内存已释放!\n");
}

// 建立链表
void CreatList(struct Node** head)
{
	int a, b;
	printf("请输入要创建的链表节点个数:");
	scanf("%d", &a);
	int i;
	for (i = 1; i <= a; i++)
	{
		printf("请输入插入的第%d个节点的值:", i);
		while (scanf("%d", &b) != 1) {
		    printf("输入类型错误!\n");
		    clearInputBuffer(); // 清空输入缓冲区
		    printf("请重新输入第%d的值:", i);
		    }
	
		insert(head, b);
		printf("\n");
		
	}
}

// 清空输入缓冲区
void clearInputBuffer() {
    while (getchar() != '\n');
}

// 在链表指定位置插入节点
void insertAtPosition(struct Node** head, int value, int position) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = value;
    newNode->next = NULL;

    if (position == 1) {
        // 如果要在头部插入节点
        newNode->next = *head;
        *head = newNode;
        printf("节点插入成功!\n");
        return;
    }

    struct Node* current = *head;
    int index = 1;

    while (current != NULL && index < position - 1) {
        current = current->next;
        index++;
    }

    if (current == NULL) {
        printf("指定位置超出链表范围,插入失败!\n");
    } else {
        newNode->next = current->next;
        current->next = newNode;
        printf("节点插入成功!\n");
    }
}

int main() {
    struct Node* head;
//    initialize(&head);

    int choice;
    int value;
    int position;

    do {
        printf("\n链表操作菜单:\n");
        printf("1. 初始化链表\n");
        printf("2. 建立链表\n");
        printf("3. 插入节点\n");
        printf("4. 删除节点\n");
        printf("5. 查找节点\n");
        printf("6. 打印链表\n");
        printf("7. 指定位置插入值\n");
        printf("8. 退出\n");
        printf("请输入您的选择:");
        scanf("%d", &choice);

        switch (choice) {
        	case 1:
        		initialize(&head);
        		printf("初始化成功!\n");
        		break;
        	case 2:
        		CreatList(&head);
			    break; 
            case 3:
                printf("请输入要插入的节点值:");
              
                
			    while (scanf("%d", &value) != 1) {
		        printf("输入类型错误!\n");
		        clearInputBuffer(); // 清空输入缓冲区
		        printf("请重新输入一个整数:");
		       }

                
                insert(&head, value);
                break;
            case 4:
                printf("请输入要删除的节点值:");
                scanf("%d", &value);
                removeNode(&head, value);
                break;
            case 5:
                printf("请输入要查找的节点值:");
                scanf("%d", &value);
                search(head, value);
                break;
            case 6:
                printList(head);
                break;

            case 7:
                
			// 获取要插入的节点值和位置
			    printf("请输入要插入的节点值:");
			    while (scanf("%d", &value) != 1) {
		            printf("输入类型错误!\n");
		            clearInputBuffer(); // 清空输入缓冲区
		            printf("请重新输入要插入的值:");
		        }
			
			    printf("请输入要插入的位置:");
			    while (scanf("%d", &position) != 1) {
		            printf("输入类型错误!\n");
		            clearInputBuffer(); // 清空输入缓冲区
		            printf("请重新输入要插入的位置:");
		        }
		        // 调用插入函数
    			insertAtPosition(&head, value, position);
            	break;
            case 8:
                freeList(&head);
                printf("程序已退出!\n");
                break;
            default:
                printf("无效的选择!\n");
                break;
        }
    } while (choice != 8);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗 引言 很多人都有这样的疑问–基于BEV(Birds Eye View)的自动驾驶方案是什么&#xff1f;这个问题&#xff0c;目前学术界还没有统一的定义&#xff0c;但从我的开发经验上&#xff0c;尝试做一个解释&#xff1a;以鸟瞰视角为基础…

Web框架开发-Form组件和ajax实现注册

一、注册相关的知识点 1、Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2、局部钩子函数 1 2 3 4 5 6 7 # 局部钩子函数 def clean_username(self): userna…

《QT实用小工具·六》代码行数统计工具

1、概述 源码放在文章末尾 该项目实现了对不同编程语言文件的代码行数的统计 统计的内容包含&#xff1a; 1、代码行数 2、注释行数 3、空白行数 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #pragma execution_character_set("utf-8")#inclu…

区块链食品溯源案例实现(一)

引言&#xff1a; 食品安全问题一直是社会关注的热点&#xff0c;而食品溯源作为解决食品安全问题的重要手段&#xff0c;其重要性不言而喻。传统的食品溯源系统往往存在数据易被篡改、信息不透明等问题&#xff0c;而区块链技术的引入&#xff0c;为食品溯源带来了革命性的变革…

【ProComponents】解决 ProTable 中 params 参数改变,request 函数未触发问题

文章目录 先建议自查下官方文档&#xff0c;了解params和request直接的关系 确定params绑定的参数是否改变&#xff0c;例如 user_name 参数 import { ProTable, WxIcon } from /components; import { getSearchParams } from ice; import { useEffect, useMemo, useRef, useS…

智慧公厕是什么?智慧公厕的主要功能、特点?

智慧公厕&#xff0c;顾名思义&#xff0c;是指应用了智能科技的公共厕所&#xff0c;旨在提供更加便捷、舒适、智能化的卫生服务。相比传统的公厕&#xff0c;智慧公厕不仅拥有更加智能化的设备&#xff0c;还配备了远程监控与管理系统&#xff0c;以及节能环保技术&#xff0…

优化页面加载时间:改善用户体验的关键

✨✨ 祝屏幕前的您天天开心&#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、为什么页面加载时间重要&#xff1f; 二、如何减少页面加载时间&#xff1f; …

SiLM824x系列SiLM8244 配置为高、低边驱动 支持死区可编程,隔离双通道门级驱动器

SiLM824x系列SiLM8244是一款具有不同配置的隔离双通道门极驱动器。SiLM8244配置为高、低边驱动&#xff0c;SiLM8244可提供4A的输出源电流和6A的灌电流能力&#xff0c;并且其驱动输出电压可以支持到33V。支持死区可编程&#xff0c;通过调整DT脚外部的电阻大小&#xff0c;调整…

基于单片机汽车超声波防盗系统设计

**单片机设计介绍&#xff0c;基于单片机汽车超声波防盗系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机汽车超声波防盗系统设计概要主要涉及利用超声波传感器和单片机技术来实现汽车的安全防盗功能。以下是对…

注册接口和前置SQL及数据生成及封装

注册接口 演示注册接口的三步操作&#xff1a;【注册流程逻辑】 第一步&#xff1a;发送注册短信验证码接口请求 请求方法&#xff1a; put 请求地址&#xff1a;http://shop.lemonban.com:8107/user/sendRegisterSms 请求参数&#xff1a;{“mobile”:“13422337766”} 请求头…

【面试专题】Mybatis高频面试题

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

C++算法补充---STL

这里写目录标题 CSTL容器字符串函数(string容器函数)字符串转字符 算法交换函数拿到容器或者数组的第一个最大&#xff08;小&#xff09;值元素的下标或者值排序函数求字符数组的有效长度atoi函数&#xff08;将字符串类型的数字转为真正的int型数字&#xff09;string转字符 …

STM32八种I/O口模式

STM32八种I/O口模式 文章目录 STM32八种I/O口模式前言一、stm32八种I/O类型二、区别1.模拟输入2.浮空输入3.上拉输入4.下拉输入5.推挽输出6.开漏输出7.复用推挽输出8.复用推挽输出 总结 前言 作为两年嵌入式软件攻城狮&#xff0c;还没仔细去理解过STM32的GPIO的八种使用模式&…

企业招聘,应用MBTI来做人才测评招聘测评

每年的校招季都是企业争抢优秀应届毕业生人才的忙碌季。只有精准识人用人&#xff0c;才能不断为企业注入新鲜活力和青春智慧。但是随着毕业生数量越来越多&#xff0c;企业如何在招聘中精准发现自己最需要的人才&#xff0c;成为摆在人力资源部门的大难题。人才测评是各企业都…

springboot在线学习做题答题统计系统-可视化分析系统

系统阐述的是使用可视化的学习系统的设计与实现&#xff0c;对于java、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 springboot框架和MySql数据库技术搭建系统的整体架构。…

【分析教程】unity游戏修改so文件

基础知识 0x1.apk安装后在手机中的目录 apk安装后会在两个包下生成相关包&#xff1a;data/data/、data/app/。 这里拿网易云音乐的安装目录举例。Data/App目录下通常会有三个文件&#xff1a; lib文件夹&#xff08;包含so库文件&#xff09;、 ‚oat文件夹&#xff08;O…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

揭秘阿里面试必问:Tomcat类加载机制解析

各位小米的小伙伴们,大家好呀!今天小米要和大家聊聊一个很有趣的话题——阿里巴巴面试题:Tomcat的类加载机制。作为一个技术爱好者,小米深知技术分享的重要性,希望通过这篇文章与大家一起深入了解Tomcat的类加载机制,加深对Java Web开发的理解,也希望能够帮助到正在准备…

五款常用在线JavaScript加密混淆工具详解:jscrambler、JShaman、jsfack、ipaguard和jjencode

摘要 本篇技术博客将介绍五款常用且好用的在线JavaScript加密混淆工具&#xff0c;包括 jscrambler、JShaman、jsfack、freejsobfuscator 和 jjencode。通过对这些工具的功能及使用方法进行详细解析&#xff0c;帮助开发人员更好地保护和加密其 JavaScript 代码&#xff0c;提…

希亦、洁盟、大宇超声波清洗机好用吗?比拼谁是性价比之王

在追求高效生活品质的今天&#xff0c;超声波清洗机以其独特的清洁技术和便捷的操作方式&#xff0c;成为了家用和商用清洁领域的新宠。尤其对于眼镜用户而言&#xff0c;一台高效的超声波清洗机不仅能够轻松去除镜片上的污渍和细菌&#xff0c;更能保护镜片不受损伤&#xff0…