c 언어 는 단일 체인 표 데이터 구조 와 기본 적 인 조작 을 실현 한다.

10174 단어
선두 결산 점 싱글 체인 시계.세 개의 파일 로 나 뉘 는데 각각 헤더 파일, 테스트 파일, 소스 코드 파일 이다.
단일 체인 표 의 일부 조작 을 제 시 했 고 모든 조작 에 해당 하 는 주석 이 이 함수 기능 을 설명 합 니 다.
test.c  파일 에 서 는 입력 데이터 가 합 법 적 인지 검 사 했 으 나 입력 데이터 가 합 법 적 이지 않 을 때 취해 야 할 조 치 를 실현 하지 못 했다.
테스트 파일 하나의 메뉴 를 통 해 단일 링크 기능 을 테스트 합 니 다.
list.h:
/*             */  


#ifndef LIST_H_
#define LIST_H_ 


struct Node;									//   ,        ,              

 
/*          */  
typedef int ElementType;                        //        
typedef struct Node * PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;


/*            */   
struct Node {
    ElementType element;  
	Position	next;
};


/*        */  
List MakeEmpty ( List l );
int IsEmpty ( List L );
int IsLast ( Position p, List l );
Position Find ( ElementType x, List l );
void Delete ( ElementType x, List l );
Position FindPrevious ( ElementType x, List l );
void Insert ( ElementType x, List l, Position p );
void DeleteList ( List l );
Position Header ( List l );
Position First ( List l );
Position Last ( List l );
Position Advance ( Position p );
ElementType Retrieve ( Position p );
void PushFront ( ElementType x, List l );
void PopFront ( List l );
void PushBack ( ElementType x, List l );
void PopBack ( List l );


#endif

test.c:
/*       */  


#include   
#include   
#include "list.h"


struct Node;


void Menu ( void );								//    
void PrintList ( List l );						//     


int main ( void )  
{  

    List l;
	int choice;  
	ElementType x;  

	l = NULL;
	choice = 0;
	x = 0;
  
    Menu (  );
  
    scanf ( "%d", &choice );  
  
    while ( 0 != choice )  
    {  
        switch ( choice )  
        {  
        case 1: if ( NULL == ( l = MakeEmpty ( l ) ) )	//        ,    l    。   MakeEmpty            ,           !  !!
				{
				printf ( "     !
" ); } else { printf ( " !
" ); } break; case 2: if ( 1 == IsEmpty ( l ) ) { printf ( " !
" ); } else { printf ( " !
" ); } break; case 3: { Position p; p = Last ( l ); if ( NULL == p ) { printf ( "0. , !
" ); break; } if ( 1 == IsLast ( p , l ) ) { printf ( "1. !
" ); } if ( 0 == IsLast ( l, l ) ) { printf ( "2. !
" ); } break; } case 4: printf ( " : " ); if ( 1 == scanf ( "%d", &x ) ) { Position tmp; tmp = Find ( x ,l ); if ( NULL == tmp ) { printf ( " %d !
", x ); } else { printf ( " %d!
", ( Retrieve ( tmp ) ) ); } } else { printf ( " , !
" ); } break; case 5: printf ( " : " ); if ( 1 == scanf ( "%d", &x ) ) { Delete ( x, l ); printf ( " !
" ); } else { printf ( " , !
" ); } break; case 6: printf ( " : " );// if ( 1 == scanf ( "%d", &x ) ) { Insert ( x, l, l ); printf ( " !
" ); } else { printf ( " , !
" ); } break; case 7: DeleteList ( l ); printf ( " !
" ); l = NULL; break; case 8: printf ( " : " ); if ( 1 == scanf ( "%d", &x ) ) { PushFront ( x, l ); printf ( " !
" ); } else { printf ( " , !
" ); } break; case 9: PopFront ( l ); printf ( " !
" ); break; case 10: printf ( " : " ); if ( 1 == scanf ( "%d", &x ) ) { PushBack ( x, l ); printf ( " !
" ); } else { printf ( " , !
" ); } break; case 11: PopBack ( l ); printf ( " !
" ); break; case 12: PrintList ( l ); break; default: printf ( " !
" ); break; } Menu ( ); scanf ( "%d", &choice ); } system ( "pause" ); return 0; } void Menu ( void ) // { printf ( "***************************************************************
" ); printf ( " 1. 2.
" ); printf ( " 3. 4.
" ); printf ( " 5. 6.
" ); printf ( " 7. 8.
" ); printf ( " 9. 10.
" ); printf ( " 11. 12.
" ); printf ( "***************************************************************
" ); } void PrintList ( List l ) // { Position p; p = l -> next; while ( NULL != p ) { printf ( "%d -> ", ( p -> element ) ); p = p -> next; } printf ( "
" ); }

list.c:
/*  list.c  --             */  


#include   
#include 
#include "list.h"  


/*        */  


/*                */				//           (              .)
List MakeEmpty ( List l )						//     l                  ,                      
{
	if ( NULL != l )							//       -> c  ,          free( )   NULL
	{
		DeleteList ( l );
	}

	l = ( List )malloc ( sizeof ( struct Node ) );//malloc                !

	if ( NULL == l )
	{
		printf ( "      !" );
		return NULL;
	}

	l -> element = 0;
	l -> next = NULL;

	return l;
}

/*             */  
int IsEmpty ( List l )  
{  
	return ( NULL == l -> next );
}  
 
/*                  */			//              
int IsLast ( Position p, List l )
{
	return ( NULL == p -> next );
}

/*           x  */
Position Find ( ElementType x, List l )
{
	Position p;

	p = l -> next;								//       .

	while ( ( NULL != p ) && ( x != p -> element ) )
	{
		p = p -> next;
	}

	return p;
}

/*           x  */						//     ,        
void Delete ( ElementType x, List l )			//     FindPrevious( )  
{
	Position p;
	Position tmpCell;
	
	p = FindPrevious ( x, l );

	if ( !( IsLast ( p, l ) ) )
	{
		tmpCell = p -> next;
		p -> next = p -> next -> next;			//  !    p next ,   p!	
		free ( tmpCell );						//free( )    ,      NULL.
		tmpCell = NULL;
	}
}

/*           x       */			//  Find    ,       ( Find      ,      )
Position FindPrevious ( ElementType x, List l )
{
	Position p;

	p = l;										//        ,  l     

	while ( ( NULL != p -> next ) && ( x != p -> next -> element ) )
	{
		p = p -> next;
	}

	return p;									//     next !       !
}

/*           x  */
/*              */
void Insert ( ElementType x, List l, Position p )
{
	Position tmpCell;							//         ,   malloc       .5.

	tmpCell = ( List )malloc ( sizeof ( struct Node ) );//struct Node       , sizeof( sturct Node )      .     malloc.

	if ( NULL == tmpCell )						//        ,  malloc         ,  malloc            6.
	{
		printf ( "      " );
	}
	else
	{
	tmpCell -> element = x;
	tmpCell -> next = p -> next;
	p -> next = tmpCell;
	}
}

/*         */
void DeleteList ( List l )						//                  .
{
	Position p;
	Position tmp;

	p = l -> next;								//l  next       p  free l  ,  p          l   。 lnext          
	free ( l );									//      l  l      ,       l,  l    .
	l = NULL;									//  ,      l  ,  l      。     ,         !  

	while ( NULL != p )
	{
		tmp = p -> next;	
		free ( p );								//      p,  p next (         )
		p = tmp;
	}
}

/*           */							//       
Position Header ( List l )
{
	return l;
}

/*             */						//       
Position First ( List l )
{
	return ( l -> next );
}

/*               */					//       
Position Last ( List l )
{
	Position p = l;

	if ( NULL == l -> next )					//                ,        ,      .
	{
		return NULL;
	}
	else
	{
		while ( NULL != p -> next )
		{
			p = p -> next;
		}
	}

	return p;
}

/*      p        */					//       
Position Advance ( Position p )
{
	return ( p -> next ); 
}

/*      p      */						//       
ElementType Retrieve ( Position p )
{
	return ( p -> element );
}

/////*            x  */					//  1
//void PushFront ( ElementType x, List l )		//     Header( )     Insert( )  
//{
//	Insert ( x, l, Header ( l ) );
//}

/*            x  */					//  2
void PushFront ( ElementType x, List l )
{
	Position tmp;								//                l -> next.

	tmp = ( List )malloc ( sizeof ( struct Node ) );

	if ( NULL == tmp )
	{
		printf ( "      ,     !" );//             (     ).
	}
	else
	{
		tmp -> element = x;
		tmp -> next = l -> next;
		l -> next = tmp;
	}
}

/*              */
void PopFront ( List l )		
{
	if ( NULL == l -> next )
	{
		;
	}
	else
	{
		Position tmp;

		tmp = l -> next;						//       l next             ,          next (     ).
		l -> next = tmp -> next;
		
		free ( tmp );							//   next        ,      ,      next.
		tmp = NULL;
	}
}

/*            x  */
void PushBack ( ElementType x, List l )			//   Header( )  
{
	Position p;
	Position tmp;

	p = Header ( l );

	while ( NULL != p -> next )
	{
		p = p -> next;
	}

	tmp = ( List )malloc ( sizeof ( struct Node ) );

	if ( NULL == tmp )
	{
		printf ( "      ,    " );
	}
	else
	{
		tmp -> element = x;
		tmp -> next = NULL;
		p -> next = tmp;
	}
}

/*               */
void PopBack ( List l )
{
	if ( NULL == l -> next )
	{
		;
	}
	else
	{
		Position p;

		p = l;

		while ( NULL != p -> next -> next  )
		{
			p = p -> next;
		}

		free ( p -> next );
		p -> next = NULL;
	}
}

좋은 웹페이지 즐겨찾기