//带头结点的链表删除最小元素
思路:假设第一个元素最小,之后找到的比它小的就重新定义最小值。删除最小值需要前驱连接后继,此时就需要一个*s指向最小值的前驱,它是不动的,除非更新最小值。而*r是随着p移动而一直移动的。
note:if语句里写不出时可先往下写,写不符合条件时的语句
#include<iostream>
using namespace std;
typedef struct lnode {
int data;
struct lnode* next;
}lnode,*linklist;
int a[5] = { 2,1,3,4,5 };
int n = 5;
void buildlist(linklist& L) {
L = (lnode*)malloc(sizeof(lnode));
if (L == NULL)return;//判空
lnode* s, * r = L;
for (int i = 0; i < n; i++) {
s = (lnode*)malloc(sizeof(lnode));
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
void disp(linklist L) {
lnode* s = L->next;
while (s) {
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
void deletemin(linklist& L)
{
lnode* q, * r=L, * p = L->next, * s;
q = p;//q用于释放空间,p遍历链表,r表示p遍历时的前驱,s指向最小值的前驱
s = r;
while (p) {
if (p->data < q->data) {
q = p;
s = r;//想不出来可以先想想q大于p时该怎么写,先往下写
}
r = p;
p = p->next;
}
s->next = q->next;
free(q);
}
int main()
{
linklist L;
buildlist(L);
disp(L);
deletemin(L);
disp(L);
return 0;
}