您的位置:首页 > 理论基础 > 数据结构算法

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

2015-06-01 10:56 465 查看
教科书:严奶奶的《数据结构(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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息