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


    王道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);
    }
     
    View Code

    注意:

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

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

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

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

  • 相关阅读:
    10-vue自定义指令
    09-vue过滤器的基本使用
    vue总结
    07-vue的v-if和v-show
    06-循环数组v-for
    Java通过JNA调用dll或so
    Centos7安装FRP内网穿透工具进行远程连接
    centos7检查Java项目存活与否并重启
    centos7中Java项目重启
    Ubuntu 19.04: Connect to GNOME desktop environment via XRDP
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8452369.html
Copyright © 2020-2023  润新知