线性单链表的存储及基本操作(整理)

本文介绍了线性链表的基本概念及其在C语言中的实现方法,包括初始化、销毁、清空链表等操作,并详细解释了如何进行节点的插入、删除及元素查找等功能。


教科书:严奶奶的《数据结构(C语言版)》

参考代码:高一凡的《数据结构》算法实现和解析


/*****************线性链表的单链表存储结构***************
******************制作人:Guosam*************************
*****************时间:2015/5/20************************/

typedef struct LNode
{
    Elemtype data;
    LNode *next;
}LNode,*LinkList;



/*****************线性链表的基本操作*********************
******************制作人:Guosam*************************
*****************时间:2015/5/20************************/

void InitList(LinkList &L)
{
    //建空表
    L=(LinkList)malloc(sizeof(LNode));
    if(!L)
        exit(OVERFLOW);
    L->next=NULL;
}

//销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的销毁了,这样这个链表就不能再使用了
//清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用
void DestroyList(LinkList &L)
{
    //销毁线性表L
    LinkList q;
    while(L)
    {
        q=L->next;
        free(L);
        L=q;
    }
}

void ClearList(LinkList L)
{
    //清空表
    LinkList p,q;
    p=L->next;
    while(p)
    {
        q=L->next;
        free(p);
        p=q;
    }
    L->next=NULL;
}

Status ListEmpty(LinkList L)
{
    //判表空
    if(L.length==0)
        return FALSE;
    else
        return TRUE;
}

Status ListLength(LinkList L)
{
    //取表长
    int i=0;
    LinkList p=L->next;
    while(p)
    {
        i++;
        p=p->next;
    }
    return i;
}

Status GetElem(LinkList L,int i,ElemType &e)
{
    //读元素
    int j=1;
    LinkList p=L->next;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
        return ERROR;
    e=p->data;
    return e;
}

Status LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
    //查找
    int i=0;
    LinkList p=L->next;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
        return ERROR;
    e=p->data;
    return e;
}

Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
    //找前驱
    LinkList q,p=L->next;
    while(p->next)
    {
        q=p->next;
        if(q->data==cur_e)
        {
            pre_e=p->data;
            return pre_e;
        }
        p=q;
    }
    return INFEASIBLE;
}

Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
    //找后继
    LinkList q,p=L->next;
    while(p->next)
    {
        q=p->next;
        if(p->data==cur_e)
        {
            pre_e=q->data;
            return pre_e;
        }
        p=q;
    }
    return INFEASIBLE;
}

Status LinkInsert(LinkList L,int i,ElemType e)
{
    //插入
    int j=0;
    LinkList p=L,s;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)
        return ERROR;
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}

Status LinkDelete(LinkList L,int i, ElemType &e)
{
    //删除
    int j=0;
    LinkList p=L,q;
    while(p->next&&j<i-1)
    {
        p=p->next;
        j++
    }
    if(!p->next||j>i-1)
        return ERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    return e;
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{
    //遍历
    LinkList p=L->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值