队列的基本操作(入队、出队、清空……)
SqQue.h
# ifndef __SQQUE_H__
# define __SQQUE_h__
typedef int element;
typedef struct SqQue
{
element * data;
int max_len;
int now_len;
int rear;
int front;
} SqQue;
SqQue * InitSqQue ( int maxl) ;
void clearSqQue ( SqQue * q) ;
void destroySqQue ( SqQue * q) ;
int SqQueisempty ( SqQue * q) ;
int SqQuelength ( SqQue * q) ;
int SqQuein ( SqQue * q) ;
int SqQue ( SqQue * q, element * x) ;
int getSqQue ( SqQue * q, element * x) ;
# endif
SqQue.c
# include <stdio.h>
# include <stdlib.h>
# include "SqQue.c"
SqQue * InitSqQue ( int maxl)
{
SqQue * q = malloc ( sizeof ( * q) ) ;
q-> data = malloc ( sizeof ( element) * maxl) ;
q-> max_len = maxl;
q-> now_len = 0 ;
q-> rear = 0 ;
q-> front = 0 ;
return q;
}
void clearSqQue ( SqQue * q)
{
if ( q == NULL )
{
return ;
}
q-> now_len = 0 ;
q-> rear = 0 ;
q-> front = 0 ;
return ;
}
void destroySqQue ( SqQue * q)
{
if ( q == NULL )
{
return ;
}
free ( q-> data) ;
free ( q) ;
return ;
}
int SqQueisempty ( SqQue * q)
{
if ( q == NULL || q-> now_len == 0 )
{
return 1 ;
}
return 0 ;
}
int SqQuelength ( SqQue * q)
{
if ( q == NULL || q-> now_len == 0 )
{
return 0 ;
}
return q-> now_len;
}
int SqQuein ( SqQue * q)
{
if ( q == NULL || q-> now_len == q-> max_len)
{
return 0 ;
}
q-> data[ q-> rear++ ] = x;
q-> rear = q-> rear % q-> max_len;
q-> now_len++ ;
return 1 ;
}
int SqQue ( SqQue * q, element * x)
{
if ( q == NULL || q-> now_len == 0 )
{
return 0 ;
}
* x = q-> data[ q-> front++ ] ;
printf ( "出队元素为:%d\n" , * x) ;
q-> front = q-> front % q-> max_len;
q-> now_len-- ;
return1;
}
int getSqQue ( SqQue * q, element * x)
{
if ( q == NULL || q-> now_len == 0 )
{
return 0 ;
}
* x = q-> data[ q-> front] ;
printf ( "队头元素为:%d\n" , * x) ;
return 1 ;
}
main.c
# include <stdio.h>
# include <stdlib.h>
# include "SqQue.h"
int main ( )
{
int maxl, x, i;
printf ( "请输入最大长度:\n" ) ;
scanf ( "%d" , & maxl) ;
SqQue * q = InitSqQue ( maxl) ;
printf ( "请输入队列元素:\n" ) ;
for ( i = 0 ; i < maxl; i++ )
{
scanf ( "%d" , & x) ;
SqQuein ( q, x) ;
}
SqQueout ( q, & x) ;
getSqQue ( q, & x) ;
int m = SqQueisEmpty ( q) ;
printf ( "%d\n" , m) ;
clearSqQue ( q) ;
int n = SqQueisEmpty ( q) ;
printf ( "%d\n" , n) ;
return 0 ;
}
链式队列
LinkQue.h
# ifndef __LINKQUE_h__
# define __LINKQUE_h__
typedef int element;
typedef struct QNode
{
element data;
struct QNode * next;
struct QNode * prev;
} QNode;
typedef struct Qlink
{
QNode * front;
QNode * rear;
element Nodenum;
} LinkQue;
LinkQue * InitLinkQue ( void ) ;
void clearLinkQue ( LinkQue * q) ;
void destroyLinkQue ( LinkQue * q) ;
int LinkQueisempty ( LinkQue * q) ;
int LinkQueLenth ( LinkQue * q) ;
int LinkQuein ( LinkQue * q, element x) ;
int LinkQueout ( LinkQue * q, element * e) ;
int GetHead ( LinkQue * q, element * e) ;
# endif # ifndef __SQQUE_H__
# define __SQQUE_H__
typedef int element;
typedef struct SqQue
{
element * data;
int max_len;
int now_len;
int rear;
int front;
} SqQue;
SqQue * InitSqQue ( int maxl) ;
void clearSqQue ( SqQue * q) ;
void destroySqQue ( SqQue * q) ;
int SqQueisEmpty ( SqQue * q) ;
int SqQuelenth ( SqQue * q) ;
int SqQuein ( SqQue * q, element x) ;
int SqQueout ( SqQue * q, element * x) ;
int getSqQue ( SqQue * q, element * x) ;
# endif
LinkQue.c
# include <stdio.h>
# include <stdlib.h>
# include "LinkQue.h"
LinkQue * InitLinkQue ( void )
{
LinkQue * q = malloc ( sizeof ( * q) ) ;
q-> front = NULL ;
q-> rear = NULL ;
q-> Nodenum = 0 ;
return q;
}
void clearLinkQue ( LinkQue * q)
{
if ( q == NULL )
{
return ;
}
QNode * p = q-> front;
while ( p)
{
q-> front = p-> next;
if ( p-> next)
{
p-> next-> prev = NULL ;
}
p-> next = NULL ;
free ( p) ;
p = q-> front;
}
q-> rear = NULL ;
q-> Nodenum = 0 ;
return ;
}
void destroyLinkQue ( LinkQue * q)
{
if ( q == NULL )
{
return ;
}
clearLinkQue ( q) ;
free ( q) ;
}
int LinkQueisempty ( LinkQue * q)
{
if ( q == NULL || q-> Nodenum == 0 )
{
return 1 ;
}
return 0 ;
}
int LinkQueLenth ( LinkQue * q)
{
if ( q == NULL || q-> Nodenum == 0 )
{
return 0 ;
}
return q-> Nodenum;
}
int LinkQuein ( LinkQue * q, element x)
{
if ( q == NULL )
{
return 0 ;
}
QNode * p = malloc ( sizeof ( * p) ) ;
p-> data = x;
p-> next = NULL ;
p-> prev = NULL ;
if ( q-> front == NULL )
{
q-> front = p;
q-> rear = p;
}
else
{
q-> rear-> next = p;
p-> prev = q-> rear;
q-> rear = p;
}
q-> Nodenum++ ;
return 1 ;
}
int LinkQueout ( LinkQue * q, element * e)
{
if ( q == NULL || q-> Nodenum == 0 )
{
return 0 ;
}
* e = q-> front-> data;
printf ( "出队元素:%d\n" , * e) ;
QNode * p = q-> front;
q-> front = p-> next;
if ( p-> next)
{
p-> next-> prev = NULL ;
p-> next = NULL ;
free ( p) ;
}
else
{
q-> rear = NULL ;
free ( p) ;
}
q-> Nodenum-- ;
return 1 ;
}
int GetHead ( LinkQue * q, element * e)
{
if ( q == NULL || q-> front == NULL )
{
return 0 ;
}
* e = q-> front-> data;
printf ( "队首元素:%d\n" , * e) ;
return 1 ;
}
main.c
# include <stdio.h>
# include <stdlib.h>
# include "LinkQue.h"
int main ( )
{
element x, e;
LinkQue * q = InitLinkQue ( ) ;
printf ( "请输入入队数据:\n" ) ;
while ( 1 )
{
scanf ( "%d" , & x) ;
if ( x == 0 )
{
break ;
}
LinkQuein ( q, x) ;
}
GetHead ( q, & x) ;
int n = LinkQueLenth ( q) ;
printf ( "长度是:%d\n" , n) ;
LinkQueout ( q, & x) ;
n = LinkQueLenth ( q) ;
printf ( "长度是:%d\n" , n) ;
GetHead ( q, & x) ;
int m = LinkQueisempty ( q) ;
printf ( "%d\n" , m) ;
clearLinkQue ( q) ;
n = LinkQueLenth ( q) ;
printf ( "长度是:%d\n" , n) ;
m = LinkQueisempty ( q) ;
printf ( "%d\n" , m) ;
return 0 ;
}