带头结点的单链表的操作 学习总结

本文详细介绍了带头结点的单链表的基本操作,包括初始化、销毁、置空、判断是否为空、求长度、根据索引查找元素、根据元素找索引、插入新元素和删除元素等核心操作。

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

带头结点的单链表的操作 学习总结

首先给出单链表的存储结构定义如下:

struct LNode
{
    Elemtype date;
    LNode* next;
};
typedef LNode* LinkList;

下面是带头结点的单链表的基本操作:

初始化

// 构造一个空线性表L
void InitList(LinkList& L)
{
    // 产生头结点,并使L指向该头结点
    L = (LinkList)malloc(sizeof(LNode));
    if(!L)
    {
        // 异常
    }

}

销毁线性表

// 前提:线性表L存在
void DestroyList(LinkList& L)
{
    LinkList q;

    while(L)
    {
        q = L->next; // q指向头结点之后的第一个结点
        free(L);
        L = q; // L现在指向头结点之后的第一个结点
    }
}       

单链表置空

// 前提:单链表存在
void ClearList(LinkList& L)
{
    LinkList q = L->next; // q指向头结点之后的结点
    L->next = NULL;

    DestroyList(q);
}

单链表判空

int ListEmpty(LinkList& L)
{
    if (L->next)
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}   

求单链表的长度

// 前提:单链表存在
int ListLength(LinkList L)
{
    int length = 0;
    LinkList q = L->next; // q指向头结点之后的结点

    while(q)
    {
        length++;
        q = q->next;
    }

    return length;
}

根据索引查找元素

int GetElem(LinkList L, int Index, ElemType& Element)
{
    int LoopId = 1;
    LinkList q = L->next;

    // 直到q指向第Index个结点或第Index个结点不存在
    while(q && LoopId < Index)
    {
        LoopId++;
        q = q->next;
    }

    if (!q || LoopId > Index)
    {
        return ERROR;
    }

    Element = q->data;

    return OK;

}

根据元素找索引

int LocateElem(LinkList L, ElemType Element)
{
    int Index = 0;
    LinkList q = L->next;

    while(q)
    {
        Index++;
        if(Element == L->data)
        {
            return Index;
        }

        q = q->next;
    }

    return 0;
}

插入新元素

int ListInsert(LinkList L, int Index, ElemType Element)
{
    int NumId = 0;
    LinkList p = L;
    LinkList s;

    // 查找第Index - 1 个结点
    while(p && NumId < Index - 1)
    {
        NumId++;
        p = p->next;
    }

    if (!p || NumId > Index - 1)
    {
        return ERROR;
    }

    s = (LinkList)malloc(sizeof(LNode));
    s->data = Element;
    s->next = p->next;
    p->next = s;

    return OK;
}

删除元素

int ListDelete(LinkList L, int Index, ElemType& Element)
{
    int NumId = 0;
    LinkList q, p = L;

    // p指向第Index个结点的前驱
    while(p->next && NumId < Index - 1)
    {
        NumId++;
        p = p->next;
    }
    if(!p->next||j>i-1) 
        return ERROR; 
    q=p->next;
    p->next=q->next; 
    e=q->data; 
    free(q);

    return OK;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值