1. 程式人生 > >循環單鏈表 | 循環刪除表中所有最小值並輸出

循環單鏈表 | 循環刪除表中所有最小值並輸出

show 初始 tdi 刪除 lis ons span closed lose

王道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在遍歷一輪後跳過後面的語句

循環單鏈表 | 循環刪除表中所有最小值並輸出