算法导论复习:第十章

1. 栈的实现

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define SIZE 100
int		stack[ SIZE ];
int		top = 0;
int stackEmpty( int *S );
int stackFull( int *S );
void push( int *S, int value );
int pop( int *S );

int main( void )
{
	int			i = 0;
	for ( i = 0; i < 10; i++ ){
		push( stack, i );
	}
	for ( i = 0; i < 5; i++ ){
		printf("%d ", pop( stack ) );
	}
	printf("\n");
	for ( i = top - 1; i >= 0; i-- ){
		printf("%d ", stack[ i ] );
	}
	printf("\n");

	return 0;
}

int stackEmpty( int *S )
{
	return ( int )( 0 == top );
}

int stackFull( int *S )
{
	return ( int )( SIZE == top );
}

void push( int *S, int value )
{
	if ( stackFull( S ) ){
		printf("the stack is full\n");
		return;
	}
	S[ top++ ] = value;
}

int pop( int *S )
{
	if ( stackEmpty( S ) ){
		printf("the stack is empty\n");
		return INT_MIN;
	}
	
	top--;
	return S[ top ];
}



程序输出:

2. 队列

循环队列的实现:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 5
int		queue[ SIZE ];
int		top = 0;
int		rear = 0;

int emptyQueue( void );
int fullQueue( void );
void push( int value );
int pop( void );

int main( void )
{
	int		i = 0;
	for ( i = 0; i < 7; i++ ){
		push( i );
	}
	printf("\npop 3 element:\n");
	for ( i = 0; i < 3; i++ ){
		printf("%d ", pop() );
	}
	for ( i = 10; i < 14; i++ ){
		push( i );
	}
	printf("the queue is:\n");
	while ( !emptyQueue() ){
		printf("%d ", pop() );
	}
	printf("\n");

	return 0;
}

int emptyQueue( void )
{
	return ( int )( top == rear );
}

int fullQueue( void )
{
	return ( int )( ( rear + 1 ) % SIZE == top );
}

void push( int value )
{
	int temp = rear;
	if ( fullQueue() ){
		printf("the queue is full\n");
		return;
	}

	if ( SIZE - 1 == rear ){
		rear = 0;
	}
	else{
		rear += 1;
	}
	queue[ temp ] = value;
}

int pop( void )
{
	int temp = top;
	if ( emptyQueue() ){
		printf("the queue is empty\n");
		return INT_MIN;
	}

	if ( SIZE - 1 == top ){
		top = 0;
	}
	else{
		top += 1;
	}
	return queue[ temp ];
}



程序输出:

3. 链表

3-1:单向链表

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <time.h>

typedef struct NODE{
	int					data;
	struct NODE	*next;
} Node;

//单向链表的插入
void insertNode( Node *node, int value );
//单向链表的删除
int	deleteNode( Node *node, int value );
//单向链表的搜索
int searchNode( Node *node, int value );
//打印整张链表
void showNode( Node *node );

int main( void )
{
	int		i = 0;
	Node *node = ( Node * )malloc( sizeof( Node ) );
	node->data = INT_MIN;
	node->next = NULL;
	srand( ( unsigned int )time( NULL ) );
	for ( i = 0; i < 10; i++ ){
		insertNode( node, rand() % 15 );
	}
	showNode( node->next );
	
	if ( searchNode( node, 12 ) ){
		printf("12 is in the list\n");
	}
	else{
		printf("12 is not in the list\n");
	}

	for ( i = 5; i < 8; i++ ){
		deleteNode( node, i );
	}

	showNode( node->next );

	return 0;
}

void insertNode( Node *node, int value )
{
	Node *newNode = ( Node * )malloc( sizeof( Node ) );
	newNode->data = value;
	newNode->next = NULL;

	if ( NULL == node->next ){
		node->next = newNode;
	}
	else{
		//插入头部
		if ( value <= node->next->data ){
			newNode->next = node->next;
			node->next = newNode;
		}
		else{
			Node *prevNode = ( Node * )malloc( sizeof( Node ) );
			node = node->next;
			while ( NULL != node && value > node->data ){
				prevNode = node;
				node = node->next;
			}
			newNode->next = node;
			prevNode->next = newNode;
		}
	}
}

int	deleteNode( Node *node, int value )
{
	Node *prevNode = ( Node * )malloc( sizeof( Node ) );
	prevNode = node;
	node = node->next;
	while ( NULL != node && value > node->data ){
		prevNode = node;
		node = node->next;
	}
	if ( value == node->data ){
		prevNode->next = prevNode->next->next;
		return 1;
	}
	
	return 0;
}

int searchNode( Node *node, int value )
{
	node = node->next;
	while ( NULL != node && value > node->data ){
		node = node->next;
	}
	if ( value == node->data ){
		return 1;
	}

	return 0;
}

void showNode( Node *node )
{
	while ( NULL != node ){
		printf("%d->", node->data );
		node = node->next;
	}
	printf("NULL\n");
}



程序输出:

3-2:双向循环链表

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>

typedef struct DOUBLELINK{
	int							data;
	struct DOUBLELINK	*prev;
	struct DOUBLELINK	*next;
} DoubleLink;

//双向循环链表的插入
void insertDLink( DoubleLink *dlink, int value );
//双向循环链表的删除
int deleteDLink( DoubleLink *dlink, int value );
//双向循环链表的搜索
int searchDLink( DoubleLink *dlink, int value );
//正向打印双向循环链表
void showDLink( DoubleLink *dlink );
//逆向打印双向循环链表
void showDLinkReverse( DoubleLink *dlink );

int main( void )
{
	int		i = 0;
	DoubleLink *dlink = ( DoubleLink * )malloc( sizeof( DoubleLink ) );
	dlink->data = INT_MIN;
	dlink->prev = dlink->next = NULL;

	srand( ( unsigned int )time( NULL ) );
	for ( i = 0; i < 10; i++ ){
		insertDLink( dlink, rand() % 15 );
	}
	printf("the double link is:\n");
	showDLink( dlink->next );
	printf("the reverse double link is:\n");
	showDLinkReverse( dlink->prev );

	if ( searchDLink( dlink, 12 ) ){
		printf("12 is in the double link\n");
	}
	else{
		printf("12 is not in the double link\n");
	}

	for ( i = 5; i < 8; i++ ){
		deleteDLink( dlink, i );
	}

	printf("the double link is:\n");
	showDLink( dlink->next );
	printf("the reverse double link is:\n");
	showDLinkReverse( dlink->prev );

	return 0;
}

void insertDLink( DoubleLink *dlink, int value )
{
	DoubleLink *newDLink = ( DoubleLink * )malloc( sizeof( DoubleLink ) );
	newDLink->data = value;
	newDLink->prev = newDLink->next = NULL;

	if ( NULL == dlink->next ){
		dlink->next = newDLink;
		dlink->prev = newDLink;
		newDLink->prev = dlink;
	}
	else{
		DoubleLink *rootDLink = ( DoubleLink * )malloc( sizeof( DoubleLink ) );
		DoubleLink *prevDLink = ( DoubleLink * )malloc( sizeof( DoubleLink ) );
		rootDLink = dlink;
		prevDLink = dlink;
		dlink = dlink->next;
		while ( NULL != dlink && value > dlink->data ){
			prevDLink = dlink;
			dlink = dlink->next;
		}
		if ( NULL != dlink ){
			newDLink->next = dlink;
			dlink->prev = newDLink;
		}
		else{
			rootDLink->prev = newDLink;
		}
		prevDLink->next = newDLink;
		newDLink->prev = prevDLink;
	}
}

int deleteDLink( DoubleLink *dlink, int value )
{
	DoubleLink *prevDLink = ( DoubleLink * )malloc( sizeof( DoubleLink ) );
	DoubleLink *rootDLink = ( DoubleLink * )malloc( sizeof( DoubleLink ) );
	rootDLink = dlink;
	prevDLink = dlink;
	dlink = dlink->next;
	while ( NULL != dlink && value > dlink->data ){
		prevDLink = dlink;
		dlink = dlink->next;
	}
	if ( value == dlink->data ){
		if ( NULL == dlink->next ){
			prevDLink->next = prevDLink->next->next;
			rootDLink->prev = prevDLink;
		}
		else{
			prevDLink->next->next->prev = prevDLink;
			prevDLink->next = prevDLink->next->next;
		}
		return 1;
	}

	return 0;
}

int searchDLink( DoubleLink *dlink, int value )
{
	dlink = dlink->next;
	while ( NULL != dlink && value > dlink->data ){
		dlink = dlink->next;
	}

	if ( value == dlink->data ){
		return 1;
	}

	return 0;
}

void showDLink( DoubleLink *dlink )
{
	while ( NULL != dlink ){
		printf("%d-->", dlink->data );
		dlink = dlink->next;
	}
	printf("NULL\n");
}

void showDLinkReverse( DoubleLink *dlink )
{
	while ( INT_MIN != dlink->data ){
		printf("%d-->", dlink->data );
		dlink = dlink->prev;
	}
	printf("NULL\n");
}



程序输出:


转载于:https://my.oschina.net/voler/blog/190155

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值