C语言刷题(二)

news/2024/5/4 0:01:54/文章来源:https://blog.csdn.net/m0_51061483/article/details/127062090

✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!
📃个人主页:嵌入式基地
🔥系列专栏:牛客网C语言刷题专栏
💬推荐一款模拟面试、刷题神器,从基础到大厂面试题👉点击跳转刷题网站进行注册学习


牛客网C语言刷题(指针篇)

  • 习题一:牛牛的单向链表
  • 习题二:牛牛的链表交换
  • 习题三:牛牛的单链表求和
  • 习题四:牛牛的双链表求和
  • 习题五:牛牛的链表删除
  • 习题六:牛牛的链表添加节点
  • 结束语

习题一:牛牛的单向链表

描述

  • 牛牛从键盘输入一个长度为 n 的数组,问你能否用这个数组组成一个链表,并顺序输出链表每个节点的值。

输入描述

  • 第一行输入一个正整数 n ,表示数组的长度

输出描述

  • 制作一个链表然后输出这个链表的值

示例

输入:
4
5 4 2 1输出:
5 4 2 1说明:
请实现链表后再遍历输出结果!

代码实现

#include <stdio.h>
#include <stdlib.h>//单向循环链表
typedef struct node
{int data;struct node *next;
}node;//创建头节点
node *add_head()
{node *Head = (node *)malloc(sizeof(node));if(Head == NULL)return NULL;Head->next = Head;return Head;}//尾插法
void add_node(node *Head,int data)
{node *new = (node*)malloc(sizeof(node));if(new == NULL)return;//节点成员赋值new->data = data;new->next = NULL;//链接node *pT = NULL;for(pT = Head;pT->next != Head;pT = pT->next);new->next = pT->next;pT->next = new;
}//输出链表
void output(node *Head)
{if(Head->next == Head)return;node *pT = Head->next;while(pT != Head){printf("%d ",pT->data);pT = pT->next;}
}int main(void)
{node *Head = add_head();//头节点int n,i,j;scanf("%d",&n);int arr[n];//将键盘键入的数据存放到数组中for(i = 0;i < n;i++)scanf("%d",&arr[i]);//将数据插入链表for(j = 0;j < n;j++)add_node(Head, arr[j]);output(Head);return 0;
}

习题二:牛牛的链表交换

描述

  • 牛牛尝试把一个长度为 n 的数组转换成链表并把链表前两个节点交换位置和把链表最后两个节点交换位置。

输入描述

  • 第一行输入一个正整数 n 表示数组的长度
  • 第二行输入 n 个正整数,表示数组中各个元素的值

输出描述

  • 把数组转换成链表后输出交换位置后的链表

示例1

输入:
4
2 3 4 5输出:
3 2 5 4

示例2

输入:
3
3 2 1输出:
2 1 3

代码实现

#include <stdio.h>
#include <stdlib.h>//单向循环链表
typedef struct node
{int data;struct node *next;
}node;//创建头节点
node *add_head()
{node *Head = (node *)malloc(sizeof(node));if(Head == NULL)return NULL;Head->next = Head;return Head;}//尾插法
void add_node(node *Head,int data)
{node *new = (node*)malloc(sizeof(node));if(new == NULL)return;//节点成员赋值new->data = data;new->next = NULL;//链接node *pT = NULL;for(pT = Head;pT->next != Head;pT = pT->next);new->next = pT->next;pT->next = new;
}//节点交换
void swap_node(node *Head)
{node *p1 = Head->next;//第一个节点node *p2 = Head->next->next;//第二个节点//前两个节点交换p1->next = p2->next;p2->next = p1;Head->next = p2;node *pT = NULL;node *pT1 = NULL;node *pT2 = NULL;for(pT = Head;pT->next->next->next != Head;pT = pT->next);//找到倒数第三个节点for(pT1 = Head;pT1->next->next != Head;pT1 = pT1->next);//倒数第二个for(pT2 = Head;pT2->next != Head;pT2 = pT2->next);//最后一个节点//后两个节点交换pT1->next = Head;pT2->next = pT1;pT->next = pT2;
}
//输出链表
void output(node *Head)
{if(Head->next == Head)return;node *pT = Head->next;while(pT != Head){printf("%d ",pT->data);pT = pT->next;}
}int main(void)
{node *Head = add_head();//头节点int n,i,j;scanf("%d",&n);int arr[n];//将键盘键入的数据存放到数组中for(i = 0;i < n;i++)scanf("%d",&arr[i]);//将数据插入链表for(j = 0;j < n;j++)add_node(Head, arr[j]);swap_node(Head);output(Head);return 0;
}

习题三:牛牛的单链表求和

描述

  • 牛牛输入了一个长度为 n 的数组,他想把这个数组转换成链表,链表上每个节点的值对应数组中一个元素的值,然后遍历链表并求和各节点的值。

输入描述

  • 第一行输入一个正整数 n ,表示数组的长度。
  • 第二行输入 n 个正整数,表示数组中各个元素的值。

输出描述

  • 把数组转换成链表然后对其求和并输出这个值。

示例

输入:
5
5 2 3 1 1输出:
12

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDataType;
typedef struct SListNode
{struct SListNode*next;SLDataType Data;
}SLNode;
SLNode*BuyNode(SLDataType X)
{SLNode*newnode = (SLNode*)malloc(sizeof(SLNode));if (newnode == NULL){printf("malloc is fail\n");}else{newnode->next = NULL;newnode->Data = X;}return newnode;
}
void SLNodePushBack(SLNode**pHead, SLDataType X)
{SLNode*newnode = BuyNode(X);if (*pHead == NULL){*pHead = newnode;}else{SLNode*tail = *pHead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}
}
int SLNodeSum(SLNode*pHead)
{SLNode*tail=pHead;int sum=0;while(tail!=NULL){sum+=tail->Data;tail=tail->next;}return sum;
}
int main()
{SLNode*PList = NULL;int i, n = 0;int arr[100] = { 0 };scanf("%d\n", &n);for (i = 0; i<n; i++){scanf("%d ", &arr[i]);SLNodePushBack(&PList, arr[i]);}int sum=SLNodeSum(PList);printf("%d ",sum);return 0;
}

习题四:牛牛的双链表求和

描述

  • 牛牛输入了两个长度相同的数组分别是 a 和 b ,然后把数组 a 和 b 转换成链表 a 和链表 b 。把链表 a 中的全部值按顺序加到链表 b 中。

输入描述

  • 第一行输入一个正整数 n ,表示数组的长度。
  • 第二行和第三行分别输入 n 个正整数,表示数组 a 和 数组 b 的值。

输出描述

  • 把数组 a 和数组 b 转换成链表,然后把链表 a 中的值加到链表 b 中,然后输出加和后的链表。

示例

输入:
5
5 4 2 1 3
2 4 5 8 9输出:
7 8 7 9 12

代码实现

#include <stdlib.h>//单向循环链表
typedef struct node
{int data;struct node *next;
}node;//创建链表b头节点
node *add_head()
{node *Head = (node *)malloc(sizeof(node));if(Head == NULL)return NULL;Head->next = Head;return Head;     
}//尾插法
void add_node(node *Head,int data)
{node *new = (node*)malloc(sizeof(node));if(new == NULL)return;//节点成员赋值new->data = data;new->next = NULL;//链接node *pT = NULL;for(pT = Head;pT->next != Head;pT = pT->next);new->next = pT->next;pT->next = new;
}//输出链表
void output(node *Head)
{if(Head->next == Head)return;node *pT = Head->next;while(pT != Head){printf("%d ",pT->data);pT = pT->next;}
}int main(void)
{node *Head = add_head();//链表头节点int n,i,j;scanf("%d",&n);int arr[n];int brr[n];//将键盘键入的数据存放到数组中for(i = 0;i < n;i++)scanf("%d",&arr[i]);for(i = 0;i < n;i++)scanf("%d",&brr[i]);//将数据插入链表for(j = 0;j < n;j++)add_node(Head, arr[j]+brr[j]);output(Head);return 0;
}

习题五:牛牛的链表删除

描述

  • 牛牛从键盘输入了一个长度为 n 的数组,把这个数组转换成链表然后把链表中所有值是 x 的节点都删除。

输入描述

  • 第一行输入两个正整数 n 和 x 表示数组的长度和要删除的链表节点值 x 。
  • 第二行输入 n 个正整数表示数组中每个元素的值。

输出描述

  • 把数组转换成链表然后删除所有值是 x 的节点,删除后输出这个链表。

示例1

输入:
5 3
1 5 3 2 3输出:
1 5 2

示例2

输入:
5 3
1 5 2 7 8输出:
1 5 2 7 8

代码实现

#include <stdio.h>
#include <stdlib.h>//单向循环链表
typedef struct node
{int data;struct node *next;
}node;//创建链表头节点
node *add_head()
{node *Head = (node *)malloc(sizeof(node));if(Head == NULL)return NULL;Head->next = Head;return Head;     
}//尾插法
void add_node(node *Head,int data)
{node *new = (node*)malloc(sizeof(node));if(new == NULL)return;//节点成员赋值new->data = data;new->next = NULL;//链接node *pT = NULL;for(pT = Head;pT->next != Head;pT = pT->next);new->next = pT->next;pT->next = new;
}//删除节点
void delete_node(node *Head,int data)
{node *del = Head->next;while(del != Head){//找到要删除节点的前一个节点if(del->next->data == data){node *ptemp = del->next;//要删除的节点del->next = ptemp->next;free(ptemp);}del = del->next;}
}//输出链表
void output(node *Head)
{if(Head->next == Head)return;node *pT = Head->next;while(pT != Head){printf("%d ",pT->data);pT = pT->next;}
}int main(void)
{node *Head = add_head();//链表头节点int n,i,j,x;scanf("%d",&n);int arr[n];scanf("%d",&x);//将键盘键入的数据存放到数组中for(i = 0;i < n;i++)scanf("%d",&arr[i]);//将数据插入链表for(j = 0;j < n;j++)add_node(Head, arr[j]);//删除节点delete_node(Head, x);//输出链表output(Head);return 0;
}

习题六:牛牛的链表添加节点

描述

  • 牛牛输入了一个长度为 n 的数组,他把这个数组转换成链表并在第 i 个节点的后面添加一个值为 i 的新节点

输入描述

  • 第一行输入两个正整数分别是 n 和 i ,表示数组的长度、需要添加节点的位置和节点的值
  • 第二行输入 n 个正整数表示数组中每个元素的值。

输出描述

  • 把数组转换成链表并在第 i 个节点后的添加一个新节点值,新节点的值是 i。

示例

输入:
5 3
5 4 8 6 3输出:
5 4 8 3 6 3

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDataType;
typedef struct SListNode
{struct SListNode*next;SLDataType Data;
}SLNode;
SLNode*BuyNode(SLDataType X)
{SLNode*newnode=(SLNode*)malloc(sizeof(SLNode));if(newnode==NULL){printf("malloc is fail\n");}else{newnode->next=NULL;newnode->Data=X;}return newnode;
}
void SLNodePushBack(SLNode**pHead,SLDataType X)
{SLNode*newnode=BuyNode(X);if(*pHead==NULL){*pHead=newnode;}else{SLNode*tail=*pHead;while(tail->next!=NULL){tail=tail->next;}tail->next=newnode;}
}
void SLNodeInsert(SLNode*pHead,SLDataType p)
{SLNode*prev=NULL;SLNode*cur=pHead;int j=0;while(j<p){j++;prev=cur;cur=cur->next;}SLNode*newnode=BuyNode(p);prev->next=newnode;newnode->next=cur;
}
void SLNodePrint(SLNode*pHead)
{SLNode*cur=pHead;while(cur!=NULL){printf("%d ",cur->Data);cur=cur->next;}
}
int main()
{SLNode*PList=NULL;int i,n,p=0;int arr[100]={0};scanf("%d %d",&n,&p);for(i=0;i<n;i++){scanf("%d ",&arr[i]);SLNodePushBack(&PList,arr[i]);}SLNodeInsert(PList,p);SLNodePrint(PList);free(PList);PList=NULL;return 0;
}

结束语

你想要的牛客都有,各种大厂面试真题在等你哦!快快通过下方链接注册加入刷题大军吧!
💬刷题神器,从基础到大厂面试题👉点击跳转刷题网站

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

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

相关文章

保姆级, 使用 KotlinScript 构建 SpringBootStarter

因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. .kts本文主要分几个步骤: 用 Kotlin 写一个简单 SpringBoot Starter 进阶一: 复杂配置参数的写法 进阶二: starter 单元测试 使用 Kotlin …

【计算机组成原理】中央处理器(四)—— 控制器的功能和工作原理

【计算机组成原理】中央处理器&#xff08;四&#xff09;—— 控制器的功能和工作原理一、前言二、硬布线控制器&#xff08;一&#xff09;、安排微操作时序的原则1. 安排微操作时序-取指周期2. 安排微操作时序-间址周期3. 安排微操作时序-执行周期4. 安排微操作时序-间址周期…

Python算法性能分析-时间复杂度

时间复杂度&#xff1a; 算法的运行时间。 什么是大O&#xff1a; 大O用来表示上界的。 数据规模&#xff1a; 在决定使用哪些算法的时候&#xff0c;不是时间复杂越低的越好&#xff08;因为简化后的时间复杂度忽略了常数项等等&#xff09;&#xff0c;要考虑数据规模&am…

没有项目经验,如何书写漂亮的简历?

嗨&#xff0c;同学 你们是不是也开始 国庆假期倒计时啦&#xff01;&#xff01;&#xff01; 一想到熬过这周&#xff0c;接下来可以嗨7天7夜 就按捺不住自己内心的雀跃&#xff01; 但是,有人却高兴不起来&#xff0c;因为在这个“金九银十”&#xff0c;一些同学还没找到…

接口(关注我还有后续哦)

&#x1f44d; 棒棒有言&#xff1a;现在学习Java变得比以前容易多了&#xff0c;除了有大量的视频教程外&#xff0c;还有专业的机构&#xff0c;这都使学习变得更加简单化。如果仅仅学了些皮毛&#xff0c;高手写的程序你是望尘莫及的。在学习的过程中&#xff0c;书籍永远是…

后台系统接入udesk在线客服(vue前端方式)

SDK最舒服的一点就是买来服务&#xff0c;直接Ctrl CV脚本进项目基本就能完成目标功能&#xff0c;要做的无非就是自定义属性的添加。 楼上项目组用的是java后端接入&#xff0c;我这儿是vue前端接入&#xff0c;做法略有不同。 简单点做就是复制上面script标签内代码到index.h…

关于SignalR的内容延续:1.协商协议 2.分布式部署

既然项目中用到了&#xff0c;那就搞搞清楚&#xff0c;搞不懂就死 : > 前置内容&#xff1a; 长轮询问题在ABP中的解决方案&#xff0c;SignalR_董厂长的博客-CSDN博客 “SingalR是对webSocekt的封装” &#xff0c;这句话是片面的。 因为&#xff1a; SignalR支持多…

vue-----组件通信/传值

一 父子组件通信分为父给子传和子给父传 父给子传&#xff1a; 1.在子组件标签中写传入的值 2.在子组件内使用props接收父组件传递的值。 子给父传&#xff1a; 1.在子组件内部使用$emit发射自定义事件和传递给父组件的值 2.在父组件内声明自定义事件接受参数 二 兄弟组件…

真无线蓝牙耳机哪款音质最好?真无线蓝牙耳机音质排行榜

随着蓝牙技术的飞速发展&#xff0c;很多耳机的质量和质量都很好。喜欢音乐的人&#xff0c;往往会沉迷于这种美妙的感觉&#xff0c;也正是因为如此&#xff0c;他们才会对音质有更高的要求。除了音质之外&#xff0c;还有很多新的特性&#xff0c;例如主动降低噪音、声音操控…

全流程调度

目录 Azkaban 配置mysql 配置 Executor Server 配置Web Server Sqoop导出脚本 Azkaban 安装azkaban并改名 配置mysql 启动 [doudouhadoop102 ~]$ mysql -uroot -p123456登陆 MySQL&#xff0c;创建 Azkaban 数据库 mysql> create database azkaban;设置密码有效长度 …

一文入门Qt Quick

很高兴可以来到这一章,终于可以开始讲讲最近几年Qt的热门技术Quick这一块了。希望通过这个比较简短的例子可以带领有兴趣的朋友快速跨过Qt Quick的入门这道槛!以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「englyf」https://www.cnblogs.com/englyf/p/16733…

m基于matlab的光通信的信道估计,均衡,抑制papr误码率仿真,对比ZF,RLS,MMSE三种算法(包括matlab仿真录像)

目录 1.源码获取方式 2.算法描述 3.部分程序 4.部分仿真图预览 1.源码获取方式 使用版本matlab2013b 获取方式1&#xff1a; 点击下载链接&#xff08;解压密码C123456&#xff09;&#xff1a; m基于matlab的光通信的信道估计&#xff0c;均衡&#xff0c;抑制papr误码…

libxml编译时问题解决记录

在对libxml进行模糊测试时&#xff0c;需要先将其拉去并进行编译&#xff0c;可参考此链接&#xff1a;magma本地编译 或者直接参考这个链接&#xff1a;magma编译libxml2 然而在编译的过程中&#xff0c;拉去完libxml2执行到这一句时报错如下&#xff1a; configure.ac:42: e…

Python骚操作,实现驾考自动答题,这就直接满分了?

Python骚操作来了~ 用Python来实现科目一/四自动答题&#xff0c;100分不要太简单&#xff01; 最初是表弟最近想买车&#xff0c;但是驾照都没有&#xff0c;买什么车&#xff0c;只能先考驾照~ 看他在网页上练习题目慢吞吞的&#xff0c;我就看不下去了&#xff0c;直接给他…

《数据结构》队列及其经典面试题

前言 上一篇讲了栈和栈的经典面试题&#xff0c;链接如下&#xff1a; 栈与栈的经典面试题 其实栈和队列是一码事&#xff0c;都是对只能再线性表的一端进行插入和删除。 因此&#xff0c;其实栈和队列可以互相转换&#xff01; 一、队列的特点 先进先出的数据结构&#…

Android系统安全 — 2.0-移动终端栈溢出的保护机制设置

简介 操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险。例如 NX/DEP、 ASLR&#xff08;PIE&#xff09;、CANARY、FORTIFY、RELRO 等手段。 栈保护 1.NX/DEP Linux 和 Windows 平台都支持对非可执行代码的保护&#xff0c;在 Linux 平台中被称为…

【Mybatis框架】初识Mybatis

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 MyBatis1、MyBatis简介1.1、MyBatis历史1.2、MyBatis特性2. 搭建MyBatis2.1 创建一个Maven项目2.2 在项目下新建我们的MyBatis项目2.3 引入依赖2.4 创建MyBatis的核心配置文件2.5 创建mapper接口2.6 创建MyBatis的映射文件2.…

AWS 中文入门开发教学 34- MySQL@RDS - 准备工作 - VPC子网,安全组,DB子网组,参数组,选项组

知识点 建立RDS MySQL前的准备工作实战演习 VPC子网,安全组,DB子网组,参数组,选项组 VPC子网 Name: deeplearnaws-db-1cCIDR: 172.16.21.0/24 安全组 Name: deeplearnaws-db-sg <- 可以直接使用之前创建的,但生产环境时应只保留3306端口 DB子网组 Name: deeplearnaws-db-su…

JavaScript学习Day008(jQuery操作)

DOM操作分类 DOM操作分为三类 DOM Core&#xff1a;任何一种支持DOM的编程语言都可以使用它&#xff0c;如getElementById() HTML-DOM&#xff1a;用于处理HTML文档&#xff0c;如document.forms CSS-DOM&#xff1a;用于操作CSS&#xff0c;如element.style.color"gree…

【NLP】第12章 检测客户情绪以做出预测

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…