題目11 反向輸出所有節點的值,帶頭節點單鏈表
阿新 • • 發佈:2018-11-17
題目11:反向輸出所有節點的值,帶頭節點單鏈表
void print_Reverse(Node *n, int first){
//這裡使用first使用來標識頭節點,頭節點中是無效資料,不列印。
if(first==0){
n=n->next;
first++;
}
if(n->next!=NULL){
print_Reverse(n->next, 1); //傳入非0,標識其餘的非頭節點
}
cout<<n->num<<" ";
}
當然,也可以採用插入排序,反轉連結串列完成,然後遍歷。
題目12:刪除最小值節點,帶頭節點單鏈表
亮點在於定義了記錄的指標,在一次遍歷找到並記錄,然後刪除
void del_minValue(Node *&n){ Node *minp=n->next, *minpre=n, *p=n->next, *pre=n; while(p!=NULL){ if(p->num<minp->num){ minpre = pre; minp = p; } pre = p; p = p->next; } cout<<"The minumal value is :"<<minp->num<<endl; minpre->next = minp->next; free(minp); }
題目13:遞增輸出無序單鏈表中資料,並釋放節點
思路:遍歷整個單鏈表,迴圈體內部,每次刪除最小值
void print_ByAsc_1(Node *&n){
while(n->next!=NULL)
del_minValue(n); //直接呼叫上面的函式
}
完整程式碼:
void print_ByAsc_2(Node *&n){
Node *p,*pre,*minp, *minpre;
while(n->next!=NULL){
pre = minp = n;
p = minpre = n->next;
while(p!=NULL){
if(p->num<minp->num){
minpre = pre;
minp = p;
}
pre = p;
p = p->next;
}
cout<<minp->num<<" ";
minpre->next = minp->next; /**因為上面每次都會為minp/minpre賦值,
所以這裡只需要保證連結串列的不斷鏈刪除,不需要考慮minp/minpre賦值情況**/
free(minp);
}
}
作者:無涯明月