删最小值(单链表)

来源:互联网 发布:防网络上瘾安全教育 编辑:程序博客网 时间:2024/06/06 06:07

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;}


 

原创粉丝点击