/******************************************************************************************************
* Copyright(C);
* Filename :
* Author :
* Version :
* Date :
* Description :
******************************************************************************************************/
#include <stdio.h>
/****************************************************************/
#define ElementType unsigned int
#define MAX_ELEMENT 10
#define NIL -1
int _L, _F;
ElementType _key[ MAX_ELEMENT+1 ];
ElementType _next[ MAX_ELEMENT+1 ];
ElementType _prev[ MAX_ELEMENT+1 ];
/****************************************************************/
int AllocateObject (void);
void CreateList (void);
int Delete (int pos);
int Find (ElementType e );
void FreeObject (int pos);
int GetLength (void);
int Insert (ElementType e, int pos);
int IsEmpty (void);
int IsFull (void);
int IsLast (int pos);
void ListIndex (void);
void PrintList (void);
/****************************************************************/
int main(void){
int i;
CreateList();
for ( i=0; i<MAX_ELEMENT; i++ ){
Insert(i,i);
}
printf("length:%d\n",GetLength());
Delete(Find(9));
printf("length after delete: %d\n",GetLength());
Insert(0,-1);
PrintList();
printf("length:%d\n",GetLength());
PrintList();
Delete(Find(1));
Delete(Find(3));
Delete(Find(5));
ListIndex();
return 0;
}
int IsEmpty(void ){
return _next[_L] == NIL;
}
int IsFull(void){
return _F == NIL;
}
int IsLast(int pos){
return _next[pos] == NIL;
}
int AllocateObject(void){
int address = NIL;
if (!IsFull() ){
address = _F;
_F = _next[ _F ];
_prev[ _F ] = NIL;
}
return address;
}
void CreateList(void){
int i;
_L = 0;
_next[ _L ] =NIL;
_F = 1;
for ( i=_F; i<MAX_ELEMENT; i++ ){
_next[ i ] = i+1;
_prev[ i ] = i-1;
}
_prev[ _F ] = NIL;
_next[ i ] = NIL;
}
int GetLength(void){
int len = 0;
int node = _next[_L];
while( node != NIL ){
len++;
node = _next[node];
}
return len;
}
int Insert(ElementType e, int pos){
int i = 0;
int address_cur;
int address_pre;
int address_new;
if ( -1 == pos ){
pos = GetLength();
}
if ( pos > GetLength() || pos < 0 || IsFull() ){
return -1;
}
address_cur = _next[_L];
address_pre = _L;
while ( i<pos && address_cur!=NIL ){
i++;
address_cur = _next[ address_cur ];
address_pre = _next[ address_pre ];
}
address_new = AllocateObject();
_key[ address_new ] = e;
_next[ address_new ] = address_cur;
_prev[ address_new ] = address_pre;
_next[ address_pre ] = address_new;
if ( address_cur != NIL ){
_prev[ address_cur ] = address_new;
}
return 0;
}
int Find(ElementType e){
int i = 0;
int node = _next[ _L ];
if ( IsEmpty() ){
return -1;
}
while ( node!=NIL && _key[node]!=e ){
node = _next[ node ];
i++;
}
if ( node!=NIL ){
return i;
}
else{
return -1;
}
}
void FreeObject(int pos){
if ( IsEmpty() ){
return;
}
_next[ pos ] = _F;
_prev[ _F ] = pos;
_prev[ pos ] = NIL;
_F = pos;
}
int Delete(int pos){
int a = _next[ _L ];
int i = 0;
int len = GetLength();
if ( pos<0 || pos>=len ){
return -1;
}
while( i<pos ){
a = _next[ a ];
i++;
}
_next[ _prev[a] ] = _next[ a ];
if ( _next[ a ] != NIL ){
_prev[ _next[a] ] = _prev[ a ];
}
FreeObject(a);
return 0;
}
void PrintList(void){
int i = _next[ _L ];
while( i != NIL ){
printf("%d,",_key[i]);
i = _next[ i ];
}
printf("\n");
}
void ListIndex(void){
int i;
printf("L = %d\n", _L);
printf("F = %d\n", _F);
printf(" ");
for ( i=0; i<=MAX_ELEMENT; i++ ){
printf("%5d", i);
}
printf("\n");
printf("_next: ");
for (i=0; i<=MAX_ELEMENT; i++){
printf("%3d, ",_next[i]);
}
printf("\n");
printf("_key: ");
for (i=0; i<=MAX_ELEMENT; i++){
printf("%3d, ",_key[i]);
}
printf("\n");
printf("_prev: ");
for (i=0; i<=MAX_ELEMENT; i++){
printf("%3d, ",_prev[i]);
}
printf("\n");
}