
/* 设有一个带头结点的单链表,其节点均为正值,设计一个算法,反复找出单链表中最小值输出并删除,直到单链表为空,最后删除头结点 分析: 按照以往的经验,我们需要遍历它,为了保证不断链,我们需要设置pre,p,minPre,min,r等5个指针。*/struct Link { int data; struct Link *next;};#include <stdlib.h>#include <stdio.h>void inputAndDeleteLink(Link *h) { struct Link *pre = h, *minPre = h, *p = h->next, *min = h->next, *r; while (h->next!=h) {//如果头结点后面还有值,说明未结束 while (p!=h) {//寻找最小值 if (min->data>p->data) { minPre = pre; min = p; } pre = p; p = p->next; } printf("%d ",min->data); r = min->next; minPre->next = min->next;//删除当前最小值 free(min);//释放节点空间 p = h->next;//又重头开始遍历 pre = h; minPre = h; min = h->next; } free(h);//最后释放头结点}int main() { struct Link *head; Link *createSinLoopLink(); head = createSinLoopLink(); inputAndDeleteLink(head); return 0;}