6-1 循环单链表区间删除

本题要求实现带头结点的循环单链表的创建和单链表的区间删除。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;
    }
  
好的,循环单链表是一种特殊的线性数据结构,在这种结构中最后一个节点指向第一个节点形成闭环。当我们需要对其中的一个区间进行删除操作时,首先得明确区间的边界,并保证剩余部分仍能构成有效的循环单链表。 ### C++ 实现思路: #### 1. 定义结点结构 ```cpp struct Node { int data; Node* next; }; ``` #### 2. 查找起始位置 为了定位到待删区间的开始处 `start` 结束处 `end`, 我们从头节点遍历直到找到满足条件的位置为止: ```cpp Node* findStart(Node *head, int startValue) { // 寻找起点 if (!head || head->data == startValue) return head; Node *current = head->next; while (current != head && current->data != startValue){ current = current->next; } return current; } Node* findEnd(Node *start, int endValue){ //寻找终点 if(!start || start->data==endValue) return start; Node* current=start->next; do{ if(current->data==endValue) break; else current=current->next; }while(current!=start); return current; } ``` 请注意这里我们采用do...while是为了防止当整个列表都是相同的值的时候陷入死循环 #### 3. 进行区间移除并连接断开的部分 一旦确定了 `start` `end` 后,则可以从 `head` 节点出发绕过该范围内的所有元素直至重新链接回原来链条上位于 `end -> next`. ```cpp void removeInterval(Node*& head, Node* start, Node* end) { if(start == NULL || end ==NULL ) return ; // 如果是要删除整条链表 if(head==start&&head==end) head=NULL; else if (start == end) { // 只有一个元素的情况 Node* prev = head; do { if(prev->next == start) break; prev=prev->next; } while(prev!=head); prev->next = start->next; delete start; } else{ start->next=end->next;//跳过中间的所有节点 deleteNodesBetween(start,end);//删除start与end之间的节点 } } void deleteNodesBetween(Node *srt,Node *edn){ Node* temp=srt->next,*temp_next; while(temp!=edn){ temp_next=temp->next; delete temp; temp=temp_next; } delete edn; } ``` 上述代码展示了如何安全地移除非空且非完整环形列表中的指定段落同时保持其余部分的有效连通特性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值