1.題目:
Problem Description設有一單鏈表,現要求刪除其最小值(假設最小值唯一)。若刪除成功,則輸出被刪的最小值;若刪除失敗,則輸出“not exist”。
Input有多組資料,每組第一行為單鏈表的元素個數n(0<=n<100);第二行為單鏈表的各個元素。
Output若刪除成功,則輸出被刪的最小值;若刪除失敗,則輸出“not exist”。
Sample Input
84 2 6 -3 1 9 14 552 4 1 6 7
Sample Output
-31
2.代碼:
#include <iostream>using namespace std;struct Node { ///定義節點類型 int data; //data存資料 Node* next; //next指向下一個節點};class LinkList{private: Node* head; ///定義前端節點public: LinkList(int a[ ], int n); ///構成單鏈表的成員函數 ~LinkList(); ///釋放單鏈表 void Delete(); ///刪除單鏈表資料的成員函數};LinkList::LinkList(int a[ ], int n) ///形參,構成單鏈表{ int i; head = new Node; /// 前端節點 Node* r, *s; ///定義兩個節點指標,單個*s用來儲存相關的資料,*r用來將一個個*s串連起來,形成單鏈表 r = head; ///把head賦予給r,進行相關操作,避免過程中修改head for (i = 0; i < n; i++) { ///i迴圈 形成單鏈表 s = new Node; ///動態建立s結構空間; s->data = a[i]; ///將a[i]賦值給s->data; s->next = r->next; ///賦予r->next給s->next,其實這步不用也行,但是為了安全(這是指標) r->next = s; ///上面形成了一個s,用r->next指向下一個節點,即是s r = s; ///好吧,上面已經將s串連到鏈表中,將r移動到剛鏈的節點s去,以便進行下一次串連節點 } r->next = NULL; ///整條鏈已構成,最後賦予個空值給最後一個節點,用來標識這是最後一個節點,以便對鏈表操作時出錯。} ///其實i迴圈時,我已經賦予NULL到最後一個節點了LinkList::~LinkList() ///釋放單鏈表{ Node* p, *q; ///用p在鏈表中移動,用q釋放節點。 p = head; while (p) { ///移動“頭指標”,逐個釋放鏈表,直到遇到NULL q = p; p = p->next; ///p指向下一個節點 delete q; ///釋放節點 }}void LinkList::Delete() ///刪除單鏈表資料{ Node* q, *p, *r, *t; int min; ///定義min 用來比較,找到最小值,以便操作 if (head->next) { //用head->next判斷這條單鏈表是不是空鏈,如果不是空鏈執行if的語句,否則執行else q = head; ///好吧,不是空鏈,賦予頭結點head給q節點,以免head被改變 p = q->next; ///用p節點作為q節點的下一個節點 min = p->data; /// 賦予p->data給min,開始找最小值了喔 r = q; ///p的前一個q,賦給r儲存 while (p) { ///迴圈至NULL節點,就結束迴圈 if (p->data < min) { /// 比較p節點的資料和min的大小,選擇其中較小值,如果p->data小於min,執行 r = q; ///p的前一個q,賦給r儲存 min = p->data; ///把p的資料賦給min } q = p; ///將p的前一個節點q移動到p處 p = p->next; ///將p節點移動到p->next所指向的節點(p的下一個節點) } ///經過上面的迴圈找出了最小的值喔,怎麼刪除了呢 ///前面已經用r儲存了最小值的節點的前一個節點,那麼r->next就是最小值的節點 t = r->next; /// t儲存最小值的節點 r->next = t->next; ///用最小值的節點的前一個節點,指向最小值節點的後一個節點,那麼最小值節點就被刪除了 cout << t->data << endl; ///輸出最小值 delete t; ///最小值節點的所在的空間還沒有釋放,delete吧! } else //不到最小喔 cout << "not exist" << endl;}int main(){ int a[100], i, n; while (cin >> n) { /// 輸入單鏈表的資料個數 for (i = 0; i < n; i++) cin >> a[i]; ///輸入資料 LinkList L(a, n); ///定義聲明Object ,引用LinkList class L.Delete(); ///單鏈表,刪除資料 } return 0;}