c语言实例

news2024/10/2 5:09:52

大家好,欢迎来到无限大的频道

今天给大家带来的是c语言

题目描述

创建一个双链表,并将链表中的数据输出到控制台,输入要查找的数据,将查找到的数据删除,并且显示删除后的链表

下面是一个用C语言实现的双链表(Doubly Linked List)程序,包括创建链表、输出链表、查找并删除数据的功能。代码会将链表的数据输出到控制台,并在删除指定数据后显示删除后的链表。

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

// 定义双链表节点  
typedef struct Node {  
    int data;  
    struct Node* next;  
    struct Node* prev;  
} Node;  

// 创建新节点  
Node* createNode(int data) {  
    Node* newNode = (Node*)malloc(sizeof(Node));  
    newNode->data = data;  
    newNode->next = NULL;  
    newNode->prev = NULL;  
    return newNode;  
}  

// 在链表末尾添加节点  
void append(Node** head_ref, int new_data) {  
    Node* new_node = createNode(new_data);  
    Node* last = *head_ref;  

    if (*head_ref == NULL) {  
        *head_ref = new_node;  
        return;  
    }  

    while (last->next != NULL)  
        last = last->next;  

    last->next = new_node;  
    new_node->prev = last;  
}  

// 打印链表  
void printList(Node* node) {  
    while (node != NULL) {  
        printf("%d ", node->data);  
        node = node->next;  
    }  
    printf("\n");  
}  

// 查找并删除节点  
void deleteNode(Node** head_ref, int key) {  
    Node* temp = *head_ref;  

    // 如果头节点包含要删除的值  
    if (temp != NULL && temp->data == key) {  
        *head_ref = temp->next;  
        if (*head_ref != NULL)  
            (*head_ref)->prev = NULL;  
        free(temp);  
        return;  
    }  

    // 查找要删除的节点  
    while (temp != NULL && temp->data != key)  
        temp = temp->next;  

    // 如果未找到要删除的节点  
    if (temp == NULL) {  
        printf("未找到数据为 %d 的节点。\n", key);  
        return;  
    }  

    // 更改指针以删除节点  
    if (temp->next != NULL)  
        temp->next->prev = temp->prev;  

    if (temp->prev != NULL)  
        temp->prev->next = temp->next;  

    free(temp);  
}  

// 主函数  
int main() {  
    Node* head = NULL;  

    // 创建链表并添加数据  
    append(&head, 10);  
    append(&head, 20);  
    append(&head, 30);  
    append(&head, 40);  

    printf("原始链表: ");  
    printList(head);  

    int dataToDelete;  
    printf("请输入要删除的数据: ");  
    scanf("%d", &dataToDelete);  

    deleteNode(&head, dataToDelete);  

    printf("删除后的链表: ");  
    printList(head);  

    return 0;  
}  

在这里插入图片描述


代码说明

  1. 结构体定义: 定义一个双链表节点结构体 Node,包含数据、指向下一个节点的指针和指向上一个节点的指针。
  2. 创建新节点: createNode 函数用于创建新节点并初始化它的值。
  3. 添加节点: append 函数在链表末尾添加新节点。
  4. 打印链表: printList 函数遍历链表并打印每个节点的数据。
  5. 删除节点: deleteNode 函数查找指定值的节点,找到后删除它,并调整链表的指针。
  6. 主函数: 在 main 函数中创建链表、打印原始链表、输入要删除的数据并最终打印删除后的链表。

更新

好的,下面是对原始双链表程序的进一步优化,实现了以下功能:

  1. 用户可以输入链表的初始值。
  2. 程序会在一个无限循环中,用户可以选择删除节点或在特定位置添加节点,直到用户选择退出。
  3. 提供更多选择功能,例如在头部、尾部或特定位置插入节点。
#include <stdio.h>
#include <stdlib.h>

// 定义双链表节点
typedef struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    newNode->prev = NULL;
    return newNode;
}

// 在链表末尾添加节点
void append(Node** head_ref, int new_data) {
    Node* new_node = createNode(new_data);
    Node* last = *head_ref;

    if (*head_ref == NULL) {
        *head_ref = new_node;
        return;
    }

    while (last->next != NULL)
        last = last->next;

    last->next = new_node;
    new_node->prev = last;
}

// 在链表头部添加节点
void prepend(Node** head_ref, int new_data) {
    Node* new_node = createNode(new_data);
    new_node->next = *head_ref;

    if (*head_ref != NULL)
        (*head_ref)->prev = new_node;

    *head_ref = new_node;
}

// 在指定位置插入节点
void insertAfter(Node* prev_node, int new_data) {
    if (prev_node == NULL) {
        printf("前一个节点不可为NULL。\n");
        return;
    }

    Node* new_node = createNode(new_data);
    new_node->next = prev_node->next;
    prev_node->next = new_node;
    new_node->prev = prev_node;

    if (new_node->next != NULL)
        new_node->next->prev = new_node;
}

// 打印链表
void printList(Node* node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
    printf("\n");
}

// 查找并删除节点
void deleteNode(Node** head_ref, int key) {
    Node* temp = *head_ref;

    // 如果头节点包含要删除的值
    if (temp != NULL && temp->data == key) {
        *head_ref = temp->next;
        if (*head_ref != NULL)
            (*head_ref)->prev = NULL;
        free(temp);
        return;
    }

    // 查找要删除的节点
    while (temp != NULL && temp->data != key)
        temp = temp->next;

    // 如果未找到要删除的节点
    if (temp == NULL) {
        printf("未找到数据为 %d 的节点。\n", key);
        return;
    }

    // 更改指针以删除节点
    if (temp->next != NULL)
        temp->next->prev = temp->prev;

    if (temp->prev != NULL)
        temp->prev->next = temp->next;

    free(temp);
}

// 主函数
int main() {
    Node* head = NULL;
    int initialValue, numOfNodes;

    // 用户输入链表的初始值
    printf("请输入链表的节点数量: ");
    scanf("%d", &numOfNodes);
    for (int i = 0; i < numOfNodes; i++) {
        printf("请输入第 %d 个值: ", i + 1);
        scanf("%d", &initialValue);
        append(&head, initialValue);
    }

    while (1) {
        printf("\n当前链表: ");
        printList(head);

        int choice, data, pos;
        printf("选择操作:1. 删除节点 2. 在头部添加节点 3. 在尾部添加节点 4. 在指定位置插入节点 5. 退出\n");
        printf("请输入你的选择: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("请输入要删除的数据: ");
                scanf("%d", &data);
                deleteNode(&head, data);
                break;
            case 2:
                printf("请输入要添加到头部的数据: ");
                scanf("%d", &data);
                prepend(&head, data);
                break;
            case 3:
                printf("请输入要添加到尾部的数据: ");
                scanf("%d", &data);
                append(&head, data);
                break;
            case 4:
                printf("请输入要插入的位置(从1开始): ");
                scanf("%d", &pos);
                printf("请输入要插入的数据: ");
                scanf("%d", &data);
                {
                    Node* current = head;
                    for (int i = 1; current != NULL && i < pos; i++) {
                        current = current->next;
                    }
                    // 如果是插入头部
                    if (pos == 1) {
                        prepend(&head, data);
                    } else if (current != NULL) {
                        insertAfter(current->prev, data);
                    } else {
                        printf("插入位置超出链表范围,添加到尾部。\n");
                        append(&head, data);
                    }
                }
                break;
            case 5:
                printf("退出程序。\n");
                // 释放链表内存
                while (head != NULL) {
                    Node* temp = head;
                    head = head->next;
                    free(temp);
                }
                return 0;
            default:
                printf("无效选择,请重试。\n");
                break;
        }
    }

    return 0;
}

在这里插入图片描述

新增功能说明:

  1. 用户输入初始值: 程序请求用户输入链表节点的数量和每个节点的数据,生成初始链表。
  2. 无限循环: 使用 while(1) 创建一个无限循环,让用户选择各种操作。
  3. 选择操作: 用户可以选择删除节点、在链表头部或尾部添加节点、在指定位置插入节点或退出程序。
  4. 内存释放: 在退出程序时,所有分配的内存会被释放,避免内存泄漏。

操作提示:

  • 用户可以根据提示输入数据和选择执行的操作。
  • 增加了在特定位置插入节点的功能,如果插入位置超出链表范围,则会将数据添加到尾部。

这个程序现在更加灵活,能够处理多种链表操作,便于用户进行动态的数据管理。

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

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

相关文章

数据结构-4.2.串的定义和基本操作

一.串的定义&#xff1a; 1.单/双引号不是字符串里的内容&#xff0c;他只是一个边界符&#xff0c;用来表示字符串的头和尾&#xff1b; 2.空串也是字符串的子串&#xff0c;空串长度为0&#xff1b; 3.字符的编号是从1开始&#xff0c;不是0&#xff1b; 4.空格也是字符&a…

Windows 11 安装配置 Git 教程

目录 Git Windows 11 环境安装配置 Git Git Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。Git是目前世界上最流行的版本控制系统&#xff0c;广泛应用于软件开发中。 以下是Git的一些关键特…

Python空间地表联动贝叶斯地震风险计算模型

&#x1f3af;要点 使用贝叶斯推断模型兼顾路径和场地效应&#xff0c;量化传统地理统计曲线拟合技术。使用破裂和场地特征等地质信息以及事件间残差和事件内残差描述数学模型模型使用欧几里得距离度量、角距离度量和土壤差异性度量确定贝叶斯先验分布和后验分布参数&#xff…

使用Qt实现实时数据动态绘制的折线图示例

基于Qt的 QChartView 和定时器来动态绘制折线图。它通过动画的方式逐步将数据点添加到图表上&#xff0c;并动态更新坐标轴的范围&#xff0c;提供了一个可以实时更新数据的折线图应用。以下是对代码的详细介绍及其功能解析&#xff1a; 代码概述 该程序使用Qt的 QChartView…

【Python报错已解决】 Encountered error while trying to install package.> lxml

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

黑马linux笔记(转载)

学习链接 视频链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通 原文链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…

10/01赛后总结

T1隔离 题目传送门&#xff1a;隔离http://bbcoj.cn/contest/1027/problem/1 实在是太刁钻了&#xff0c;有两种情况没有考虑&#xff1a; 1.隔离后做完全部的是再回去 2.在路程上花的时间如果大于在隔离一次花的时间&#xff0c;那还不如隔离&#xff0c;然后做完全部的事…

阿里云域名注册购买和备案

文章目录 1、阿里云首页搜索 域名注册2、点击 控制台3、域名控制台 1、阿里云首页搜索 域名注册 2、点击 控制台 3、域名控制台

聊聊Mysql的MVCC

1 什么是MVCC&#xff1f; MVCC&#xff0c;是Multiversion Concurrency Control的缩写&#xff0c;翻译过来是多版本并发控制&#xff0c;和数据库锁一样&#xff0c;他也是一种并发控制的解决方案。 我们知道&#xff0c;在数据库中&#xff0c;对数据的操作主要有2种&#…

Java项目实战II基于Java+Spring Boot+MySQL的购物推荐网站的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着互联网技术的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。然而&#xf…

论文笔记:基于细粒度融合网络和跨模态一致性学习的多模态假新闻检测

整理了MMAsia2023 Cross-modal Consistency Learning with Fine-grained Fusion Network for Multimodal Fake News Detection 论文的阅读笔记 背景模型筛选模块 实验消融实验超参数讨论可视化 背景 尽管以往的工作已经观察到假新闻中文字与图像的不匹配&#xff0c;但他们仍致…

大数据毕业设计选题推荐-民族服饰数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

DNS with libevent

DNS with libevent: high-level and low-level functionality libevent提供了少量用于解析DNS名字的API&#xff0c;以及用于实现简单DNS服务器的机制。 我们从用于名字查询的高层机制开始介绍&#xff0c;然后介绍底层机制和服务器机制。 Portable blocking name resolution…

八、SPOOLING技术

1.早期脱机技术 外围控制机更高速的设备--磁带 作用:缓解设备与CPU的速度矛盾&#xff0c;实现预输入、缓输出 批处理阶段引入了脱机输入/输出技术(用磁带完成): 引入脱机技术后&#xff0c;缓解了CPU与慢速I/O设备的速度矛盾。另一方面&#xff0c;即使CPU在忙碌&#xff0…

【Windows】在任务管理器中隐藏进程

在此前的一篇&#xff0c;我们已经介绍过了注入Dll 阻止任务管理器结束进程 -- Win 10/11。本篇利用 hook NtQuerySystemInformation 并进行断链的方法实现进程隐身&#xff0c;实测支持 taskmgr.exe 的任意多进程隐身。 任务管理器 代码&#xff1a; // dllmain.cpp : 定义 …

MongoDB微服务部署

一、安装MongoDB 1.在linux中拉去MongoDB镜像文件 docker pull mongo:4.4.18 2. 2.创建数据挂载目录 linux命令创建 命令创建目录: mkdir -p /usr/local/docker/mongodb/data 可以在sshclient工具查看是否创建成功。 进入moogodb目录&#xff0c;给data赋予权限777 cd …

2024-09-04 深入JavaScript高级语法十五——浏览器原理-V8引擎-js执行原理

目录 1、浏览器的工作原理1.1、认识浏览器内核1.2、浏览器渲染过程 2、JS引擎2.1、认识 JavaScript 引擎2.2、浏览器内核和JS引擎的关系2.3、V8引擎的原理2.4、V8引擎的架构2.5、V8执行的细节 3、全局代码的执行过程3.1、初始化全局对象3.2、执行上下文栈&#xff08;调用栈&am…

World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Victory in Wintergrasp

Wintergrasp 冬拥湖 120 VS 120 Victory in Wintergrasp - Quest - 魔兽世界怀旧服WLK3.35数据库_巫妖王之怒80级魔兽数据库_wlk数据库

逆向-下字符串查找的条件断点

为了跟踪console程序在访问某个文件时失败的问题&#xff0c;在内核中下了断点&#xff0c;但是内核中文件部分调用太频繁了&#xff0c;无法等到自己的文件。所以最好还是根据条件来下断点。 程序如下 想要在FileName是指定文件时停下来&#xff0c;例如FileName是c:\temp\f…

「轻盈」之旅:OOM故障重现与解决

前期准备 本项目均采用 VisualVM 2.1.10 进行dump文件的分析。JDK1.8及之前所在目录的bin目录下有自带的VisualVM&#xff0c;JDK1.8以后需要自行手动安装下载。 下载地址&#xff1a;https://visualvm.github.io/download.html IDEA插件配置&#xff1a;在Plugins里搜索visual…