链表
/* * author: lx * date: 2011-09-08 * brief: the interface of list * file: llist.c */ #include <stdio.h> #include <stdlib.h> #include "llist.h" int insert_list( register Node **linkp, int new_value ) { register Node *current; register Node *new; while ( ( current = *linkp ) != NULL && current->value < new_value ) linkp = ¤t->link; new = ( Node* )malloc( sizeof( Node ) ); if ( new == NULL ) return FALSE; new->value = new_value; new->link = current; *linkp = new; return TRUE; } Node* search_list( register Node* L, int k ) { Node* x = L; while ( x != NULL && x->value != k ) x = x->link; return x; } int delate_list( register Node** L, int k ) { Node *d = NULL; if ( ( d = search_list( *L, k ) ) == NULL ) return FALSE; /* * find the predecessor of the value k. */ Node **x = L ; Node *p = NULL; while( x != NULL ) { if ( ( *x )->value != k ) { p = *x; x = &((*x)->link); } else { if ( x == L ) *L = (*L)->link; return TRUE; } } p->link = (*x)->link; free( *x ); return TRUE; }
头文件:
/* * author: lx * date: 2011-09-08 * brief: the interface of list * file: llist.h */ #define FALSE 0 #define TRUE 1 typedef struct NODE { struct NODE *link; int value; }Node; /* * add a element into list * * return value: 0 is right, -1 is error. */ int insert_list( register Node**, int ); /* * search a element in the list. * * return the pointer of Node if find. else return NULL * */ Node* search_list( register Node*, int ); /* * delete a element in the list. * * returen value: 0 is right, -1 is error. */ int delate_list( register Node**, int );
例子:
#include <stdio.h> #include <stdlib.h> #include "llist.h" int main( void ) { Node *p = ( Node* )malloc( sizeof( Node ) ); if ( p == NULL ) return FALSE; p->link = NULL; p->value = 1; printf( "insert some elements after 1......\n" ); insert_list( &p, 2 ); insert_list( &p, 3 ); Node *plist = p; while( plist != NULL ) { printf( "value is %d\n", plist->value ); plist = plist->link; } delate_list( &p, 1 ); printf( "after delate.....\n" ); plist = p; while( plist != NULL ) { printf( "value is %d\n", plist->value ); plist = plist->link; } exit( 0 ); }