• 第1章第2节练习题3 删除最小值结点


    问题描写叙述

    试编写在带头结点的单链表L中删除一个最小值结点的高效算法(如果最小值结点是唯一的)

    算法思想

    在链表中删除最小值的前提是必须找到最小值元素是哪个结点,因此设置指针p对全部结点进行遍历,使用指针min指向最小值结点。可是由于涉及到删除操作,明显在仅仅有指针min和指针p的条件下删除操作是极为不方便的。

    若单纯的删除指针p指向的结点会造成断链。若採用2.5.2删除自身结点的方法,又会出现多次赋值操作。

    因此直接引入两个分别指向其前驱结点的指针pre和premin,如此。删除操作过程会更加通俗易懂。

    算法描写叙述

    void DelMin(LNode *head)
    {
        LNode *pre=head,*p=head->next;
        LNode *premin=pre,*min=p;
        while(p){
            if(min->data>p->data){
                premin=pre;
                min=p;
            }
            pre=p;
            p=p->next;
        }
        printf("Deleted Node: %4d
    ",min->data);
        premin->next=min->next;
        free(min);
    }

    详细代码见附件。


    附件

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef int ElemType;
    typedef struct LNode{
        ElemType data;
        struct LNode *next;
    }LNode,*LinkList;
    
    LinkList CreatList(LNode*);
    void DelMin(LNode*);
    void Print(LNode*);
    
    
    int main(int argc, char* argv[])
    {
        LNode *head;
        head=(LNode*)malloc(sizeof(LNode));
        head->next=NULL;
    
        head=CreatList(head);
        Print(head);
        DelMin(head);
        Print(head);
    
        return 0;
    }
    //头插法创建单链表
    LinkList CreatList(LNode *head)
    {
        LNode *s;
        ElemType x;
        scanf("%d",&x);
        while(x!=999){
            s=(LNode*)malloc(sizeof(LNode));
            s->data=x;
    
            s->next=head->next;
            head->next=s;
    
            scanf("%d",&x);
        }
        return head;
    }
    //查找并删除最小值结点
    void DelMin(LNode *head)
    {
        LNode *pre=head,*p=head->next;
        LNode *premin=pre,*min=p;
        while(p){
            if(min->data>p->data){
                premin=pre;
                min=p;
            }
            pre=p;
            p=p->next;
        }
        printf("Deleted Node: %4d
    ",min->data);
        premin->next=min->next;
        free(min);
    }
    //打印全部结点
    void Print(LNode *head)
    {
        LNode *p=head->next;
        while(p){
            printf("%4d",p->data);
            p=p->next;
        }
        printf("
    ");
    }
  • 相关阅读:
    java面试题
    linux下的文件目录结构
    Linux的基础命令
    Linux系统的介绍
    逻辑思维题
    37-字符的全排列
    36-螺旋矩阵
    35-面试:如何找出字符串的字典序全排列的第N种
    34-数细线
    33-求极差
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7025678.html
Copyright © 2020-2023  润新知