PTA 循环单链表区间删除 (15 分)

本题要求实现带头结点的循环单链表的创建和单链表的区间删除。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");
       return -1;
    }
    scanf("%d%d",&min,&max);    
    ListDelete_CL(CL,min,max);   
    ListPrint_CL(CL);      
    return 0;
}

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

输入格式: 第一行输入一个整数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;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从流域到海域

《数据结构》 循环链表和双向链表常用操作代码集合

Ps:每段代码中,添加了署名Solo的代码为博主本人所写,其余来自课本或者老师。 大量操作等同于单链表。重复的操作不再贴出,可以查看之前的博文。 循环链表 //...

20370
来自专栏数据结构笔记

数据结构(三):线性表

该序列中所含的元素个数叫做线性表的长度,用 n表示(n>=0)。当 n=0时,表示线性表是一个空表,即表中不包含任何数据元素。

20860
来自专栏撸码那些事

【图解数据结构】 线性表

26950
来自专栏WD学习记录

Python数据结构与算法笔记(4)

前序遍历中,我们首先访问根节点,然后递归地做左侧子树的前序遍历,随后是右侧子树的递归前序。

13120
来自专栏令仔很忙

集合详解(二)----ArrayList源代码剖析(JDK1.7)

ArrayList是List类的一个典型的实现,是基于数组实现的List类,因此,ArrayList封装了一个动态的、可变长度的Object[]数组。Arra...

7610
来自专栏coolblog.xyz技术专栏

ArrayList 源码详细分析

ArrayList 是一种变长的集合类,基于定长数组实现。ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时...

44380
来自专栏个人分享

JAVA源码走读(一) HashMap与ArrayList

HashMap是基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变...

11920
来自专栏小灰灰

JDK容器学习之Queue: PriorityQueue

优先级队列 PriorityQueue 单端队列,队列中的元素有优先级的顺序 ? 1. 底层数据结构 // 存储队列元素的数组 transient Object...

24350
来自专栏赵俊的Java专栏

LeetCode 804 Unique Morse Code Words

首先为每个单词的每个字符进行转码, 将转码后的数据放到 Set 集合中, 最后返回 Set 的长度。

11440
来自专栏一枝花算不算浪漫

Java中常见数据结构List之ArrayList

393120

扫码关注云+社区

领取腾讯云代金券