头歌平台——C语言之链表练习题

news2024/11/20 3:27:57

第1关:建单向链表

任务描述

本关需要你建立一个带头结点的单向链表。

相关知识

什么是链表?链表和二叉树是C语言数据结构的基础和核心。

链表有多种形式,它可以是单链接的或者双链接的,可以是已排序的或未排序的,可以是循环的或非循环的。

本关让我们来学习单链表。

单链表

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始,链表是使用指针进行构造的列表,又称为结点列表,因为链表是由一个个结点组装起来的,其中每个结点都有指针成员变量指向列表中的下一个结点。

列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。

一个简单结点的结构体表示为:

 
  1. struct note
  2. {
  3. int data; /*数据成员可以是多个不同类型的数据*/
  4. struct note *next; /*指针变量成员只能是-个*/
  5. };

让我们来看个简单的单向链表的图示:

  • 链表是结构、指针相结合的一种应用,它是由头、中间、尾多个链环组成的单方向可伸缩的链表,链表上的链环我们称之为结点;

  • 每个结点的数据可用一个结构体表示,该结构体由两部分成员组成:数据成员与结构指针变量成员;

  • 数据成员存放用户所需数据,而结构指针变量成员则用来连接(指向)下一个结点,由于每一个结构指针变量成员都指向相同的结构体,所以该指针变量称为结构指针变量;

  • 链表的长度是动态的,当需要建立一个结点,就向系统申请动态分配一个存储空间,如此不断地有新结点产生,直到结构指针变量指向为空(NULL)。

申请动态分配一个存储空间的表示形式为:

(struct note*)malloc(sizeof(struct note))

链表的建立

在链表建立过程中,首先要建立第一个结点,然后不断地在其尾部增加新结点,直到不需再有新结点,即尾指针指向NULL为止。

设有结构指针变量。

struct note *p,*p1,*head;

head:用来标志链表头;

p:在链表建立过程中,p总是不断先接受系统动态分配的新结点地址。

p1->next:存储新结点的地址。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

键盘输入一组元素,建立一个带头结点的单向链表(无序)。

要求:

  • 输入整数的长度以及整数;

  • 输出无序的单向链表。

效果如下:

输入: 5 1 23 4 8 9 输出:1 23 4 8 9

测试说明

平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。

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

typedef struct node {
    int data;
    struct node *next;
}Node;

     // 请在此添加你的代码
    /********** Begin **********/
    Node *CreatList()
{
    Node *head,*newone,*end;
    int n;int i;int T=1;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        newone=(Node*)malloc(sizeof(Node));
        if(T==1)
        {
            head=newone;
            T--;
        }
        else end->next=newone;
        end=newone;
        end->next=NULL;
        scanf("%d",&end->data);
    }
    return head;
    
}
void ShowList(Node *head)
{
    Node *end=head;
    for(;end!=NULL;end=end->next)
    {
        printf("%d ",end->data);
    }
}

    /**********  End  **********/
int main(void)  
{  
    Node *phead; 
    phead = CreatList();  
    ShowList(phead);
    return 0;  
}

第2关:统计单链表中的节点数 

任务描述

本小节需要你统计单链表中的节点数。

相关知识

根据上一关我们知道怎么创建单链表了,那么这一关让我们巩固一下单链表的知识。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

编写程序,从键盘输入一串整数以及整数的个数,以单链表形式存储起来,计算单链表中结点的个数,输出单链表的数据及结点的个数。

效果如下: 输入: 8 12367802

输出: 12367802 8

测试说明

平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。

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

typedef struct node {
    int data;
    struct node *next;
}Node;

     // 请在此添加你的代码
    /********** Begin *********/
Node *CreatList()
{
    Node *head,*newone,*end;
    int n;int i;int T=1;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        newone=(Node*)malloc(sizeof(Node));
        if(T==1)
        {
            head=newone;
            T--;
        }
        else end->next=newone;
        end=newone;
        end->next=NULL;
        scanf("%d",&end->data);
    }
    return head;
}
void ShowList(Node *head)
{
    Node *end=head;
    for(;end!=NULL;end=end->next)
    {
        printf("%d ",end->data);
    }
    printf("\n");
}
int Length(Node *phead)
{
    int a=0;
    for(;phead!=NULL;phead=phead->next)
    {
        a=a+1;
    }
    return a;
}

    /**********  End  **********/
int main(void)  
{  
    Node *phead; 
    phead = CreatList();  
    ShowList(phead);
    printf("%d", Length(phead));  
    return 0;  
}

第3关:单链表逆置 

任务描述

本关需要你设计一个程序,实现单链表的逆置。

相关知识

单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果,但还是有着不小的差别。

头插法

逆置链表初始为空,表中节点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空。

举例:

 
  1. void converse(LinkList *head)
  2. {
  3. LinkList *p,*q;
  4. p=head->next;
  5. head->next=NULL;
  6. while(p)
  7. {
  8. /*向后挪动一个位置*/
  9. q=p;
  10. p=p->next;
  11. /*头插*/
  12. q->next=head->next;
  13. head->next=q;
  14. }
  15. }

就地逆置法

先假定有一个函数,可以将以head为头结点的单链表逆序,并返回新的头结点。利用这个函数对问题进行求解:将链表分为当前表头结点和其余部分,递归的过程就是,先将表头结点从链表中拆出来,然后对其余部分进行逆序,最后将当前的表头结点链接到逆序链表的尾部。递归的终止条件就是链表只剩一个节点时,直接返回这个节点。

举例:

 
  1. LinkList* converse(LinkList *head)
  2. {
  3. LinkList *newHead;
  4. if(head==NULL||head->next==NULL)
  5. return head;
  6. /*递归*/
  7. newHead=converse(head->next);
  8. /*回溯:将当前表头结点链接到逆序链表的尾部*/
  9. head->next->next=head;
  10. head->next=null;
  11. return newHead;
  12. }
编程要求
  • 按程序提示输入并创建一个单链表,带有头结点;

  • 可自定义链表的长度,可自定义链表储存的数据类型,注意更改相应的输入输出方式;

  • 实现单链表的逆置,直观地输出结果。

效果如下: 输入:

6 1 212 7 8 0 2

输出:

链表逆置前的数据: 1 212 7 8 0 2 链表逆置后的数据: 2 0 8 7 212 1

测试说明

平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。

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

typedef struct node {
    int data;
    struct node *next;
}Node;

     // 请在此添加你的代码
    /********** Begin *********/
Node *CreatList()
{
    Node *head,*newone,*end;
    int n;int i;int T=1;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        newone=(Node*)malloc(sizeof(Node));
        if(T==1)
        {
            head=newone;
            T--;
        }
        else end->next=newone;
        end=newone;
        end->next=NULL;
        scanf("%d",&end->data);
    }
    return head;
}
void ShowList(Node *head)
{
    Node *end=head;
    for(;end!=NULL;end=end->next)
    {
        printf("%d ",end->data);
    }
    printf("\n");
}
Node *ReverseList(Node *head)
{
    Node *newhead;
    if(head==NULL||head->next==NULL)
        return head;
    newhead=ReverseList(head->next);
    head->next->next=head;
    head->next=NULL;
    return newhead;
}


    /**********  End  **********/
int main(void)  
{  
    Node *phead;  
    phead = CreatList();  
    printf("链表逆置前的数据:\n");  
    ShowList(phead);  
    phead = ReverseList(phead);  
    printf("链表逆置后的数据:\n");  
    ShowList(phead);  
    return 0;  
}   

 

 

 

 

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

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

相关文章

C# CodeFormer 图像(人脸面部)修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {p…

AArch64 TrustZone

概述 本文我们介绍了 TrustZone 技术。通过CPU内置的硬件强制隔离&#xff0c;TrustZone 提供了一种高效的全系统安全设计。 我们介绍了如下功能&#xff1a;将 TrustZone 技术添加到处理器架构中&#xff0c;内存系统对于 TrustZone 的支持以及典型的软件架构。我们还介绍了…

京东API接口助力京东ToB和ToC全面发展

目前京东企业业务已建成7大智能化采购平台&#xff0c;3大场景化产品&#xff0c;4条企业专属供应链体系&#xff0c;发布API接口200余个&#xff0c;在ToB场景的应用能力方面&#xff0c;京东企业业务在2019年还推出三款重量级的技术产品——采购ERP、神算子数据平台和采购大脑…

插入排序 算法

从第二个开始&#xff0c;从后面往前找&#xff0c;如果比其小&#xff0c;就交换&#xff0c;else 就终止 for i 1 i <n i for j i j > 0 (到第二个) j-- if < swap 下面给出源码 //对插入排序来说&#xff0c;直接从第二个元素开始template<ty…

2024北京智能科技展(世亚智博会)推动我国智能科技产业快速发展

2024北京国际智能科技展览会&#xff08;世亚智博会&#xff09; 2024 Shanghai Smart Product Expo 时间:2024年6月28-30日 地点:北京亦创国际会展中心 主题展:北京人工智能展览会|北京软件博览会 随着科技的飞速发展&#xff0c;中国正逐渐成为全球科技领域的一面旗帜。在…

官宣!软考机考模拟练习平台于10月16日至11月3日开放

软考机考模拟练习平台已经在官网公布了&#xff0c;已经报名的考生可以按照以下操作指南开始练习&#xff1a; 1、登陆网上报名平台地址&#xff0c;点击【模拟练习平台】 全国计算机技术与软件专业技术资格(水平)考试网上报名平台 2、登录 温馨提示&#xff1a;实名认证通过…

嵌入式学习笔记(59)内存管理之结构体

数据结构&#xff1a;是一门研究数据在内存中如何分布的学问。 1.5.1.最简单的数据结构&#xff1a;数组 数组的特点&#xff1a;类型相同、意义相关 数组的优势&#xff1a;数组比较简单&#xff0c;访问使用下标&#xff0c;可以随机访问&#xff08;就是可以通过下标随机…

使用crul库和R语言的下载器程序

以下是一个使用crul库和R语言的下载器程序&#xff0c;用于从下载音频。此程序使用了jshk.com.cn/get_proxy的代码。 // 导入必要的库 import ("fmt""github.com/cjlapa/crul""io""net/http""net/url""os" )// 主…

视频文件打不开?盘点4个有效方法!

“好奇怪呀&#xff0c;我将相机里的部分视频导入电脑了&#xff0c;但是这些视频都无法打开。视频文件打不开是为什么呢&#xff1f;应该怎么做才能正常播放视频呀&#xff1f;” 随着数字化媒体的普及&#xff0c;视频文件在我们的生活中扮演着越来越重要的角色。然而&#x…

一文搞定专属码的设计与开发

作者 | 木白 导读 本文将为您介绍百度码的译码技术&#xff0c;包括关键的译码流程和关键的优化手段。百度码目前已经在高考等活动中进行应用&#xff0c;在未来的发展中&#xff0c;百度码的译码技术将继续升级和完善&#xff0c;以满足更多场景的需求。百度码的译码技术将在现…

【C++】C++智能指针

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】C异…

IDEA设置标签多行展示

一、打开IDEA工具 二、IDEA页面左上角File里边settings设置 三、找到Editor --》 General --》 Editor tabs 四、取消单行展示选项 五、设置最多页签个数 参考&#xff1a;IDEA设置标签多行展示-腾讯云开发者社区-腾讯云

漏洞复现--用友NC-Cloud全版本任意文件上传/RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

企业需要的真是CRM系统吗?

CRM概念已经讲了十几年&#xff0c;第一波上CRM客户管理系统的企业已经更换了若干次系统&#xff0c;还是有不少企业并不知道他们正在寻找的、希望用于解决实际问题的&#xff0c;到底是一款什么软件。企业需要的真是CRM系统吗&#xff1f; 近年来CRM概念不断延展&#xff0c;…

高性能计算与多模态处理的探索之旅:英伟达GH200性能优化与GPT-4V的算力加速未来

★多模态大模型&#xff1b;GPU算力&#xff1b;LLMS&#xff1b;LLM&#xff1b;LMM&#xff1b;GPT-4V&#xff1b;GH200&#xff1b;图像识别&#xff1b;目标定位&#xff1b;图像描述&#xff1b;视觉问答&#xff1b;视觉对话&#xff1b;英伟达&#xff1b;Nvidia&#…

Nginx详细配置指南

nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件&#xff0c;该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织&#xff1a; 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…

R17 RedCap(二) 一些配置上的具体要求

在上一篇R17 Redcap中&#xff0c;已经基本上把spec中有关RedCap的内容全都捞了出来&#xff0c;其实还有漏网之鱼&#xff0c;比如38.213中的内容就给漏掉了。38.213中的内容和上篇内容有重复的地方&#xff0c;当然有也上篇没有提及的内容&#xff0c;比如Recap PUCCH 跳频相…

CRM系统中的营销归因模型有哪些?

在市场营销预算缩减的环境下&#xff0c;需要企业在每个渠道展示可量化的结果。CRM客户管理系统的营销归因功能&#xff0c;让市场部的每一个决策都充满智慧。那么CRM系统中的营销归因模型有哪些&#xff1f;下面我们以Zoho CRM为例&#xff1a; 1、首次接触归因模型 首次接触…

python学习笔记6-DefaultDict

对于一般的字典来说&#xff0c;如果键不存在会导致【KeyError】&#xff0c;因此可以考虑用DefaultDict # Defining the dict d defaultdict(def_value) d["a"] 1 d["b"] 2print(d["a"]) print(d["b"]) print(d["c"…

SQL Developer不显示左侧数据库连接目录怎么处理

当使用SQL Developer工具有时候会发现没有左侧的菜单栏了&#xff0c;比如下面这样 这个是时候就按照这个操作就可以恢复&#xff0c;不影响数据