标签:
线性表分为顺序表和链表。
链表的基本操作如下:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#define Error( Str ) FatalError( Str )
#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 )
struct Node
{
ElementType Element;
Position Next;
};
/* Make a list empty */
List
MakeEmpty( List L )
{
if( L != NULL )
DeleteList( L );
L = malloc( sizeof( struct Node ) );
if( L == NULL )
FatalError( "Out of memory!" );
L->Next = NULL;
return L;
}
/* Return true if L is empty */
int
IsEmpty( List L )
{
return L->Next == NULL;
}
/* Return true if P is the last position int list L */
/* Parameter L is unused in this implementation */
int
IsLast( Position P, List L )
{
return P->Next == NULL;
}
/* Return Position of X in L; NULL if not found */
Position
Find( ElementType X, List L )
{
Position P;
P = L->Next;
while( P != NULL && P->Element != X )
P = P->Next;
return P;
}
/* Delete first occurence of X from a list */
/* Assume use of a header node */
void
Delete( ElementType X, List L )
{
Position P,TmpCell;
P = FindPrevious( X, L );
if( !IsLast( P, L ) )/* Assumption of header use */
{ /* X is found ; delete it*/
TmpCell = P->Next;
P->Next = TmpCell->Next;
free( TmpCell);
}
}
/* If X is not found, then Next field of returned */
/* Position is NULL */
/* Assumes a header */
Position
FindPrevious(ElementType X,List L)
{
Position P;
P = L;
while( P->Next != NULL && P->Next->Element != X )
P = P->Next;
return P;
}
/* Insert (after legal position P) */
/* Header implementation assumed */
/* Parameter L is unused in this implementation */
void
Insert( ElementType X, List L, Position P )
{
Position TmpCell;
TmpCell = malloc( sizeof( struct Node ) );
if( TmpCell == NULL )
FatalError("Out of space!!!");
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
/* Incorrect DeleteList algorithm */
/*void
DeleteList( List L )
{
Position P;
P = L->Next;
L->Next = NULL;
while( P != NULL )
{
free(P);
P = P->Next;
}
}*/
/* Correct DeleteList algorithm */
void
DeleteList( List L )
{
Position P,Tmp;
P = L->Next;
L->Next = NULL;
while( P != NULL )
{
Tmp = P->Next;
free(P);
P = Tmp;
}
}
/* Position Header */
Position
Header(List L)
{
return L;
}
/* Return the First Position Node of list L */
Position
First(List L)
{
return L->Next;
}
/* Return the Advance of P */
Position
Advance(Position P)
{
return P->Next;
}
/* Retrive the element of the position P */
ElementType
Retrieve(Position P)
{
return P->Element;
}
/* Output all elements of list */
void
OutputAllElements( List L )
{
Position P;
P = L;
while( P->Next != NULL )
{
printf( "%c ",Retrieve( P->Next ) );
P = P->Next;
}
}
/* Insert initial elements of list */
void
InsertInitialElements( ElementType *X, List L ,int n )
{
while( n-- )
{
Insert( *X, L, L );
*X = *X - 1;
}
}
/* Main */
int
main(void)
{
ElementType i = 'z';
List La = malloc( sizeof( struct Node ) );
La->Next = NULL;
MakeEmpty( La );
InsertInitialElements( &i, La, 26 );
OutputAllElements( La );
return 0;
}
Result :
part of list.h
struct Node;/* define ? */标签:
原文地址:http://blog.csdn.net/oimchuan/article/details/44200485