循环单链表 | 循环删除表中所有最小值并输出

王道P38T19

代码:

void del_min(LinkList& L){
    LNode*p=L,*mp=L;
    while(p->next!=p){
        if(p->next==L){    //进行了一轮
            LNode*del=mp->next;
            mp->next=del->next;
            printf("%d ",del->data);
            p=p->next;    //跳过头结点 (这个语句放在删除语句之前)
            delete del;
            mp=L;
            continue;  //注意用这句话跳过下面的语句
        }
        if(p->next==p) break;
        if(p->next->data < mp->next->data){
            mp=p;
        }
        p=p->next;
    }
    delete p;
}

完整代码:

#include <cstdio>
#include <stdlib.h>

using namespace std;

typedef struct LNode{
    int data;
    struct LNode* next=NULL;
    LNode(int x=0){
        data=x;
    }
}LNode;

typedef LNode* LinkList;

LinkList  build_list(int * arr,int n){
    int i;
    LinkList L=new LNode;
    LinkList pre=L,p;
    for(i=0;i<n;i++){
        p=new LNode(arr[i]);
        pre->next=p;
        pre=p;
    }
    p->next=L;
    return L;
}

void show_list(LinkList& L){
    LinkList p=L->next;
    while(p!=L){
        printf("%d ",p->data);
        p=p->next;
    }
    puts("");
}

void append(LinkList& L,int d){
    LNode* p=new LNode(d),*end=L;
    while(end->next!=L) end=end->next;
    end->next=p;
    p->next=L;
}

void insert(LinkList& L,int i,int d){
    LNode* p=L,*n=new LNode(d);
    for(int j=0;j<i && p->next!=L;j++)
        p=p->next;
    n->next=p->next;
    p->next=n;
} 

void del_min(LinkList& L){
    LNode*p=L,*mp=L;
    while(p->next!=p){
        if(p->next==L){    //进行了一轮
            LNode*del=mp->next;
            mp->next=del->next;
            printf("%d ",del->data);
            p=p->next;    //跳过头结点 (这个语句放在删除语句之前)
            delete del;
            mp=L;
            continue;
        }
        if(p->next==p) break;
        if(p->next->data < mp->next->data){
            mp=p;
        }
        p=p->next;
    }
    delete p;
}

int main(){
    const int n=6;
    int A_arr[n]={1,2,3,4,2,0};
    LinkList A=build_list(A_arr,n);
    show_list(A);
    del_min(A);
}
 

注意:

(1)红色代码:注意工作指针p初始化

(2)粉色代码:注意指针滑动要在delete之前进行,不然在最小值在链表末尾的情况下会吧p的后继删除掉,导致空指针错误

(3)橙色代码:mp最小值前驱指针初始化

(4)continue加粗代码:注意加上continue在遍历一轮后跳过后面的语句

原文地址:https://www.cnblogs.com/TQCAI/p/8452369.html

时间: 2024-08-21 09:05:21

循环单链表 | 循环删除表中所有最小值并输出的相关文章

顺序表之删除表中元素最小值

1 #include<stdio.h> 2 #define MAX 10//表的长度为10 3 typedef int ElementType; 4 int length=0; 5 int value,pos;//记录值和位置 6 typedef struct { 7 ElementType i; 8 int length; 9 ElementType data[MAX]; 10 }Sorder; 11 //主要删除最小值的函数代码 ,由此可见删除了最小值1,位于数组0的位置 12 bool

【线性表5】线性表的链式实现:循环单链表

简介 循环单链表 是在在单链表的基础上,用最后的一个结点的指针域指向头结点形成的.因此它在逻辑上是一个环形结构. 循环单链表在实际编程中很少用. 要点:1.遍历结束的标志是 p == [头结点地址],而不是p==NULL 2.表为空的判断标志是:   if( head->next == head   ) 3.在单循环链表中,从任一结点出发都可访问到表中所有结点 循环链表一般还使用尾指针rear保存最后一个结点的地址,因为使用尾指针既可以快速找到 最后一个结点,也可以快速找到头结点. 简单的代码实

数据结构之---c语言实现循环单链表操作

//=========杨鑫========================// //循环单链表的实现 #include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkedList; int count = 0; //1.单循环链表的初始化 LinkedList init_ci

链表之循环单链表(用C语言描述)

上回说到建立链表的三种形式,分别是头插法,尾插法,和尾插法MAX?? ??下面讲一下循环单链表?? 循环单链表,字面意思,就是单链表循环了起来,尾节点在输入结束后不会指向NULL,而是指向了头节点head 酱紫,链表就循环了起来 下面是代码实现 #include <stdio.h> #include <stdlib.h> typedef char datatype; typedef struct node { datatype data; struct node *next; in

02循环单链表

循环单链表定义:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成了 一个环,这种头尾相接的单链表成为单循环链表. 循环链表的数据结构: 1 /* c2-2.h 线性表的单链表存储结构 */ 2 struct LNode 3 { 4 ElemType data; 5 struct LNode *next; 6 }; 7 typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */ 代码实现: 1 2 3 /* bo2-4.c 设立

_DataStructure_C_Impl:循环单链表

//CycList:循环单链表 #include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }ListNode,*LinkList; //创建一个不带头结点的循环单链表 LinkList CreateCycList(int n){ DataType e; LinkList head=NULL; ListNode *p

【C语言数据结构】循环单链表

CircleLinkList.h #ifndef CIRCLE_LINK_LIST #define CIRCLE_LINK_LIST //链表节点 typedef struct _CircleLinkListNode {     struct _CircleLinkListNode *next; }CircleLinkListNode; //循环单链表 typedef void CircleLinkList; /*  * 创建循环单链表  * @return 返回循环单链表的指针  */ Cir

循环单链表,解决约瑟夫问题

约瑟夫问题: 编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),开始任选一个正整数作为报数上限值M,从第1个人按顺时针方向自1开始顺序报数,报到M时停止报数.报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,如此下去,直至所有人全部出列为止. 解析: 显然当有人退出圆圈后,报数的工作要从下一个人开始继续,而剩下的人仍然围成一个圆圈,因此可以使用循环单链表.退出圆圈的工作对应着表中节点的删除操作,对于这种删除操作频繁的情况,选用效率较高的链表结构,为

数据结构之自建算法库——循环单链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时双链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:clinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CLINKLIST_H_INCLUDED #define CLINKLIST_H_INCLUDED //循环单链表基本运算函数 typedef int ElemT