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