C语言链表

head.h

typedef struct Node_s{int data; //数据域struct Node_s *pNext; //指针域
} Node_t, *pNode_t;void headInsert(pNode_t *ppHead, pNode_t *ppTail, int data);
void print(pNode_t pHead);
void tailInsert(pNode_t *ppHead, pNode_t *ppTail, int data);
void sortInsert(pNode_t *ppHead, pNode_t *ppTail, int data);
void modify(pNode_t pHead, int findNum, int changeNum);
void listDelete(pNode_t *ppHead, pNode_t *ppTail, int deleteNum);

main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "head.h"
int main() {pNode_t pHead = NULL;pNode_t pTail = NULL;int data;while (scanf("%d", &data) != EOF) {//headInsert(&pHead, &pTail, data);//tailInsert(&pHead, &pTail, data);sortInsert(&pHead, &pTail, data);print(pHead);}/*int findNum, changeNum;while (scanf("%d%d", &findNum, &changeNum) != EOF) {modify(pHead, findNum, changeNum);print(pHead);}*/int deleteNum;while (scanf("%d", &deleteNum) != EOF) {listDelete(&pHead, &pTail, deleteNum);print(pHead);}
}
//头插法
void headInsert(pNode_t *ppHead, pNode_t *ppTail, int data) {//在堆上申请空间,存储链表结点pNode_t pNew = (pNode_t)malloc(sizeof(Node_t));memset(pNew, 0, sizeof(Node_t));//数据域为0,指针域为NULLpNew->data = data;if (*ppHead == NULL) {*ppHead = pNew;*ppTail = pNew;}else {pNew->pNext = *ppHead;*ppHead = pNew;}
}
//打印链表
void print(pNode_t pHead) {pNode_t pCur = pHead;while (pCur) {printf("%3d", pCur->data);pCur = pCur->pNext;}printf("\n");
}
//尾插法
void tailInsert(pNode_t *ppHead, pNode_t *ppTail, int data) {pNode_t pNew = (pNode_t)calloc(1, sizeof(Node_t));//使用calloc可以不用执行memset了pNew->data = data;if (*ppHead == NULL) {*ppHead = pNew;*ppTail = pNew;}else {(*ppTail)->pNext = pNew;*ppTail = pNew;}
}
//有序插入
void sortInsert(pNode_t *ppHead, pNode_t *ppTail, int data) {pNode_t pNew = (pNode_t)calloc(1, sizeof(Node_t));pNew->data = data;if (*ppHead == NULL) {//插入唯一的结点*ppHead = pNew;*ppTail = pNew;}else if (data < (*ppHead)->data) {//执行头插法pNew->pNext = *ppHead;*ppHead = pNew;}else {//存在某个结点,其指针域将要改变指向pNode_t pPre = *ppHead;//要修改指针域的结点pNode_t pCur = pPre->pNext;//是pPre的后继,pCur所指结点的数据域决定了是否要插入//经验:写出每次循环迭代的语句,根据这个语句是否有问题,判断循环的条件是否有问题while (pCur) {if (pCur->data > data) {//插入到中间的位置pPre->pNext = pNew;pNew->pNext = pCur;break;}pPre = pCur;pCur = pCur->pNext;}//如果退出循环时,pCur为NULL,说明没有找到中间位置,要执行尾插法if (pCur == NULL) {(*ppTail)->pNext = pNew;*ppTail = pNew;}}
}
//查找和修改
void modify(pNode_t pHead, int findNum, int changeNum) {pNode_t pCur = pHead;while (pCur) {if (pCur->data == findNum) {pCur->data = changeNum;break;}pCur = pCur->pNext;}if (pCur == NULL) {fprintf(stderr, "Cannot find the number!\n");}
}
//删除
void listDelete(pNode_t *ppHead, pNode_t *ppTail, int deleteNum) {pNode_t pCur = *ppHead;//pCur指向待删除的结点,以供后续freeif (pCur == NULL) {fprintf(stderr, "List is empty!\n");return;//return 终止本次函数调用}else if(pCur->data == deleteNum){//删除的是第一个结点*ppHead = (*ppHead)->pNext;//pCur依然指向原来的pHead pHead后移了if (*ppHead == NULL) {//删除之后没有结点,意味着删除的是唯一的结点*ppTail = NULL;}}else {pNode_t pPre = *ppHead;//双指针法,pPre指向要修改指针域的结点pCur = pPre->pNext;while (pCur) {if (pCur->data == deleteNum) {//链表结点删除,意味着其前驱结点的指针域改变了指向pPre->pNext = pCur->pNext;break;}pPre = pCur;pCur = pCur->pNext;}if (pCur == *ppTail) {*ppTail = pPre;}if (pCur == NULL) {fprintf(stderr, "DeleteNum is not found!\n");return;}}free(pCur);pCur = NULL;
}

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

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

相关文章

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰

说明 本文作为PMCW体制雷达系列文章之一&#xff0c;主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域&#xff0c;对于一切以电磁波作为媒介的信息传递活动&#xff0c;干扰是无处不在的。近年来&#xff0c;随着雷达装车率的提高&#xff0c;…

QQ五毛项目记

问题与挑战&#xff1a;某公司为了实现某马总造福全人类&#xff0c;红旗插遍全球的宏伟目标&#xff0c;为应对后续用户激增的问题。特别安排了一次针对全体用户的秒杀活动&#xff1a;于XXXX年XX月XX日XX时XX分XX秒开始的秒杀五毛钱一百个QQ币的活动。每个账户仅限一次&#…

Stable Diffusion 启动时 got an unexpected keyword argument ‘socket_options‘ 错误解决

Stable Diffusion 启动时 got an unexpected keyword argument socket_options 错误解决 问题解决方法 问题 Launching Web UI with arguments: Traceback (most recent call last):File "launch.py", line 48, in <module>main()File "launch.py"…

HTTP Error 500.31 - Failed to load ASP.NET Core runtime

在winserver服务器上部署net6应用后&#xff0c;访问接口得到以下提示&#xff1a; 原因是因为没有安装net6的运行时和环境&#xff0c;我们可以在windows自带的 “事件查看器” 查看原因。 可以直接根据给出的地址去官网下载sdk环境&#xff0c;安装即可 下载对应的net版本…

CentOS Linux release 7.9.2009 (Core)中安装配置Tomcat

一、安装JDK 部分内容可以参考我这篇文章&#xff1a;Windows11与CentOS7下配置与检测JDK与Maven环境变量 中的 2.2 安装jdk-8u371-linux-x64.tar.gz和配置环境变量/etc/profile //1、安装redhat-lsb yum install -y redhat-lsb//2、查看系统版本信息 lsb_release -a //3、查…

结构体——C语言初阶

一.结构体的声明&#xff1a; &#xff08;1&#xff09;结构的基础知识&#xff1a; 结构体是一种构造数据类型把不同类型的数据组合成一个整体结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量需要注意的是&#xff0c;结构体是一种…

【C++入门】拷贝构造运算符重载

目录 1. 拷贝构造函数 1.1 概念 1.2 特征 1.3 常用场景 2. 赋值运算符重载 2.1 运算符重载 2.2 特征 2.3 赋值运算符 前言 拷贝构造和运算符重载是面向对象编程中至关重要的部分&#xff0c;它们C编程中的一个核心领域&#xff0c;本期我详细的介绍拷贝构造和运算符重载。 1. …

Transformer中WordPiece/BPE等不同编码方式详解以及优缺点

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

FPGA设计时序约束八、others类约束之Set_Case_Analysis

目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时序…

人工智能-深度学习之文本预处理

文本预处理 对于序列数据处理问题&#xff0c; 这样的数据存在许多种形式&#xff0c;文本是最常见例子之一。 例如&#xff0c;一篇文章可以被简单地看作一串单词序列&#xff0c;甚至是一串字符序列。 本节中&#xff0c;我们将解析文本的常见预处理步骤。 这些步骤通常包括…

Java 语言关键字有哪些

Java 语言关键字有哪些 分类关键字访问控制privateprotectedpublic类&#xff0c;方法和变量修饰符abstractclassextendsfinalimplementsinterfacenativenewstaticstrictfpsynchronizedtransientvolatileenum程序控制breakcontinuereturndowhileifelseforinstanceofswitchcase…

uniapp 微信小程序登录 新手专用 引入即可

预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…

05-Spring Boot工程中简化开发的方式Lombok和dev-tools

简化开发的方式Lombok和dev-tools Lombok常用注解 Lombok用标签方式代替构造器、getter/setter、toString()等重复代码, 在程序编译的时候自动生成这些代码 注解名功能NoArgsConstructor生成无参构造方法AllArgsConstructor生产含所有属性的有参构造方法,如果不希望含所有属…

[C/C++]数据结构 栈和队列()

一:栈 1.1 栈的概念及结构 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守先进后出的原则. 压栈:栈的插入操作叫做进栈/压栈/入栈,将数据插入栈顶 出栈:栈的删除操作也叫出…

【PTA题目】7-3 冰雹猜想。 分数 10

7-3 冰雹猜想。 分数 10 全屏浏览题目 切换布局 作者 赵静静 单位 浙江工贸职业技术学院 冰雹猜想的内容是&#xff1a;任何一个大于1的整数n&#xff0c;按照n为偶数则除等2&#xff0c;n为奇数则乘3后再加1的规则不断变化&#xff0c;最终都可以变化为1。 例如&#xff…

Redis新操作

1.Bitmaps 1.1概述 Bitmaps可以对位进行操作&#xff0c;实际上它就是一个字符串&#xff0c;可以将Bitmaps想象为一个以位为单位的数组&#xff0c;数组中的每个元素只能存储0或者1&#xff0c;数组的下标在Bitmaps被称为偏移量。 setbit key offset value&#xff1a;设置o…

游戏中的资源动态加载

动态加载的优势 游戏中的资源动态加载是指在游戏运行时根据需要加载和卸载资源的过程&#xff0c;而不是在游戏启动时一次性加载所有资源。这种方法对于管理大型游戏中的资源尤其重要。以下是动态加载的一些关键方面和优势&#xff1a; 1. 内存管理&#xff1a; 动态加载资源…

uni-app下,页面跳转后wacth持续监听的问题处理

uni-app下&#xff0c;页面跳转后wacth持续监听的问题处理 好久没写博客了&#xff0c;最近碰到了一个uni-app&#xff08;vue2&#xff09;开发小程序的问题&#xff0c;个人觉得很典型&#xff0c;所以拿出来给各位做个参考。 需求场景&#xff1a; 全局轮询用户权限。简单…

MIB 6.S081 System calls(1)using gdb

难度:easy In many cases, print statements will be sufficient to debug your kernel, but sometimes being able to single step through some assembly code or inspecting the variables on the stack is helpful. To learn more about how to run GDB and the common iss…

十二.Jenkins持续集成

十二.Jenkins持续集成 一.安装jenkins 1.下载 Jenkins下载地址&#xff1a;http://jenkins-ci.org/ 或 https://mirrors.jenkins-ci.org/redhat/2.安装 可以通过官网的安装方式来安装 安装完后&#xff0c;需要修改以下的配置 vim /usr/lib/systemd/system/jenkins.servic…