二级C语言题解:函数指针的操作、单链表偶数结点值累加、判断回文

简介: 本文详解C语言三大经典题型:函数指针调用(填空)、单链表偶数节点累加(修改)及字符串回文判断(编程),含完整代码、错误分析与修正,助力夯实基础。

前言
本文讲解:函数指针的操作、单链表偶数结点值累加、判断回文

🏠我的主页:我的主页
📚系列专栏:系列专栏

一、程序填空📝 --- 函数指针的操作

难度:⭐⭐

题目📃

在此程序中,函数 fun 的功能:
用函数指针指向要调用的函数,并进行调用。规定在【2】处使 f 指向函数 f1,在【3】处使 f 指向函数 f2。当调用正确时,程序输出:x1 = 5.000000, x2 = 3.000000, x1x1+x1x2=40.000000。

注意:部分源程序在文件 blank1.c 中。 不得增行或删行,也不得更改程序的结构!

代码如下:
在1️⃣2️⃣3️⃣处填空

#include  <stdio.h>
double f1(double  x)
{  return  x*x;  }
double f2(double x, double y)
{  return  x*y;  }
double fun(double  a, double  b)
{
/**********found**********/
  1️⃣ (*f)();
  double  r1, r2;
/**********found**********/
  f = 2️⃣; 
  r1 = f(a);
/**********found**********/
  f = 3️⃣ ; 
  r2 = (*f)(a, b);
  return  r1 + r2;
}
void main()
{ double  x1=5, x2=3, r;
  r = fun(x1, x2);
  printf("\nx1=%f,  x2=%f,  x1*x1+x1*x2=%f\n",x1, x2, r);
}

分析🧐

这道题主要是理解指针函数的概念,在这个程序中先定义了函数指针,再通过这个函数指针指向对应的函数

  1. 填写  double
    由代码中可知,函数指针需要double类型的
  2. 填写 f1
    直接将函数名赋给函数指针即可
    函数指针就能够调用
  3. 填写  f2
    同理也一样

解答代码如下:

#include  <stdio.h>
double f1(double  x)
{  return  x*x;  }
double f2(double x, double y)
{  return  x*y;  }
double fun(double  a, double  b)
{
/**********found**********/
  1️⃣double (*f)();
  double  r1, r2;
/**********found**********/
  f = 2️⃣f1; 
  r1 = f(a);
/**********found**********/
  f = 3️⃣f2 ; 
  r2 = (*f)(a, b);
  return  r1 + r2;
}
void main()
{ double  x1=5, x2=3, r;
  r = fun(x1, x2);
  printf("\nx1=%f,  x2=%f,  x1*x1+x1*x2=%f\n",x1, x2, r);
}

注:虽然程序里会有红线,但是不用管

二、程序修改🛠️ --- 单链表偶数结点值累加

难度:⭐⭐

题目📃

在此程序中,建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数 fun 的功能是将单向链表结点 (不包括头结点) 数据域为偶数的值累加起来,并且作为函数值返回。请改正函数 fun 中的错误,使它能得出正确的结果。

注意:部分源程序在文件 modi1.c 中。 不要改动 main 函数,不得增行或删行,也不得更改程序的结构!

代码如下:
在代码中找出2个错误并修改

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
  struct aa *next;
} NODE;
int fun (NODE *h)
{ int sum=0;
  NODE *p;
  p=h->next;
/*************found**************/
  while(p -> next)
       { if(p->data%2==0)
             sum+=p->data;
/*************found**************/
          p=h->next;
       }
  return sum;
}
NODE *creatlink(int n)
{ 
  NODE *h,*p,*s;
  int i;
  h=p=(NODE*)malloc(sizeof(NODE));
  for(i=1;i<n;i++)
  {
    s=(NODE*)malloc(sizeof(NODE));
    s->data=rand()%16;
    p->next=s;
    p=p->next;
  }
  p->next=NULL;
  return h;
}
void outlink(NODE *h)
{ NODE  *p;
  p=h->next;
  printf("\n\n The LIST :\n\n HEAD");
  while(p)
    { printf("->%d",p->data); 
      p=p->next;}
  printf("\n");
}
void main()
{ NODE *head; int sum;
  system("CLS");
  head=creatlink(10);
  outlink(head);
  sum=fun(head);
  printf("\nSUM=%d",sum); 
}

分析🧐

这道题虽然是一道链表题,但还是比较容易理解的,这里只要看fun函数即可

  1. 第13行改成
    while(p != NULL)
    脑子里要有画面,想象一下
    由11行可以知道,p指向的,是当前要判断的
  2. 第17行改成
    p = p -> next;
    这里要注意就是当前指针走就可以了,原始的指针不动
    动了就没有意义了

解答代码如下:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
  struct aa *next;
} NODE;
int fun (NODE *h)
{ int sum=0;
  NODE *p;
  p=h->next;
/*************found**************/
  1️⃣while(p  != NULL)
       { if(p->data%2==0)
             sum+=p->data;
/*************found**************/
            //每次只要移动p就可以了
            //画图就很清楚了
         2️⃣ p=p->next;
       }
  return sum;
}
NODE *creatlink(int n)
{ 
  NODE *h,*p,*s;
  int i;
  h=p=(NODE*)malloc(sizeof(NODE));
  for(i=1;i<n;i++)
  {
    s=(NODE*)malloc(sizeof(NODE));
    s->data=rand()%16;
    p->next=s;
    p=p->next;
  }
  p->next=NULL;
  return h;
}
void outlink(NODE *h)
{ NODE  *p;
  p=h->next;
  printf("\n\n The LIST :\n\n HEAD");
  while(p)
    { printf("->%d",p->data); 
      p=p->next;}
  printf("\n");
}
void main()
{ NODE *head; int sum;
  system("CLS");
  head=creatlink(10);
  outlink(head);
  sum=fun(head);
  printf("\nSUM=%d",sum); 
}

三、程序设计💻 --- 判断回文

难度:⭐⭐⭐

题目📃

在此程序中,编写函数 fun,该函数的功能是:判断字符串是否为回文,若是,则函数返回 1,主函数中输出 "YES",否则返回 0,主函数中输出 "NO"。回文是指顺读和倒读都一样的字符串。

例如,字符串 LEVEL 是回文,而字符串 123312 就不是回文。

注意:部分源程序在文件 prog1.c 中。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。

代码如下:
在fun函数中编写

#include <stdio.h>
#include <string.h>
#define  N  80
int fun(char *str)
{
    
}
main()
{ char  s[N] ;void NONO ();
  printf("Enter a string: ") ; gets(s) ;
  printf("\n\n") ; puts(s) ;
  if(fun(s)) printf("  YES\n") ;
  else       printf("  NO\n") ;
}

分析🧐

这道题就是编写判断是否为回文的程序

  1. 先定义两个指针,i, j
  2. i 指向最前面
  3. j 指向最后面
  4. 依次进行判断即可

解答代码如下:

#include <stdio.h>
#include <string.h>
#define  N  80
int fun(char *str)
{
    //先求得字符串总长度
    int len = strlen(str);
    int i, j;
    //i从0开始
    //j从len - 1开始,依次进行对比
    for(i = 0, j = len - 1; i < j; i++, j--)
    {
        if(str[i] != str[j])
            return 0;
    }
    return 1;
}
main()
{ char  s[N] ;
  printf("Enter a string: ") ; gets(s) ;
  printf("\n\n") ; puts(s) ;
  if(fun(s)) printf("  YES\n") ;
  else       printf("  NO\n") ;
}

希望本文能够帮助到你😊

目录
相关文章
|
2月前
|
Java 程序员 应用服务中间件
Maven之初识与安装
本文详解Maven安装与配置全流程:从基础概念、下载安装、环境变量配置到版本验证,助新手一次理清逻辑、顺利完成部署;涵盖一键构建、依赖管理核心功能,并提供交流支持。
212 0
Maven之初识与安装
|
2月前
|
存储 C语言
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
本文详解C语言二级考试三类典型题:统计字母及非字母字符个数、数字字符串转双精度浮点数、二维数组上下三角区域数据对调。含题目解析、错误定位与完整代码,适合备考学生、中职生及编程爱好者提升实战能力。
143 1
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
|
2月前
|
Java 测试技术 数据库连接
Maven 之 JUnit 测试体系构建全解析
本文详解Maven工程中JUnit单元测试实践:从pom.xml依赖配置、test目录结构规范,到@Test断言验证、@Before/@After资源管理,涵盖黑/白盒测试原理与结果判定技巧,助力保障Java代码质量。(239字)
112 1
|
2月前
|
C语言 数据安全/隐私保护
二级C语言题解:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母
本教程专为C语言二级考生、中职学生及编程初学者设计,涵盖三大核心题型:二维数组每行最大值与首元素交换、结构体重复项删除(保留首个)、字符串单词首字母提取。含详细分析、易错点解析与标准代码,助你夯实基础、提升解题思维。
110 2
二级C语言题解:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母
|
2月前
|
人工智能 C语言
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
本文详解三类经典编程题:十进制转任意进制(填空)、非素数求和(修改)与重复数字统计(设计),含完整代码、逐空分析及易错点解析,助你夯实C语言基础。
143 2
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
|
2月前
|
C语言 索引
二级C语言题解:迭代求根、字符串加法、字符串拆分
本文详解三道C语言编程题:①迭代法求平方根(牛顿法),误差≤1e-6;②字符串模拟大数加法,处理进位与字符数字转换;③字符串按索引模3拆分为三子串。含填空、修改、设计三类题型及完整解析代码。
91 1
二级C语言题解:迭代求根、字符串加法、字符串拆分
|
2月前
|
SQL Java 数据库连接
MyBatis 之基础概念与框架原理详解
MyBatis是一款轻量级半自动ORM框架,封装JDBC,让开发者专注SQL编写与业务逻辑;支持XML/注解配置、动态SQL、高级映射,SQL与代码分离,灵活高效,显著提升持久层开发效率。(239字)
143 1
MyBatis 之基础概念与框架原理详解
|
2月前
|
机器学习/深度学习 算法 C语言
二级C语言题解:矩阵主、反对角线元素之和,二分法求方程根,处理字符串中 * 号
本文详解三道C语言编程题:①矩阵主/反对角线元素求和(填空);②二分法求方程根(修改错误);③删除字符串中间的“*”号(程序设计)。含题目分析、易错点解析与完整代码,助力算法与指针实践能力提升。
99 1
二级C语言题解:矩阵主、反对角线元素之和,二分法求方程根,处理字符串中 * 号
|
2月前
|
Java 应用服务中间件 Shell
Tomcat 使用与配置全解
Tomcat是Apache开源的轻量级Java Web容器,实现Servlet/JSP规范,支持Web应用部署与运行。需搭配JDK使用,目录结构清晰(如webapps存应用、conf存配置),默认端口8080,启动简单,广泛用于开发与中小型项目部署。
186 1
Tomcat 使用与配置全解
|
2月前
|
前端开发 Java 测试技术
Maven 之工程构建与依赖管理全攻略
本文系统讲解Maven核心知识:涵盖POM/JAR/WAR工程类型与标准目录结构;详解构建生命周期(validate→compile→test→package→install→deploy)及常用命令;深入解析本地/远程/中央仓库机制,并指导配置本地仓库路径、阿里云镜像及JDK版本。内容精炼实用,助开发者快速掌握Maven项目管理精髓。
158 1
Maven 之工程构建与依赖管理全攻略

热门文章

最新文章