(无头)单链表的插、删、查、改

本文详细介绍了单链表的基本概念及各种操作实现,包括创建、打印、删除、插入等核心功能,并提供了完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个节点。


单链表
这里写图片描述

SList.h


#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<Windows.h>


typedef int DataType;
typedef struct DListNode
{
    struct DListNode* _next;
    DataType _data;
}DListNode;



DListNode* BuyDListNode(DataType x);//创建节点
void DListPrint(DListNode* pHead);//打印链表
void DListErase(DListNode** pHead);//删除链表

void DListPushBack(DListNode** pHead, DataType x);//尾插
void DListPopBack(DListNode** pHead);//尾删
void DListPushFront(DListNode** pHead, DataType x);//头插
void DListPopFront(DListNode** pHead);//头删

DListNode* DListFind(DListNode* pHead, DataType x);//查找指定元素
void DListAt(DListNode** pHead, DListNode* pos, DataType x);//替换指定位置元素

void DListInsert(DListNode** pHead, DListNode* pos, DataType x);//在指定位置插入
void DListErase(DListNode** pHead, DListNode* pos);//删除指定位置元素

SList.c

函数实现:


DListNode* BuyDListNode(DataType x)//创建节点
{
    DListNode* newNode = (DListNode*)malloc(sizeof(DListNode));

    if (NULL == newNode)
    {
        printf("create is failure");
        return NULL;
    }

    newNode->_data = x;
    newNode->_next = NULL;
    return newNode;
}



void DListPrint(DListNode* pHead)//打印链表
{
    if (pHead == NULL)
    {
        printf("DList is empty\n");
    }
    while (pHead != NULL)
    {
        printf("%d-", pHead->_data);
        pHead = pHead->_next;
    }
}


void DListDestory(DListNode** ppHead)//删除链表
{
    assert(ppHead != NULL);
    DListNode* head = *ppHead;
    free(head);
    head->_next = NULL;
}

void DListPushBack(DListNode** ppHead, DataType x)//尾插
{
    assert(ppHead != NULL);
    DListNode*cur = *ppHead;
    if (NULL == *ppHead)
    {
        *ppHead=BuyDListNode(x);
        (*ppHead)->_next = NULL;
    }


    else
    {
        while (cur->_next != NULL)
        {
            cur = cur->_next;
        }
        cur->_next = BuyDListNode(x);

    }
}

这里写图片描述





void DListPopBack(DListNode** ppHead)//尾删
{
    assert(ppHead!=NULL);
    DListNode* cur = *ppHead;//记录当前节点
    DListNode* prev = NULL;//记录当前节点的前一个位置

    if (NULL == cur)
    {
        printf("DList is empty!\n");
    }
    else if(NULL==cur->_next)//只有一个节点
    {
        free(cur);
        cur = NULL;
    }
    else//有多个节点
    {
        while (cur->_next != NULL)
        {
            prev = cur;
            cur = cur->_next;
        }
        free(cur);
        prev->_next = NULL;

    }
}

这里写图片描述




void DListPushFront(DListNode** ppHead, DataType x)//头插
{
    assert(ppHead);
    if (NULL == *ppHead)
    {
        *ppHead = BuyDListNode(x);
        (*ppHead)->_next = NULL;
    }

    else
    {
        DListNode* cur = BuyDListNode(x);
        cur->_next = *ppHead;
        *ppHead = cur;
    }
}


void DListPopFront(DListNode** ppHead)//头删
{
    DListNode*cur = *ppHead;
    if (cur == NULL)
    {
        return;
    }

    else
    {
        *ppHead = (*ppHead)->_next;
        free(cur);
    }
}

这里写图片描述



DListNode* DListFind(DListNode* pHead, DataType x)//查找指定元素
{
    DListNode*cur = pHead;
    while (cur!= NULL)
    {
        if (x == cur->_data)
        {
            return cur;
        }

        else
        {
            cur = cur->_next;

        }

    }
    printf("NOT EXIST!\n");
    return NULL;
}
void DListAt(DListNode** ppHead, DListNode* pos, DataType x)//替换指定位置元素
{
    assert(pos != NULL && ppHead!=NULL); 
    pos->_data = x;
    /*DListNode* cur = *ppHead;
    while (cur != NULL)
    {
        if (cur == pos)
        {
            cur->_data = x;
        }
        else
        {
            cur = cur->_next;
        }
    }
    */
}

void DListInsert(DListNode** ppHead, DListNode*pos, DataType x)//在指定位置插入
{
    //assert(pos);
    DListNode* prev = *ppHead;
    DListNode* newNode = BuyDListNode(x);

    if (NULL==prev || prev ==pos)
    {
        DListPushFront(ppHead, x);
    }

    else
    {
        prev = *ppHead;
        while (prev->_next != pos)
        {
            prev = prev->_next;
        }
        newNode->_next = pos;
        prev->_next = newNode;


    }
}

这里写图片描述




void DListErase(DListNode** ppHead, DListNode*pos, DataType x)//删除指定位置元素
{
    assert(pos != NULL &&ppHead != NULL);
    DListNode* cur = *ppHead;//记录当前节点
    DListNode* prev = NULL;//记录当前节点的前一个节点

    if (pos == *ppHead)
    {
        free(cur);
        cur->_next = NULL;
    }
    else
    {
        prev = *ppHead;
        while (prev->_next != pos)
        {
            cur = cur->_next;
        }

        prev->_next = pos->_next;
        free(pos);
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值