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

这篇具有很好参考价值的文章主要介绍了头歌平台——C语言之链表练习题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第1关:建单向链表

任务描述

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

相关知识

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

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

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

单链表

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

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

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

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

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

第1关:建单向链表,c语言,链表,开发语言

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

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

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

  • 链表的长度是动态的,当需要建立一个结点,就向系统申请动态分配一个存储空间,如此不断地有新结点产生,直到结构指针变量指向为空(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;  
}   

 文章来源地址https://www.toymoban.com/news/detail-808035.html

 

 

 

到了这里,关于头歌平台——C语言之链表练习题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C 语言练习题更新

    目录(先不要看答案,首先自己做才能更好的领悟,做不来没关系) 题目一:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。 题目

    2024年02月14日
    浏览(33)
  • C语言之练习题

    欢迎来到我的: 世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 这期文章由:两题问答题+四道编程题;小孩在文章中写有详细解题思路,感谢大家支持支持。 思路: 首先我们要知道 x=x(x-1) 的含义; 假设x=3;也就是 011 ; 而x-1=2;是 010 ;

    2024年02月10日
    浏览(41)
  • C语言习题练习

    首先我们要了解什么是offsetof宏: . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值(以字节为单位)。 . 返回的值是size_t类型的无符号整数值,其字节数位于指定成员与其结构开头之间。 什么意思呢,可以看到下面这张图片: 下面我们来看到这一习题:

    2024年02月15日
    浏览(37)
  • 习题练习 C语言

    首先我们要了解什么是offsetof宏: . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值(以字节为单位)。 . 返回的值是size_t类型的无符号整数值,其字节数位于指定成员与其结构开头之间。 什么意思呢,可以看到下面这张图片: 下面我们来看到这一习题:

    2024年02月14日
    浏览(38)
  • 习题练习 C语言(暑期)

    今天为大家分享我暑假期间所练习的一些小题目! 相信大家看完之后都会有所提升的! 加油! 以下不正确的定义语句是( ) A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0}; B: char c2[] = {‘x10’, ‘xa’, ‘8’}; C: char c1[] = {‘1’,‘2’,‘3’,‘4’,‘5’}; D: int y[5+3]={0, 1, 3, 5, 7, 9}; 题目解

    2024年02月10日
    浏览(36)
  • C语言/C++练习题

    题目:从键盘输入年份和月份,输出这个月的天数。 【样例输入】2023 1 【样例输出】31 【样例输入】2020 2 【样例输出】29 提示:当输入的月份为2月份时,需要判断该年年份是否为闰年。 判断闰年的条件:年份为4的倍数并且不是100的倍数,或者年份是400的倍数。 ​ 在控制

    2024年02月06日
    浏览(34)
  • 【C语言】练习题整理:11

    今天是10道选择题 下面代码段的输出结果是: -12 自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。 如x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 计算顺序是

    2024年02月11日
    浏览(39)
  • C语言之数组练习题

    第1关:数组插入元素 300 任务要求 参考答案 评论106 任务描述 相关知识 数组 数组元素的表示方法 编程要求 测试说明 任务描述 本关需要你将一个数插入到一组已经排好序的数组并输出。 相关知识 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式

    2024年02月05日
    浏览(42)
  • 【C语言】初阶完结练习题

     🎈个人主页:库库的里昂  🎐CSDN新晋作者  🎉欢迎 👍点赞✍评论⭐收藏  ✨收录专栏:C语言初阶  ✨其他专栏:代码小游戏  🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 【前言】 C语言初阶 知识点已经全部更完,相

    2024年02月14日
    浏览(29)
  • C语言循环语句进阶练习题

    第1关:求出分数序列前n项之和 100 任务要求 参考答案 评论98 任务描述 相关知识 scanf 分数序列 编程要求 测试说明 任务描述 本关需要你求出分数序列前 n 项之和。 相关知识 你需要使用到 scanf 函数和循环语句来完成本关任务。 scanf 函数名: scanf 功 能:执行格式化输入 。 用

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包