删除带头结点链表中最小值的结点

本文展示了如何使用C语言实现一个链表数据结构,并提供了一个`deletemin`函数来删除链表中的最小值节点。代码包括创建链表、打印链表、删除最小值节点和打印删除后链表的功能。通过头插法或尾插法构建链表,然后遍历链表找到最小值节点并进行删除操作,最后输出删除后的链表。
摘要由CSDN通过智能技术生成

删除带头结点链表中最小值的结点

deletemin.c

#include<stdio.h>
#include<stdlib.h>
#include"deletemin.h"

LinkedList *create(void)
{
    LinkedList *l = malloc(sizeof(*l));
    l->first = NULL;
    l->last = NULL;
    element x;
    printf("请输入数据,以0结尾\n");
    while(1)
    {
        scanf("%d",&x);
      	if(x == 0)
        {
            break;
        }
        Node *p = malloc(sizeof(*p));
        p->data = x;
        p->next = NULL;
        if(l->first == NULL)
        {
            l->first = p;
            l->last = p;
        }
        else
        {
            //头插法
            p->next = l->first;
            l->first = p;
            /*
            	尾插法
            	l->last->next = p;
            	l->last = p;
            */
        }
    }
    return l;  
}
void deletemin(LinkedList *l)
{
    //pm记录最小值的结点,pmr指向它前面的一个结点
    Node *pm = l->first;
    Node *pmr = NULL;
    if(pm->next == NULL)
    {
        return;
    }
    else
    {
    //px和pxr用于循环
        Node *px = pm;
        Node *pxr = NULL;
        while(px)
        {
            if(px->data < pm->data)
            {
                pmr = pxr;
                pm = px;
            }
            pxr = px;
            px = px->next;
        }
        //找到后分情况删除
        if(pm == l->first)
        {
            if(l->first == l->last)
            {
                l->first = l->last = NULL;
                pm->next = NULL;
                free(pm);
            }
            else
            {
                l->first = pm->next;
                pm->next = NULL;
                free(pm);
            }
        }
        else if(pm == l->last)
        {
            pmr->next = NULL;
            l->last = pmr;
            free(pm);
        }
        else
        {
            pmr->next = pm->next;
            pm->next = NULL;
            free(pm);
        }
    }
}
void printlist(LinkedList *l)
{
    if(l == NULL)
    {
        return;
    }
    Node *p = l->first;
    while(p)
    {
        printf("%d",p->data);
        p = p->next;
    }
    printf("\n");
}

deletemin.h

#ifndef __DELETEMIN_H__
#define __DELETEMIN_H__
#define element int

typedef struct node
{
    element data;
    struct node *next;
}Node;

typedef struct LinkedList
{
    Node *first;
    Node *last;
}LinkedList;

LinkedList *create(void);
void deletemin(LinkedList *l);
void printlist(LinkedList *l);

#endif

main.c

#include<stdio.h>
#include<stdlib.h>
#include"deletemin.h"

int main()
{
    LinkedList *l = create();
    printlist(l);
    deletemin(l);
    printlist(l);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值