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