标签:
线性表分为顺序表和链表。
链表的基本操作如下:
#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