数据结构之线性表链式存储

#ifndef DS_BASE_H_
#define DS_BASE_H_

#define OK			0
#define ERROR		1
#define MEMERROR	2
#define PARAMERROR	3

typedef int BOOL;

#define TRUE	1
#define FALSE	0

#define NULL	0

#endif

#ifndef LINKLIST_H_
#define LINKLIST_H_

#include "base.h"

typedef int ElemType;

typedef struct _tagNode {
    ElemType		elem;
    struct _tagNode *pNext;
} Node, *PNode;

typedef struct _tagLinkList {
    int		length;
    PNode	pheader;
} LinkList, *PLinkList;

typedef int Status;

Status InitLinkList( PLinkList L );
Status InsertElem( PLinkList L, int pos, ElemType elem );
Status DeleteElem( PLinkList L, int pos, ElemType *pElem );
Status DestoryLinkList( PLinkList L );
Status CreateLinkList( PLinkList L, ElemType *pVec, int length );
Status GetElem( PLinkList L, int pos, ElemType *pElem );
Status PrintLinkList( PLinkList L );

static PNode GetPriorElem( PLinkList L, int pos );

#endif

#include "../include/linklist.h"

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

Status InitLinkList( PLinkList L )
{
    if ( L == NULL )	{
        return PARAMERROR;
    }

    L->pheader = ( PNode ) malloc( sizeof( Node ) );

    if ( L->pheader == NULL ) {
        return MEMERROR;
    }

    L->pheader->pNext = NULL;
    L->length = 0;
    return OK;
}

PNode GetPriorElem( PLinkList L, int pos )
{
    Node *ppre = NULL;
    int nCnt = 1;

    if ( L == NULL || L->length + 1 < pos ) {
        return NULL;
    }

    ppre = L->pheader;

    while ( nCnt != pos ) {
        ppre = ppre->pNext;
        ++nCnt;
    }

    return ppre;
}

Status InsertElem( PLinkList L, int pos, ElemType elem )
{
    int nCnt = 1;
    Node *ppre = NULL;
    Node *pnew = NULL;

    ppre = GetPriorElem( L, pos );

    if ( ppre == NULL ) {
        return PARAMERROR;
    }

    pnew = ( PNode )malloc( sizeof( Node ) );

    if ( pnew == NULL ) {
        return MEMERROR;
    }

    pnew->elem = elem;
    pnew->pNext = ppre->pNext;

    ppre->pNext = pnew;

    ++( L->length );

    return OK;
}

Status DeleteElem( PLinkList L, int pos, ElemType *pElem )
{
    int nCnt = 1;
    Node *ppre = NULL;
    Node *pdestory = NULL;

    ppre = GetPriorElem( L, pos );

    if ( ppre == NULL ) {
        return PARAMERROR;
    }

    pdestory = ppre->pNext;
    ppre->pNext = pdestory->pNext;

    *pElem = pdestory->elem;
    free( pdestory );

	--(L->length);

    return OK;
}

Status DestoryLinkList( PLinkList L )
{
    PNode pnext = NULL;
    PNode pcur = NULL;

    if ( L == NULL ) {
        return PARAMERROR;
    }

    pcur = L->pheader->pNext;
    pnext = pcur->pNext;

    while ( pnext != NULL ) {
        free( pcur );
        pcur = pnext;
        pnext = pcur->pNext;
    }

    free( pcur );

    L->length = 0;
    L->pheader->pNext = NULL;

    return OK;
}

Status CreateLinkList( PLinkList L, ElemType *pVec, int length )
{
    int nCnt = 0;
    PNode pEnd = NULL;
    PNode pnew = NULL;

    if ( L == NULL ) {
        return PARAMERROR;
    }

    if ( L->length != 0 ) {
        DestoryLinkList( L );
    }

    pEnd = L->pheader;

    for ( nCnt = 1; nCnt <= length; ++nCnt ) {
        pnew = ( PNode )malloc( sizeof( Node ) );
        pnew->elem = pVec[nCnt - 1];
        pnew->pNext = NULL;
        pEnd->pNext = pnew;
        pEnd = pnew;
    }

    L->length = length;

    return OK;
}

Status GetElem( PLinkList L, int pos, ElemType *pElem )
{
    int nCnt = 1;
    PNode pcur = NULL;

    if ( L == NULL || L->length < pos || pElem == NULL ) {
        return PARAMERROR;
    }

    pcur = L->pheader->pNext;

    while ( nCnt != pos ) {
        pcur = pcur->pNext;
		++nCnt;
    }

    *pElem = pcur->elem;

    return OK;
}

Status PrintLinkList( PLinkList L )
{
    PNode pcur = NULL;

    if ( L == NULL ) {
        return PARAMERROR;
    }

    pcur = L->pheader->pNext;
    printf( "[" );

    while ( pcur != NULL ) {
        if ( pcur->pNext != NULL ) {
            printf( "%d, ", pcur->elem );
            pcur = pcur->pNext;
            continue;
        }

        printf( "%d", pcur->elem );
        pcur = pcur->pNext;
    }

    printf( "]\n" );

    return OK;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值