码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-18 00:23:02      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:bsp   for   puts   pen   data   输出   lis   class   循环   

王道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在遍历一轮后跳过后面的语句

 

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

标签:bsp   for   puts   pen   data   输出   lis   class   循环   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!