删最小值(单链表)

1.题目:

Problem Description

设有一单链表,现要求删除其最小值(假设最小值唯一)。若删除成功,则输出被删的最小值;若删除失败,则输出“not exist”。

 

Input

有多组数据,每组第一行为单链表的元素个数n(0<=n<100);第二行为单链表的各个元素。

 

Output

若删除成功,则输出被删的最小值;若删除失败,则输出“not exist”。

 

Sample Input

8
4 2 6 -3 1 9 14 5
5
2 4 1 6 7

 

Sample Output

-3
1

 

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


 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值