删最小值(单链表)
来源:互联网 发布:防网络上瘾安全教育 编辑:程序博客网 时间: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;}
- 删最小值(单链表)
- 最小值(划分树)
- 最小值
- 最小值
- 最小值
- 最小值
- 最小值
- 删除单链表(带头结点)的最小值结点
- 求最大最小值(转)
- 求最值(最大值和最小值)
- RMQ问题(区间最小值)
- 旋转数组最小值(算法)
- 蓝桥杯 最大最小值 (暴力)
- poj3273(二分最大化最小值)
- 最大值最小值查找算法(C++实现)
- 最小值最大化问题(贪心系列)
- uva 12124 Assemble(二分法->最小值最大化*)
- (最大化最小值),poj3258,River Hopscotch
- HTML中的转义字符
- Android 解析和生成XML文件
- Python egg学习笔记
- linux的c中signal函数
- Android中Gif图片的显示
- 删最小值(单链表)
- ArrayList遍历的4种方法
- vc的一些书
- ssh 和 ssh2 之间的 转换
- javascript揭秘
- android 自定义菜单控件
- Android各种信息的显示
- Java中的static{}代码块
- glew的使用