#ifndef _CONST_H_
#define _CONST_H_

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

typedef enum
{
  False = 0,
  True,
}Bool;

typedef int ElemType;

#define QUEUE_MAX_SIZE 10

#define STACK_INIT_SIZE 10
#define STACK_INCREMENT_SIZE 2

#define Null ((void *)0)

typedef enum
{
  NORMAL = 0,
  ERROR,
  UNDERFLOW,
  OVERFLOW,
  STATUSCOUNT,
}Status;

#endif

#ifndef _LINKED_TABLE_H_
#define _LINKED_TABLE_H_

#include "Const.h"

typedef struct linkednode
{
  ElemType data;
  struct linkednode *pNext;
  struct linkednode *pPrev;
}LinkedNode, *pLinkedNode;

pLinkedNode InitLinkedTable();

Bool IsLinkedTableEmpty(pLinkedNode pLN);

Status AddNodeInHead(pLinkedNode pLN, ElemType elem);

Status AddNodeInTail(pLinkedNode pLN, ElemType elem);

void TraverseLinkedTable(pLinkedNode pLN);

void DestoryLinkedTable(pLinkedNode pLN);

int GetLinkedTableLength(pLinkedNode pLN);

void RemoveElemInLinkedTable(pLinkedNode pLN, ElemType elem);

#endif

#include "LinkedTable.h"

pLinkedNode InitLinkedTable()
{
  pLinkedNode pLN = (pLinkedNode)malloc(sizeof(LinkedNode));
  if (pLN == Null)
  {
    printf("No accessable free memeory.\n");
    return Null;
  }
  //data in head node is used to store linked table data count
  pLN->data = 0;
  pLN->pNext = Null;
  return pLN;
}

Bool IsLinkedTableEmpty(pLinkedNode pLN)
{
pLinkedNode pHead = pLN;
if (pHead->pNext == Null)
{
return True;
}
else
{
return False;
}
}

Status AddNodeInHead(pLinkedNode pLN, ElemType elem)
{
//printf("In Function AddNodeInHead.\n");
pLinkedNode pHead = pLN;
pLinkedNode pTempNode = (pLinkedNode)malloc(sizeof(LinkedNode));
if (pTempNode == Null)
{
printf("Can not add the node for no accessable free memory.\n");
return ERROR;
}
pTempNode->data = elem;
pTempNode->pNext = pHead->pNext;

pHead->data += 1;
pHead->pNext = pTempNode;

return NORMAL;
}

Status AddNodeInTail(pLinkedNode pLN, ElemType elem)
{
//printf("In Function AddNodeInTail.\n");
pLinkedNode pHead = pLN;
pLinkedNode pTempNode = (pLinkedNode)malloc(sizeof(LinkedNode));
if (pTempNode == Null)
{
printf("Can not add the node for no accessable free memory.\n");
return ERROR;
}
pHead->data += 1;
if (IsLinkedTableEmpty(pHead))
{
pHead->pNext = pTempNode;
}
else
{
pLinkedNode pTemp = pHead;
while (pTemp->pNext != Null)
{
pTemp = pTemp->pNext;
}
pTemp->pNext = pTempNode;
}
pTempNode->data = elem;
pTempNode->pNext = Null;

return NORMAL;
}

void TraverseLinkedTable(pLinkedNode pLN)
{
if(IsLinkedTableEmpty(pLN))
{
printf("The Linked Table Is Empty.\n");
}
else
{
pLinkedNode pHead = pLN;
pLinkedNode pTemp = pHead->pNext;
while(pTemp != Null)
{
printf("Value: %d\n", pTemp->data);
pTemp = pTemp->pNext;
}
}
}

void DestoryLinkedTable(pLinkedNode pLN)
{
if(IsLinkedTableEmpty(pLN))
{
printf("The Linked Table Is Empty.\n");
free(pLN);
}
else
{
pLinkedNode pHead = pLN;
pLinkedNode q;
pLinkedNode pTemp = pHead;
while(pTemp != Null)
{
q = pTemp->pNext;
free(pTemp);
pTemp = q;
}
}
}

int GetLinkedTableLength(pLinkedNode pLN)
{
return pLN->data;
}

void SortLinkedTable(pLinkedNode pLN)
{

}

void RemoveElemInLinkedTable(pLinkedNode pLN, ElemType elem)
{
if (IsLinkedTableEmpty(pLN))
{
printf("The Linked Table Is Empty.\n");
}
else
{
Bool hasTargetNode = False;
pLinkedNode pHead = pLN;
pLinkedNode pTemp = pHead;
while(pTemp->pNext != Null)
{
if (pTemp->pNext->data == elem)
{
hasTargetNode = True;
pTemp->pNext = pTemp->pNext->pNext;
}
else
{
pTemp = pTemp->pNext;
}
}
if (hasTargetNode == False)
{
printf("The data is not in current Linked Table.\n");
}
else
{
printf("Elem %d has been removed successfully.\n", elem);
}
}
}

05-06 04:26