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 条评论
登录 后参与评论

相关文章

来自专栏后端之路

优先级队列之PriorityQueue

背景 前面几篇的队列基本都是和插入顺序相关的,一般来说可以先进先出,当然也可以通过双向队列实现进后出等等 那么在开发中还存在如下一些需求 不同的任务过来可以进入...

2877
来自专栏容器云生态

Golang正则模块使用

最近在开发过程中会遇到一些字符串匹配相关的内容,正好去大概学习了下Golang中的regexp模块。因为目前正则模块对我来说更多的就是去匹配并处理字符串的,因此...

2125
来自专栏程序员维他命

《Effective Objective-C 》干货三部曲(三):技巧篇

继上一篇《Effective Objective-C 》超级干货三部曲(二):规范篇之后,本篇即是三部曲的第三篇:技巧篇。本篇作为三部曲的最终篇,归纳讲解的是本...

942
来自专栏猿人谷

顺序线性表

线性表的顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。 线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置...

1815
来自专栏从流域到海域

《数据结构》 顺序表常用操作代码集合

Ps:每段代码中,添加了署名Solo的是博主自己写的,其余来自课本或者老师。 //定义线性表的存储结构 #define MAXSIZE 100 typedef...

1725
来自专栏从流域到海域

《数据结构》 单链表常用操作代码集合

Ps:每段代码中,添加了Solo署名的是博主自己写的,其余来自课本或老师。 //单链表存储结构 typedef struct Node //结点类型定义 ...

1936
来自专栏数据结构与算法

1048 石子归并

1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n堆石子...

2633
来自专栏苍云横渡学习笔记

【慕课-数据结构-C++语言】队列篇

原文地址:https://www.cloudcrossing.xyz/post/30/

40419
来自专栏郭耀华‘s Blog

LeetCode第七天

==数组 Medium== 40.(162)Find Peak Element ? JAVA //斜率思想,二分法 class Solution { p...

33510
来自专栏数据结构与算法

HDU 1527 取石子游戏(威佐夫博弈)

Problem Description 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取...

3014

扫码关注云+社区