顺序表
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;
}