38.png

    1. /*
    2. 设有一个带头结点的单链表,其节点均为正值,设计一个算法,反复找出单链表中最小值输出并删除,直到单链表为空,最后删除头结点
    3. 分析:
    4. 按照以往的经验,我们需要遍历它,为了保证不断链,我们需要设置pre,p,minPre,min,r等5个指针。
    5. */
    6. struct Link {
    7. int data;
    8. struct Link *next;
    9. };
    10. #include <stdlib.h>
    11. #include <stdio.h>
    12. void inputAndDeleteLink(Link *h) {
    13. struct Link *pre = h, *minPre = h, *p = h->next, *min = h->next, *r;
    14. while (h->next!=h) {//如果头结点后面还有值,说明未结束
    15. while (p!=h) {//寻找最小值
    16. if (min->data>p->data) {
    17. minPre = pre;
    18. min = p;
    19. }
    20. pre = p;
    21. p = p->next;
    22. }
    23. printf("%d ",min->data);
    24. r = min->next;
    25. minPre->next = min->next;//删除当前最小值
    26. free(min);//释放节点空间
    27. p = h->next;//又重头开始遍历
    28. pre = h;
    29. minPre = h;
    30. min = h->next;
    31. }
    32. free(h);//最后释放头结点
    33. }
    34. int main() {
    35. struct Link *head;
    36. Link *createSinLoopLink();
    37. head = createSinLoopLink();
    38. inputAndDeleteLink(head);
    39. return 0;
    40. }