#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);
		}
	}
}
原文:http://www.cnblogs.com/tyroneren/p/6250306.html