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");
}