思路:类似顺序表中的最小值查找算法,在遍历单链表的过程中,用一个指针标记最小值结点的前驱结点。遍历完成后通过前驱结点将最小值结点删除。
#include <iostream>
using namespace std;
// 链表节点
typedef struct LNode{
int data;
LNode *next;
}*LinkList;
// 尾插法
void List_TailInsert(LinkList &L)
{
// 初始化头结点
L = new LNode();
int x;
LinkList s; // 用于临时节点
LinkList r = L; // 指向链尾
scanf("%d", &x);
while(x!=999) {
s = new LNode();
s->data = x;
// 将s节点插入
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
}
// 打印链表
void List_Print(LinkList L)
{
L = L->next;
while(L!=NULL) {
cout << L->data << ' ';
L = L->next;
}
cout << endl;
}
// 删除最小值节点
void List_DeleteMin(LinkList L)
{
// 若链表为空,不执行任何操作
if (L->next == NULL) return;
// Pmin指向最小值的先驱节点
LinkList Pmin = L, s = L->next;
while(s->next != NULL) {
if (s->next->data < Pmin->next->data)
Pmin = s;
s = s->next;
}
// 将Pmin的后继删除
s = Pmin->next;
Pmin->next = s->next;
free(s);
}
int main()
{
LinkList L;
List_TailInsert(L);
List_DeleteMin(L);
List_Print(L);
return 0;
}