7种数据结构
顺序表
单链表
双链表 doulinklist.c doulinklist.h
链式栈
队列
树
哈希表
顺序表
sqlite.h
# ifndef __SEQLIST_H__
# define __SEQLIST_H__
typedef struct person {
char name[ 32 ] ;
char sex;
int age;
int score;
} DATATYPE;
typedef struct list {
DATATYPE * head;
int tlen;
int clen;
} SeqList;
SeqList * CreateSeqList ( int len) ;
int DestroySeqList ( SeqList * list) ;
int ShowSeqList ( SeqList * list) ;
int InsertTailSeqList ( SeqList * list, DATATYPE* data) ;
int IsFullSeqList ( SeqList * list) ;
int IsEmptySeqList ( SeqList * list) ;
int InsertPosSeqList ( SeqList * list, DATATYPE* data, int pos) ;
int FindSeqList ( SeqList * list, char * name) ;
int ModifySeqList ( SeqList * list, char * old, DATATYPE * newdata) ;
int DeleteSeqList ( SeqList * list, char * name) ;
int ClearSeqList ( SeqList * list) ;
int GetSizeSeqList ( SeqList* list) ;
DATATYPE* GetDataType ( SeqList* list, int pos) ;
# endif
seqlite.c
# include "seqlist.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
SeqList * CreateSeqList ( int len)
{
SeqList* sl = ( SeqList* ) malloc ( sizeof ( SeqList) ) ;
if ( NULL == sl)
{
printf ( "malloc 1 error\n" ) ;
return NULL ;
}
sl-> head = ( DATATYPE* ) malloc ( sizeof ( DATATYPE) * len) ;
if ( NULL == sl-> head)
{
printf ( "malloc 1 error\n" ) ;
return NULL ;
}
sl-> tlen = len;
sl-> clen = 0 ;
return sl;
}
int InsertTailSeqList ( SeqList * list, DATATYPE* data)
{
if ( IsFullSeqList ( list) )
{
return 1 ;
}
memcpy ( & list-> head[ list-> clen] , data, sizeof ( DATATYPE) ) ;
list-> clen++ ;
return 0 ;
}
int IsFullSeqList ( SeqList* list)
{
return list-> clen == list-> tlen ;
}
int GetSizeSeqList ( SeqList* list)
{
return list-> clen ;
}
int ShowSeqList ( SeqList * list)
{
int i = 0 ;
int len = GetSizeSeqList ( list) ;
for ( i = 0 ; i< len; i++ )
{
printf ( "%s %c %d %d\n" , list-> head[ i] . name,
list-> head [ i] . sex, list-> head[ i] . age, list-> head[ i] . score ) ;
}
}
int IsEmptySeqList ( SeqList * list)
{
return 0 == list-> clen ;
}
int InsertPosSeqList ( SeqList * list, DATATYPE * data, int pos)
{
if ( pos< 0 || pos> list-> clen)
{
return 1 ;
}
if ( IsFullSeqList ( list) )
{
return 1 ;
}
for ( int i= list-> clen ; i> pos; i-- )
{
list-> head[ i] = list-> head[ i- 1 ] ;
}
memcpy ( & list-> head[ pos] , data, sizeof ( DATATYPE) ) ;
list-> clen ++ ;
return 0 ;
}
int FindSeqList ( SeqList * list, char * name)
{
int len = GetSizeSeqList ( list) ;
int i = 0 ;
for ( i= 0 ; i< len; i++ )
{
if ( 0 == strcmp ( list-> head [ i] . name, name) )
{
return i;
}
}
return - 1 ;
}
DATATYPE* GetDataType ( SeqList* list, int pos)
{
return & list-> head[ pos] ;
}
int ClearSeqList ( SeqList * list)
{
list-> clen = 0 ;
return 0 ;
}
int DestroySeqList ( SeqList * list)
{
free ( list-> head) ;
free ( list) ;
return 0 ;
}
int ModifySeqList ( SeqList * list, char * old, DATATYPE * newdata)
{
int i = FindSeqList ( list, old) ;
if ( - 1 == i)
{
return 1 ;
}
memcpy ( & list-> head[ i] , newdata, sizeof ( DATATYPE) ) ;
return 0 ;
}
int DeleteSeqList ( SeqList * list, char * name)
{
int pos = FindSeqList ( list, name) ;
if ( - 1 == pos)
{
return 1 ;
}
int len = GetSizeSeqList ( list) ;
int i = 0 ;
for ( i= pos; i< len; i++ )
{
memcpy ( & list-> head[ i] , & list-> head[ i+ 1 ] , sizeof ( DATATYPE) ) ;
}
list-> clen-- ;
return 0 ;
}
单链表
linklist.c
# include "linklist.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
LinkList * CreateLinkList ( ) {
LinkList * ll = ( LinkList * ) malloc ( sizeof ( LinkList) ) ;
if ( NULL == ll) {
printf ( "CreateLinkList malloc\n" ) ;
return NULL ;
}
ll-> head = NULL ;
ll-> clen = 0 ;
return ll;
}
int InsertHeadLinkList ( LinkList * list, DATATYPE * data) {
LinkNode * newnode = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
if ( NULL == newnode) {
printf ( "InsertHeadLinkList malloc\n" ) ;
return 1 ;
}
memcpy ( & newnode-> data, data, sizeof ( DATATYPE) ) ;
newnode-> next = NULL ;
if ( IfEmptyLinkList ( list) )
{
list-> head = newnode;
} else {
newnode-> next = list-> head;
list-> head = newnode;
}
list-> clen++ ;
return 0 ;
}
int IfEmptyLinkList ( LinkList * list) { return 0 == list-> clen; }
int ShowLinkList ( LinkList * list) {
LinkNode * tmp = list-> head;
while ( tmp) {
printf ( "%s %d\n" , tmp-> data. name, tmp-> data. age) ;
tmp = tmp-> next;
}
return 0 ;
}
LinkNode * FindLinkList ( LinkList * list, PFUN fun, void * arg) {
LinkNode * tmp = list-> head;
while ( tmp) {
if ( fun ( & tmp-> data, arg) ) {
return tmp;
}
tmp = tmp-> next;
}
return NULL ;
}
int InsertTailLinkList ( LinkList * list, DATATYPE * data) {
LinkNode * newnode = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
if ( NULL == newnode) {
printf ( "InsertTailLinkList malloc\n" ) ;
return 1 ;
}
memcpy ( & newnode-> data, data, sizeof ( DATATYPE) ) ;
newnode-> next = NULL ;
if ( IfEmptyLinkList ( list) ) {
list-> head = newnode;
} else {
LinkNode * tmp = list-> head;
while ( tmp-> next) {
tmp = tmp-> next;
}
tmp-> next = newnode;
}
list-> clen++ ;
return 0 ;
}
int InsertPosLinkList ( LinkList * list, DATATYPE * data, int pos) {
int len = GetSizeLinkList ( list) ;
if ( pos < 0 || pos > len) {
return 1 ;
}
if ( 0 == pos) {
return InsertHeadLinkList ( list, data) ;
} else if ( pos == len) {
return InsertTailLinkList ( list, data) ;
} else
{
LinkNode * newnode = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
if ( NULL == newnode) {
printf ( "InsertTailLinkList malloc\n" ) ;
return 1 ;
}
memcpy ( & newnode-> data, data, sizeof ( DATATYPE) ) ;
newnode-> next = NULL ;
LinkNode * tmp = list-> head;
int i = 0 ;
for ( i = 0 ; i < pos - 1 ; i++ ) {
tmp = tmp-> next;
}
newnode-> next = tmp-> next;
tmp-> next = newnode;
}
list-> clen++ ;
return 0 ;
}
int GetSizeLinkList ( LinkList * list) { return list-> clen; }
int DeleteHeadLinklist ( LinkList * list) {
if ( IfEmptyLinkList ( list) ) {
return 1 ;
}
LinkNode * tmp = list-> head;
list-> head = tmp-> next;
free ( tmp) ;
list-> clen-- ;
return 0 ;
}
int DeleteTailLinkList ( LinkList * list) {
if ( IfEmptyLinkList ( list) ) {
return 1 ;
}
int len = GetSizeLinkList ( list) ;
if ( 1 == len) {
free ( list-> head) ;
list-> head = NULL ;
} else {
LinkNode * tmp = list-> head;
LinkNode * tmp1 = list-> head;
while ( tmp-> next) {
tmp1 = tmp;
tmp = tmp-> next;
}
free ( tmp) ;
tmp1-> next = NULL ;
}
list-> clen-- ;
return 0 ;
}
int DeletePosLinkList ( LinkList * list, int pos) {
int len = GetSizeLinkList ( list) ;
if ( IfEmptyLinkList ( list) ) {
return 1 ;
}
if ( 0 == pos) {
DeleteHeadLinklist ( list) ;
} else if ( len - 1 == pos)
{
DeleteTailLinkList ( list) ;
} else
{
LinkNode * tmp = list-> head;
LinkNode * tmp1 = list-> head;
for ( int i = 0 ; i < pos; i++ ) {
tmp1 = tmp;
tmp = tmp-> next;
}
tmp1-> next = tmp-> next;
free ( tmp) ;
list-> clen-- ;
}
return 0 ;
}
int ModifyLinkList ( LinkList * list, PFUN fun, void * arg, DATATYPE * newdata) {
LinkNode * tmp = FindLinkList ( list, fun, arg) ;
if ( NULL == tmp) {
return 1 ;
}
memcpy ( & tmp-> data, newdata, sizeof ( DATATYPE) ) ;
return 1 ;
}
int DestroyLinkList ( LinkList * list) {
int len = GetSizeLinkList ( list) ;
for ( int i = 0 ; i < len; i++ ) {
DeleteHeadLinklist ( list) ;
}
free ( list) ;
return 0 ;
}
LinkNode * FindMidLinkList ( LinkList * list) {
if ( IfEmptyLinkList ( list) ) {
return NULL ;
}
LinkNode * pfast = list-> head;
LinkNode * pslow = list-> head;
while ( pfast) {
pfast = pfast-> next;
if ( pfast) {
pfast = pfast-> next;
pslow = pslow-> next;
} else {
break ;
}
}
return pslow;
}
LinkNode * FindRevKLinkList ( LinkList * list, int k) {
if ( IfEmptyLinkList ( list) ) {
return NULL ;
}
LinkNode * pfast = list-> head;
LinkNode * pslow = list-> head;
int i = 0 ;
for ( i = 0 ; i < k; i++ ) {
pfast = pfast-> next;
if ( NULL == pfast) {
return pslow;
}
}
while ( pfast) {
pfast = pfast-> next;
pslow = pslow-> next;
}
return pslow;
}
int RevertLinkList ( LinkList * list) {
LinkNode * prev = NULL ;
LinkNode * tmp = list-> head;
LinkNode * next = list-> head-> next;
while ( 1 ) {
tmp-> next = prev;
prev = tmp;
tmp = next;
if ( NULL == tmp) {
break ;
}
next = next-> next;
}
list-> head = prev;
return 0 ;
}
int InsertSortLinkList ( LinkList * list)
{
LinkNode* phead = list-> head;
LinkNode* pinsert = phead-> next;
LinkNode* pnext = pinsert-> next;
phead-> next = NULL ;
while ( 1 )
{
phead = list-> head;
while ( phead-> next != NULL && pinsert-> data. age > phead-> data. age &&
pinsert-> data. age > phead-> next-> data. age)
{
phead = phead-> next;
}
if ( pinsert-> data . age < phead -> data. age)
{
pinsert-> next = list-> head;
list-> head = pinsert;
}
else
{
pinsert-> next = phead-> next;
phead-> next = pinsert;
}
pinsert = pnext;
if ( NULL == pinsert)
{ break ; }
pnext = pnext-> next;
}
return 0 ;
}
linklist.h
# ifndef __LINKLIST_H__
# define __LINKLIST_H__
typedef struct person
{
char name[ 32 ] ;
char sex;
int age;
int score;
} DATATYPE;
typedef struct node
{
DATATYPE data;
struct node * next;
} LinkNode;
typedef struct list
{
LinkNode * head;
int clen;
} LinkList;
typedef int ( * PFUN) ( DATATYPE* , void * arg) ;
LinkList * CreateLinkList ( ) ;
int InsertHeadLinkList ( LinkList * list, DATATYPE * data) ;
int ShowLinkList ( LinkList * list) ;
LinkNode * FindLinkList ( LinkList * list, PFUN fun, void * arg) ;
int DeleteHeadLinklist ( LinkList * list) ;
int DeleteTailLinkList ( LinkList * list) ;
int DeletePosLinkList ( LinkList * list, int pos) ;
int ModifyLinkList ( LinkList * list, PFUN fun, void * arg, DATATYPE* newdata) ;
int DestroyLinkList ( LinkList * list) ;
int InsertTailLinkList ( LinkList * list, DATATYPE * data) ;
int IfEmptyLinkList ( LinkList * list) ;
int InsertPosLinkList ( LinkList * list, DATATYPE * data, int Pos) ;
int GetSizeLinkList ( LinkList * list) ;
LinkNode* FindMidLinkList ( LinkList * list) ;
LinkNode* FindRevKLinkList ( LinkList * list, int k) ;
int RevertLinkList ( LinkList * list) ;
int InsertSortLinkList ( LinkList * list) ;
# endif
双链表
doulinklist.c
# include "doulinklist.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
DouLinkList * CreateDouLinkList ( ) {
DouLinkList * dl = ( DouLinkList * ) malloc ( sizeof ( DouLinkList) ) ;
if ( NULL == dl) {
printf ( "CreateDouLinkList malloc\n" ) ;
return NULL ;
}
dl-> head = NULL ;
dl-> clen = 0 ;
return dl;
}
int IsEmptyDouLinkList ( DouLinkList * list) { return 0 == list-> clen; }
int GetSizeDouLinkList ( DouLinkList * list) { return list-> clen; }
int InsertHeadDouLinkList ( DouLinkList * list, DATATYPE * data) {
DouLinkNode * newnode = ( DouLinkNode * ) malloc ( sizeof ( DouLinkNode) ) ;
if ( NULL == newnode) {
printf ( "InsertHeadDouLinkList malloc\n" ) ;
return 1 ;
}
memcpy ( & newnode-> data, data, sizeof ( DATATYPE) ) ;
newnode-> next = NULL ;
newnode-> prev = NULL ;
if ( IsEmptyDouLinkList ( list) ) {
list-> head = newnode;
} else {
newnode-> next = list-> head;
list-> head-> prev = newnode;
list-> head = newnode;
}
list-> clen++ ;
return 0 ;
}
int ShowDouLinkList ( DouLinkList * list, SHOW_DIR dir) {
DouLinkNode * tmp = list-> head;
if ( DIR_FORWARD == dir) {
while ( tmp) {
printf ( "%s %d\n" , tmp-> data. name, tmp-> data. score) ;
tmp = tmp-> next;
}
} else {
while ( tmp-> next) {
tmp = tmp-> next;
}
while ( tmp) {
printf ( "%s %d\n" , tmp-> data. name, tmp-> data. score) ;
tmp = tmp-> prev;
}
}
return 0 ;
}
int InsertTailDouLinkList ( DouLinkList * list, DATATYPE * data) {
if ( IsEmptyDouLinkList ( list) ) {
return InsertHeadDouLinkList ( list, data) ;
}
DouLinkNode * tmp = list-> head;
while ( tmp-> next) {
tmp = tmp-> next;
}
DouLinkNode * newnode = ( DouLinkNode * ) malloc ( sizeof ( DouLinkNode) ) ;
if ( NULL == newnode) {
printf ( "InsertTailDouLinkList malloc\n" ) ;
return 1 ;
}
memcpy ( & newnode-> data, data, sizeof ( DATATYPE) ) ;
newnode-> next = NULL ;
newnode-> prev = NULL ;
newnode-> prev = tmp;
tmp-> next = newnode;
list-> clen++ ;
return 0 ;
}
int InsertPosDouLinkList ( DouLinkList * list, DATATYPE * data, int pos) {
int len = GetSizeDouLinkList ( list) ;
if ( pos < 0 || pos > len) {
return 1 ;
}
if ( 0 == pos) {
return InsertHeadDouLinkList ( list, data) ;
} else if ( len == pos) {
return InsertTailDouLinkList ( list, data) ;
} else {
DouLinkNode * tmp = list-> head;
for ( int i = 0 ; i < pos; i++ ) {
tmp = tmp-> next;
}
DouLinkNode * newnode = malloc ( sizeof ( DATATYPE) ) ;
if ( NULL == newnode) {
printf ( "InsertPosDouLinkList malloc\n" ) ;
return 1 ;
}
memcpy ( & newnode-> data, data, sizeof ( DATATYPE) ) ;
newnode-> next = NULL ;
newnode-> prev = NULL ;
newnode-> next = tmp;
newnode-> prev = tmp-> prev;
tmp-> prev = newnode;
newnode-> prev-> next = newnode;
}
list-> clen++ ;
return 0 ;
}
int DeleteHeadDouLinkList ( DouLinkList * list) {
if ( IsEmptyDouLinkList ( list) ) {
return 1 ;
}
DouLinkNode * tmp = list-> head;
list-> head = list-> head-> next;
if ( list-> head != NULL ) {
list-> head-> prev = NULL ;
}
free ( tmp) ;
list-> clen-- ;
return 0 ;
}
int DeleteTailDouLinkList ( DouLinkList * list) {
if ( IsEmptyDouLinkList ( list) ) {
return 1 ;
}
DouLinkNode * tmp = list-> head;
while ( tmp-> next) {
tmp = tmp-> next;
}
if ( tmp-> prev != NULL ) {
tmp-> prev-> next = NULL ;
} else {
list-> head = NULL ;
}
free ( tmp) ;
list-> clen-- ;
return 0 ;
}
int DeletePosDouLinkList ( DouLinkList * list, int pos) {
int len = GetSizeDouLinkList ( list) ;
if ( pos < 0 || pos > len - 1 ) {
return 1 ;
}
if ( 0 == pos) {
return DeleteHeadDouLinkList ( list) ;
} else if ( pos == len - 1 ) {
return DeleteTailDouLinkList ( list) ;
} else
{
DouLinkNode * tmp = list-> head;
for ( int i = 0 ; i < pos; i++ ) {
tmp = tmp-> next;
}
tmp-> next-> prev = tmp-> prev;
tmp-> prev-> next = tmp-> next;
free ( tmp) ;
list-> clen-- ;
}
return 0 ;
}
DouLinkNode * FindDouLinkList ( DouLinkList * list, char * name)
{
if ( IsEmptyDouLinkList ( list) )
{
return NULL ;
}
DouLinkNode* tmp = list-> head;
while ( tmp)
{
if ( 0 == strcmp ( tmp-> data. name, name) )
{
return tmp;
}
tmp= tmp-> next;
}
return NULL ;
}
int ModifyDouLinkList ( DouLinkList * list, char * name, DATATYPE* data)
{
DouLinkNode* tmp = FindDouLinkList ( list, name) ;
if ( NULL == tmp)
{
return 1 ;
}
memcpy ( & tmp-> data, data, sizeof ( DATATYPE) ) ;
return 0 ;
}
int DestroyDouLinkList ( DouLinkList * list)
{
int len = GetSizeDouLinkList ( list) ;
for ( int i = 0 ; i< len; i++ )
{
DeleteHeadDouLinkList ( list) ;
}
free ( list) ;
return 0 ;
}
doulinklist.h
# ifndef __DOULINKLIST_H__
# define __DOULINKLIST_H__
typedef struct person {
char name[ 32 ] ;
char sex;
int age;
int score;
} DATATYPE;
typedef struct dounode {
DATATYPE data;
struct dounode * next, * prev;
} DouLinkNode;
typedef struct list {
DouLinkNode * head;
int clen;
} DouLinkList;
typedef enum { DIR_FORWARD, DIR_BACKWARD} SHOW_DIR;
DouLinkList * CreateDouLinkList ( ) ;
int InsertHeadDouLinkList ( DouLinkList * list, DATATYPE* data) ;
int InsertTailDouLinkList ( DouLinkList * list, DATATYPE* data) ;
int InsertPosDouLinkList ( DouLinkList * list, DATATYPE* data, int pos) ;
int ShowDouLinkList ( DouLinkList * list, SHOW_DIR dir) ;
DouLinkNode * FindDouLinkList ( DouLinkList * list, char * name) ;
int DeleteHeadDouLinkList ( DouLinkList * list) ;
int DeleteTailDouLinkList ( DouLinkList * list) ;
int DeletePosDouLinkList ( DouLinkList * list, int pos) ;
int ModifyDouLinkList ( DouLinkList * list, char * name, DATATYPE* data) ;
int DestroyDouLinkList ( DouLinkList * list) ;
int IsEmptyDouLinkList ( DouLinkList * list) ;
int GetSizeDouLinkList ( DouLinkList * list) ;
# endif
链式栈
linkstack.c
# include "linkstack.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
LinkStack* CreateLinkStack ( )
{
LinkStack* ls = ( LinkStack* ) malloc ( sizeof ( LinkStack) ) ;
if ( NULL == ls)
{
printf ( "CreateLinkStack malloc" ) ;
return NULL ;
}
ls-> top = NULL ;
ls-> clen= 0 ;
return ls;
}
int PushLinkStack ( LinkStack* ls, DATATYPE* data)
{
LinkStackNode* newnode = ( LinkStackNode* ) malloc ( sizeof ( LinkStackNode) ) ;
if ( NULL == newnode)
{
printf ( "PushLinkStack malloc" ) ;
return 1 ;
}
memcpy ( & newnode-> data, data, sizeof ( DATATYPE) ) ;
newnode-> next = NULL ;
newnode-> next = ls-> top;
ls-> top = newnode;
ls-> clen++ ;
return 0 ;
}
int IsEmptyLinkStack ( LinkStack* ls)
{
return 0 == ls-> clen;
}
int PopLinkStack ( LinkStack* ls)
{
if ( IsEmptyLinkStack ( ls) )
{
return 1 ;
}
LinkStackNode* tmp = ls-> top;
ls-> top = ls-> top-> next;
free ( tmp) ;
ls-> clen-- ;
return 0 ;
}
DATATYPE* GetTopLinkStack ( LinkStack* ls)
{
if ( IsEmptyLinkStack ( ls) )
{
return NULL ;
}
return & ls-> top-> data;
}
int GetSizeLinkStack ( LinkStack* ls)
{
return ls-> clen;
}
linkstack.h
# ifndef __LINKSTACK_H__
# define __LINKSTACK_H__
typedef struct person
{
char name[ 32 ] ;
char sex;
int age;
int score;
} DATATYPE;
typedef struct stacknode
{
DATATYPE data;
struct stacknode * next;
} LinkStackNode;
typedef struct list
{
LinkStackNode * top;
int clen;
} LinkStack;
LinkStack* CreateLinkStack ( ) ;
int DestroyLinkStack ( LinkStack* ls) ;
int PushLinkStack ( LinkStack* ls, DATATYPE* data) ;
int PopLinkStack ( LinkStack* ls) ;
int IsEmptyLinkStack ( LinkStack* ls) ;
DATATYPE* GetTopLinkStack ( LinkStack* ls) ;
int GetSizeLinkStack ( LinkStack* ls) ;
# endif
队列
SeqQueue.c
# include "SeqQueue.h"
SeqQueue * CreateSeqQueue ( int len)
{
SeqQueue* sq = ( SeqQueue* ) malloc ( sizeof ( SeqQueue) ) ;
if ( NULL == sq)
{
printf ( "CreateSeqQueue malloc\n" ) ;
return NULL ;
}
sq-> ptr = ( DATATYPE* ) malloc ( sizeof ( DATATYPE) * len) ;
if ( NULL == sq-> ptr )
{
printf ( "CreateSeqQueue malloc2\n" ) ;
return NULL ;
}
sq-> tlen = len;
sq-> head = 0 ;
sq-> tail = 0 ;
return sq;
}
int IsEmptySeqQueue ( SeqQueue * queue)
{
return queue-> head == queue-> tail ;
}
int IsFullSeqQueue ( SeqQueue * queue)
{
return ( queue-> tail + 1 ) % queue-> tlen == queue-> head;
}
int QuitSeqQueue ( SeqQueue * queue)
{
if ( IsEmptySeqQueue ( queue) )
{
return 1 ;
}
queue-> head = ( queue-> head+ 1 ) % queue-> tlen;
return 0 ;
}
int EnterSeqQueue ( SeqQueue * queue, DATATYPE * data)
{
if ( IsFullSeqQueue ( queue) )
{
return 1 ;
}
memcpy ( & queue-> ptr[ queue-> tail] , data, sizeof ( DATATYPE) ) ;
queue-> tail = ( queue-> tail + 1 ) % queue-> tlen ;
return 0 ;
}
DATATYPE* GetHeadSeqQueue ( SeqQueue* que)
{
if ( IsEmptySeqQueue ( que) )
{
return NULL ;
}
return & que-> ptr[ que-> head] ;
}
SeqQueue.h
# ifndef __SEQQUEUE_H__
# define __SEQQUEUE_H__
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef int DATATYPE;
typedef struct queue {
DATATYPE * ptr;
int tlen;
int head;
int tail;
} SeqQueue;
SeqQueue * CreateSeqQueue ( int len) ;
int DestroySeqQueue ( SeqQueue * queue) ;
int QuitSeqQueue ( SeqQueue * queue) ;
int EnterSeqQueue ( SeqQueue * queue, DATATYPE * data) ;
int IsEmptySeqQueue ( SeqQueue * queue) ;
int IsFullSeqQueue ( SeqQueue * queue) ;
DATATYPE* GetHeadSeqQueue ( SeqQueue* que) ;
# endif
树
tree.c
# include <stdio.h>
# include <stdlib.h>
typedef char DATATYPE;
typedef struct BiTNode
{
DATATYPE data;
struct BiTNode * lchild, * rchild;
} BiTNode;
char data[ ] = "Ab#df###ceg##h###" ;
int ind = 0 ;
void CreateBiTree ( BiTNode* * root)
{
char c = data[ ind++ ] ;
if ( '#' == c)
{
* root = NULL ;
return ;
}
* root = ( BiTNode* ) malloc ( sizeof ( BiTNode) ) ;
if ( NULL == * root)
{
perror ( "malloc" ) ;
return ;
}
( * root) -> data = c;
CreateBiTree ( & ( ( * root) -> lchild) ) ;
CreateBiTree ( & ( ( * root) -> rchild) ) ;
return ;
}
void DestroyBiTree ( BiTNode * root)
{
if ( NULL == root)
{
return ;
}
DestroyBiTree ( root-> lchild) ;
DestroyBiTree ( root-> rchild) ;
free ( root) ;
}
void PreOrderTraverse ( BiTNode * root)
{
if ( NULL == root)
{
return ;
}
printf ( "%c" , root-> data) ;
PreOrderTraverse ( root-> lchild) ;
PreOrderTraverse ( root-> rchild) ;
}
void InOrderTraverse ( BiTNode * root)
{
if ( NULL == root)
{
return ;
}
InOrderTraverse ( root-> lchild) ;
printf ( "%c" , root-> data) ;
InOrderTraverse ( root-> rchild) ;
}
void PostOrderTraverse ( BiTNode * root)
{
if ( NULL == root)
{
return ;
}
PostOrderTraverse ( root-> lchild) ;
PostOrderTraverse ( root-> rchild) ;
printf ( "%c" , root-> data) ;
}
int main ( int argc, char * * argv)
{
BiTNode* root= NULL ;
CreateBiTree ( & root) ;
PreOrderTraverse ( root) ;
printf ( "\n" ) ;
InOrderTraverse ( root) ;
printf ( "\n" ) ;
PostOrderTraverse ( root) ;
printf ( "\n" ) ;
DestroyBiTree ( root) ;
root = NULL ;
return 0 ;
}
哈希表
hash.c
# include <stdio.h>
# include <stdlib.h>
typedef int DATATYPE;
typedef struct
{
DATATYPE* head;
int tlen;
} HS_TABLE;
HS_TABLE* CreateHsTable ( int len)
{
HS_TABLE* hs = malloc ( sizeof ( HS_TABLE) ) ;
if ( NULL == hs)
{
perror ( "CreateHsTable malloc1" ) ;
return NULL ;
}
hs-> head = malloc ( sizeof ( DATATYPE) * len) ;
if ( NULL == hs-> head)
{
perror ( "CreateHsTable malloc2" ) ;
return NULL ;
}
hs-> tlen = len;
int i = 0 ;
for ( i= 0 ; i< len; i++ )
{
hs-> head[ i] = - 1 ;
}
return hs;
}
int HS_fun ( HS_TABLE* hs, DATATYPE* data)
{
return * data % hs-> tlen;
}
int HS_insert ( HS_TABLE* hs, DATATYPE* data)
{
int ind = HS_fun ( hs, data) ;
while ( hs-> head[ ind] != - 1 )
{
printf ( "values:%d conllision pos:%d\n" , * data, ind) ;
ind = ( ind+ 1 ) % hs-> tlen;
}
hs-> head[ ind] = * data;
return 0 ;
}
int HS_search ( HS_TABLE* hs, DATATYPE* data)
{
int ind = HS_fun ( hs, data) ;
int oldind = ind;
while ( hs-> head[ ind] != * data )
{
ind = ( ind+ 1 ) % hs-> tlen;
if ( oldind == ind)
{
return - 1 ;
}
}
return ind;
}
int main ( int argc, char * * argv)
{
HS_TABLE* hs = CreateHsTable ( 12 ) ;
int data[ 12 ] = { 12 , 67 , 56 , 16 , 25 , 37 , 22 , 29 , 15 , 47 , 48 , 34 } ;
int i = 0 ;
for ( i= 0 ; i< 12 ; i++ )
{
HS_insert ( hs, & data[ i] ) ;
}
int want_int = 44 ;
int ind = HS_search ( hs, & want_int) ;
if ( - 1 == ind)
{
printf ( "cant find %d\n" , want_int) ;
}
else
{
printf ( "find it ,pos %d\n" , ind) ;
}
return 0 ;
}