#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;
}