本题要求实现带头结点的循环单链表的创建和单链表的区间删除。L是一个带头结点的循环单链表,函数ListCreate_CL用于创建一个循环单链表,函数ListDelete_CL用于删除取值大于min小于max的链表元素。

函数接口定义:

Status ListCreate_CL(LinkList &CL);
    void ListDelete_CL(LinkList &CL,ElemType min,ElemType max);

裁判测试程序样例:

//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//函数状态码定义
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;
typedef int  ElemType; //假设线性表中的元素均为整型  

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList; //循环单链表类型定义与单链表定义相同,区别在尾节点next取值

Status ListCreate_CL(LinkList &CL);  

void ListDelete_CL(LinkList &CL, ElemType min, ElemType max);

void ListPrint_CL(LinkList &CL)
{   //输出单链表,空表时输出Empty List。
    LNode *p=CL->next;  //p指向第一个元素结点
    if(p==CL){
      printf("Empty List");
      return;
    }
    while(p!=CL)
    {
        if(p->next!=CL)
            printf("%d ",p->data);
        else
            printf("%d",p->data);
        p=p->next;
    }
}
int main()
{
    LinkList CL;
    ElemType min,max;
    if(ListCreate_CL(CL)!= OK)
    {
       printf("循环链表创建失败!!!\n");
       ;
    }
    scanf("%d%d",&min,&max);
    ListDelete_CL(CL,min,max);
    ListPrint_CL(CL);
    ;
}

/* 请在这里填写答案 */

输入格式: 第一行输入一个整数n,表示循环单链表中元素个数,接下来一行共n个整数,中间用空格隔开。第三行输入min和max。

输出格式: 输出删除后循环链表的各个元素,两个元素之间用空格隔开,最后一个元素后面没有空格。

输入样例:

6
1 2 3 4 5 6
2 5

输出样例:

1 2 5 6

答案如下,含注解
Status ListCreate_CL(LinkList &CL)
 {
    int n,i;
     scanf("%d",&n);// the num of input numbers
     LNode  *realPtr, *tmpPtr;// 真实指针,和临时指针
     /*对于这道题目来说,CL是一个表,realPtr and tmpPtr 指向的都是表中的一个元素,
     开始的时候是个空表,对于表赋空 CL - >next =NULL .
     把真实的指针指向表头部。
     */
     CL = (LNode *)malloc(sizeof(LNode));
     CL->next=NULL;
     realPtr = CL;
     //赋值的第一个赋值给临时元素,再把元素串到表中
     for(i=1;i<=n;i++)
     {
         tmpPtr = (LNode *)malloc(sizeof(LNode));
         scanf("%d",&tmpPtr->data);
         if(!tmpPtr)
            exit(OVERFLOW);
         //如果内存开辟不出来,就退出程序,
         //下面把这个临时元素加入到CL表中
         realPtr->next = tmpPtr;
         realPtr = tmpPtr;
         //这步操作是把指针的位置往下移动一个位置,保证下个元素能够正常的添加到CL中,否则下次添加的位置就是这次的tmpPtr位置
     }
     realPtr->next = CL;
     return OK;
 }
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max)
{
    LNode *p,*sub;
    p = CL;
    while (p->next!=CL)
    {
    sub = p->next;
    if (sub->data > min&&sub->data < max) {
    p->next = sub->next;
    }
    // 通俗的说,sub 就是侦查兵,手中同时拿着 p->next 和 sub->next 这两条线,如果这和侦查兵位置被删除,他会把p->next 联到 sub->next 上
    else p = p->next;
    }
}

  

 

PTA 循环单链表区间删除 (15 分)的更多相关文章

  1. c语言循环单链表

    /************************************************************************* > File Name: singleLin ...

  2. c语言有头循环单链表

    /************************************************************************* > File Name: singleLin ...

  3. 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

    所实现的循环单链表的结构例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill ...

  4. C代码实现非循环单链表

    C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...

  5. 简单约瑟夫环的循环单链表实现(C++)

    刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...

  6. C语言版本:循环单链表的实现

    SClist.h #ifndef __SCLIST_H__ #define __SCLIST_H__ #include<cstdio> #include<malloc.h> # ...

  7. 带头结点的循环单链表----------C语言

    /***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...

  8. 循环单链表定义初始化及创建(C语言)

    #include <stdio.h> #include <stdlib.h> /** * 含头节点循环单链表定义,初始化 及创建 */ #define OK 1; #defin ...

  9. PTA 数组元素的区间删除

    6-6 数组元素的区间删除 (20 分)   给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 函数接口定义: ...

随机推荐

  1. web应用中的异常处理

    楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异常处理方法. 但是平时大家的工作一般是基于开发框架进行的(比如Spring MVC,或Spring Boo ...

  2. SiganlR 系列之概述

    简介 SignalR 是微软的 http 长连接(以下简称长连接)框架,它的出现为我们提供了一套行之有效的实时通信的解决方案. 背景 在http 1.0 时代,preRequest 都会建立新的tcp ...

  3. 机器学习-KNN分类器

    1.  K-近邻(k-Nearest Neighbors,KNN)的原理 通过测量不同特征值之间的距离来衡量相似度的方法进行分类. 2.  KNN算法过程 训练样本集:样本集中每个特征值都已经做好类别 ...

  4. S2_OOP第二章

    第一章 继承 语法 修饰符 子类 extends 父类{ //类定义不封 } 使用extends继承父类的属性和方法.使用super关键字调用父类的方法. 概念 继承是面向对象的三大特特之一,Java ...

  5. .Neter玩转Linux系列之六:Linux下MySQL的安装、配置、使用

    一.Linux安装MySQL (1)下载安装包:https://dev.mysql.com/downloads/mysql/ (2)解压并安装 命令:tar zxvf 文件名 解压完成之后,重名一下文 ...

  6. java基础解析系列(八)---fail-fast机制及CopyOnWriteArrayList的原理

    fail-fast机制及CopyOnWriteArrayList的原理 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列( ...

  7. 使用wsimport和JAX-WS调用Web Service接口

    本文简单举例说明如何使用wsimport工具和JAX-WS API调用Web Service接口.此方法的优点:使用JDK自带的工具和API接口,无需依赖第三方库. JDK版本:1.8.0_141开发 ...

  8. 30分钟快速学习Shell脚本编程

    什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...

  9. Thirft框架快速入门

    Thrift介绍1.什么是thrift?thrift早期由facebook内部团队开发,主要用于实现跨语言间的方法调用,属于远程方法调用的一种,后开源纳入apache中,成为了apache thrif ...

  10. Python学习手册 :Python 学习笔记第一天

    获取当前目录路径: import os os.getcwd() 在输入python程序时,尽量让不是嵌套结构的语句处于最左侧,要不然系统或许会出现"SyntaxError"错误 获 ...