二级C语言题解:单链表的排序、求单链表的最大值、二维数组按行存入一维数组

简介: 本文详解三道经典编程题:①带头结点单链表从小到大排序(填空);②求单链表(不含头结点)最大值(改错);③将M×N二维数组按行优先存入一维数组(设计)。含完整代码、逐行分析与图解,助力夯实数据结构基础。

前言
本文讲解:单链表的排序、求单链表的最大值、二维数组按行存入一维数组

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

(如何输出三角形? ---> 传送门

一、程序填空📝 --- 单链表的排序

难度:⭐⭐

题目📃

在这个程序里,函数 fun 的功能是对带头结点的单向链表结点数据域中的数据进行从小到大排序
比如原链表结点数据域从头到尾的数据是 10、4、2、8、6 ,排序后链表结点数据域从头到尾的数据就变为 2、4、6、8、10。
请在程序的下画线处填入正确内容,并删除下画线,让程序能得出正确结果。

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

#include  <stdio.h>
#include  <stdlib.h>
#define    N    6
typedef struct node {
  int  data;
  struct node  *next;
} NODE;
void fun(NODE  *h)
{ NODE  *p, *q;    int  t;
/**********found**********/
  p = 1️⃣;
  while (p) {
/**********found**********/
      q = 2️⃣ ;
     while (q) {
/**********found**********/
        if (p->data 3️⃣ q->data)
        {  t = p->data;  p->data = q->data;  q->data = t;  }
        q = q->next;
    }
    p = p->next;
  }
}
NODE *creatlist(int  a[])
{  NODE  *h,*p,*q;        int  i;
  h = (NODE *)malloc(sizeof(NODE));
  h->next = NULL;
  for(i=0; i<N; i++)
  {  q=(NODE *)malloc(sizeof(NODE));
     q->data=a[i];
     q->next = NULL;
     if (h->next == NULL)  h->next = p = q;
     else    {  p->next = q;  p = q;   }
  }
   return  h;
}
void outlist(NODE  *h)
{ NODE  *p;
  p = h->next;
  if (p==NULL)  printf("The list is NULL!\n");
  else
  {  printf("\nHead  ");
     do
     {  printf("->%d", p->data); p=p->next;  }
     while(p!=NULL);
     printf("->End\n");
  }
}
void main()
{  NODE  *head;
   int  a[N]= {0, 10, 4, 2, 8, 6 };
   head=creatlist(a);
   printf("\nThe original list:\n");
   outlist(head);
   fun(head);
   printf("\nThe list after sorting :\n");
   outlist(head);
}

分析🧐

碰到这个单向链表题,可以直接根据题目到fun函数中,去填空

  1. 填写h -> next;
    因为是带头节点的链表
    所以要跳过头节点
  2. 填写 p -> next
    因为从下方的循环,可以知道这里是比较前后两个数的大小
    p 是当前的值,要和下一个进行比较,所以就是当前 p 的下一个
  3. 填写 >
    根据题意是从小到大排序
    当前值比后一个值要大,就交换
    这样大的值就跑到后面去了

解答代码如下:

void fun(NODE  *h)
{ NODE  *p, *q;    int  t;
/**********found**********/
  //因为是带头节点的,第一个节点没有数据
  //所以跳过
  p = 1️⃣h -> next;
  while (p) {
/**********found**********/
      //因为要两个相邻的数比较
      //所以就是他的下一个
      q = 2️⃣p -> next ;
     while (q) {
/**********found**********/
        if (p->data 3️⃣> q->data)
        {  t = p->data;  p->data = q->data;  q->data = t;  }
        q = q->next;
    }
    p = p->next;
  }
}

二、程序修改🛠️ --- 求单链表的最大值

难度:

题目📃

在此程序中,建立一个带头结点的单向链表,并用随机函数为各结点数据域赋值。函数 fun 的作用是求出单向链表结点 (不包括头结点) 数据域中的最大值,并且作为函数值返回。

请改正函数 fun 中的错误,使它能得出正确的结果。

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

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
  struct aa *next;
} NODE;
int fun (NODE *h)
{ int max=-1;
  NODE *p;
/*************found**************/
  p=h;
  while(p)
       { if(p->data>max)
             max=p->data;
/*************found**************/
          p=h->next;
       }
  return max;
}
void outresult(int s, FILE *pf)
{ fprintf(pf, "\nThe max in link :%d\n",s);
}
NODE *creatlink(int n, int m)
{ NODE *h,*p,*s;
  int i;
  h=p=(NODE *)malloc(sizeof(NODE));
  h->data=9999;
  for(i=1;i<=n;i++)
    { s=(NODE *) malloc(sizeof(NODE));
      s->data=rand()%m; s->next=p->next;
      p->next=s;  p=p->next;
    }
  p->next=NULL;
  return h;
}
void outlink(NODE *h,FILE *pf)
{ NODE  *p;
  p=h->next;
  fprintf(pf, "\n The LIST :\n\n HEAD");
  while(p)
    { fprintf(pf, "->%d",p->data); 
  p=p->next;}
  fprintf(pf, "\n");
}
void main()
{ NODE *head; int m;
  system("CLS");
  head=creatlink(12,100);
  outlink(head,stdout);
  m=fun(head);
  printf("\nThe RESULT :\n"); 
  outresult(m,stdout);
}

分析🧐

这也是一个单向链表的,所以只在main函数中看下对应fun函数传递的值,然后直接看fun函数即可

  1. 第12行改成
    p = h ->next;
    因为题目给出的是带头结点
    所以要跳过这个没有数据的头结点
  2. 第17行改成
    p = p->next;
    因为这是每次p自身移动
    而不是用不动的h

解答代码如下:

int fun (NODE *h)
{ int max=-1;
  NODE *p;
/*************found**************/
  1️⃣p=h ->next;
  while(p)
       { if(p->data>max)
             max=p->data;
/*************found**************/
         2️⃣p=p->next;
       }
  return max;
}

三、程序设计💻 --- 二维数组按行存入一维数组

难度:

题目📃

在此程序中,编写函数 fun,该函数的功能:
将 M 行 N 列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参 n 所指的存储单元中。
例如,若二维数组中的数据为:
33 33 33 33
44 44 44 44
55 55 55 55
则一维数组中的内容应该是:33 33 33 33 44 44 44 44 55 55 55 55

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

#include <stdio.h>
void  fun(int  (*s)[10], int  *b, int  *n, int mm, int nn)
{
}
void main()
{ int w[10][10] = {{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ;
  int a[100] = {0}, n = 0 ;void NONO ();
  printf("The matrix:\n") ;
  for(i = 0 ; i < 3 ; i++)
  { for(j = 0 ; j < 4 ; j++) printf("%3d",w[i][j]) ;
    printf("\n") ;
  }
  fun(w, a, &n, 3, 4) ;
  printf("The A array:\n") ;
  for(i = 0 ; i < n ; i++) printf("%3d",a[i]);printf("\n\n") ;
  NONO() ;
}

分析🧐

按行的顺序依次放到一维数组,那么就相当于是
从左往右依次将数据存储在另一个一维数组中
这道题还是挺简单的,就是要看到形参的作用

解答代码如下:

void  fun(int  (*s)[10], int  *b, int  *n, int mm, int nn)
{
    int i, j, flag = 0;
    //控制行
    for(i = 0; i < mm; i++)
    {
        //控制列
        for(j = 0; j < nn; j++)
        {
            //存入对应的数组
            b[flag++] = s[i][j];
        }
    }
    // flag刚好就是这个数组里数据的个数
    // 存入n指针,对应main函数的值,也会随之改变
    *n = flag;
}

最重要的是会画图,根据题目画出图来,就能很快的看出来怎么写了
希望本文对您有所帮助(* ̄︶ ̄)

目录
相关文章
|
14天前
|
人工智能 Java 程序员
写给焦虑的程序员和计算机专业的同学:浪潮已至,我们高处见!
本文剖析AI编程浪潮下的程序员生存法则:AI不会淘汰程序员,只会淘汰不懂底层、不会驾驭AI的人。文章指出“AI万能论”与“固守传统”两大误区,强调夯实Java/C++等核心技术、积累AI实战项目、考取权威证书、参与编程比赛四大行动建议,助你成为真正掌控项目的技术主导者。
93 1
写给焦虑的程序员和计算机专业的同学:浪潮已至,我们高处见!
|
17天前
|
前端开发 Java 测试技术
Maven 之工程构建与依赖管理全攻略
本文系统讲解Maven核心知识:涵盖POM/JAR/WAR工程类型与标准目录结构;详解构建生命周期(validate→compile→test→package→install→deploy)及常用命令;深入解析本地/远程/中央仓库机制,并指导配置本地仓库路径、阿里云镜像及JDK版本。内容精炼实用,助开发者快速掌握Maven项目管理精髓。
104 1
Maven 之工程构建与依赖管理全攻略
|
17天前
|
存储 C语言
二级C语言题解:整数序列奇偶个数、拼接数字字符、数组取偶数并加小数点
本文详解C语言三道经典编程题:①统计整数序列中奇偶数个数并返回结构体;②提取字符串中数字字符拼接成整数;③筛选数组偶数并按原序拼接为“数字.”格式字符串。含完整代码、填空/修改/设计解析及易错点提醒。
73 1
二级C语言题解:整数序列奇偶个数、拼接数字字符、数组取偶数并加小数点
|
22天前
|
存储 算法 区块链
Web3与分布式账本全解析:从班长账本丢包、非对称加密到数据主权回归
本文以“班级记账”为喻,通俗解析Web2中心化与Web3分布式架构的本质差异,深入浅出阐释非对称加密、共识机制、智能合约三大核心技术,揭示数据主权如何从平台回归用户,助力理解去中心化信任的底层逻辑。
111 2
|
25天前
|
SQL 关系型数据库 MySQL
数据库表的三种关系,通俗易懂的讲解
本文通俗讲解数据库表的三种核心关系:一对多(如班级与学生)、一对一(加唯一约束的一对多)、多对多(需中间表实现)。含定义、约束规则、SQL示例及图解,助初学者快速掌握关系建模要点。
849 2
数据库表的三种关系,通俗易懂的讲解
|
1月前
|
人工智能 前端开发 安全
词帆 CiFan:基于故事分级阅读与 AI 伴学的英语学习平台
词帆(CiFan)是面向乡村儿童与外语初学者的公益AI伴学平台,基于GGU分级阅读体系,提供极轻量Web端体验。支持点击查词、AI长难句大白话解析、趣味串词故事生成、艾宾浩斯复习及多模态学习统计,适配低配设备
113 3
词帆 CiFan:基于故事分级阅读与 AI 伴学的英语学习平台
|
14天前
|
程序员
解决 Word四大烦:消标记、去波浪线、关首字母大写、禁中文引号
程序员用Word常遇代码标识符乱、英文首字母误大写、自动中文引号、未保存丢文档等痛点。本文手把手教你:关闭波浪线/符号标记、禁用首字母大写、还原英文引号、缩短自动保存至1分钟——让Word秒变清爽“代码友好型”编辑器!
120 0
|
1月前
|
存储 安全 JavaScript
外卖平台上的XSS与CSRF攻防全解析:从一次弹窗到百万蠕虫
本文以一次搜索框弹窗事故为引,系统剖析Web安全核心攻击链:从反射型XSS(用户输入未过滤→恶意脚本执行),到Cookie窃取与CSRF身份盗用,再到存储型XSS(评论区持久化攻击),最终演变为Samy蠕虫的指数级传播。涵盖原理、案例、对比及HTTPOnly、CSP、CSRF Token等实用防御方案。(239字)
242 5
外卖平台上的XSS与CSRF攻防全解析:从一次弹窗到百万蠕虫
|
17天前
|
Java 数据库连接 数据库
MyBatis 之关联查询(一对一、一对多及多对多实现)
本文详解MyBatis关联查询:涵盖一对一(association)、一对多(collection)及多对多(本质为两个一对多)的映射配置与实战示例,含实体设计、XML映射、SQL编写及测试代码,助开发者高效处理表间关系。
83 0
MyBatis 之关联查询(一对一、一对多及多对多实现)
|
1月前
|
安全 网络安全 数据安全/隐私保护
公共 Wi-Fi 流量安全全解析:从明文监听、流量拦截到 HTTPS 降级攻防
本文深入剖析公共Wi-Fi三大安全威胁:明文嗅探、伪造热点与HTTPS降级攻击,结合原理讲解、代码实操与防御方案,系统揭示无线网络全链路攻防逻辑,助开发者与普通用户构建扎实的流量安全防护认知。
213 1
公共 Wi-Fi 流量安全全解析:从明文监听、流量拦截到 HTTPS 降级攻防

热门文章

最新文章