当前位置: 首页 > article >正文

7种数据结构

7种数据结构

  • 顺序表
    • sqlite.h
    • seqlite.c
  • 单链表
    • linklist.c
    • linklist.h
  • 双链表
    • doulinklist.c
    • doulinklist.h
  • 链式栈
    • linkstack.c
    • linkstack.h
  • 队列
    • SeqQueue.c
    • SeqQueue.h
    • tree.c
  • 哈希表
    • hash.c

顺序表

sqlite.h

#ifndef __SEQLIST_H__
#define __SEQLIST_H__  typedef struct	person {char name[32];char sex;int age;int score;
}DATATYPE;
// typedef int DATAYPE;
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;}//strcpymemcpy(&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;}//list->head[i] = *newdata;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)) // empty{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; // i++}return 0;
}// LinkNode *FindLinkList(LinkList *list, char *name)
LinkNode *FindLinkList(LinkList *list, PFUN fun, void *arg) {LinkNode *tmp = list->head;while (tmp) {// if(0==strcmp(tmp->data.name,name))if (fun(&tmp->data, arg)) {return tmp;}tmp = tmp->next; // i++}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; // 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) // len 4{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; // pfast = pfast->next->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;// if (NULL==pfast)// {//   break;// }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) // head insert{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 int u32;
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, char *name);
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  // /__LINKLIST_H__/ !

双链表

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;
}
/*func:param:retval:
*/
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 // mid del{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;// 和单向链表中的head,一个意思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  // /__LINKLIST_H__/ !

队列

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;//system("pause");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;
}

相关文章:

7种数据结构

7种数据结构 顺序表sqlite.hseqlite.c 单链表linklist.clinklist.h 双链表doulinklist.cdoulinklist.h 链式栈linkstack.clinkstack.h 队列SeqQueue.cSeqQueue.h 树tree.c 哈希表hash.c 顺序表 sqlite.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ typedef struct person…...

Redis的消息队列是怎么实现的

Redis 本身并不是一个专门的消息队列系统,但它的 List、Pub/Sub 和 Stream 数据结构可以用来实现消息队列的功能。以下是 Redis 实现消息队列的几种常见方式: 1. 基于 List 实现消息队列 Redis 的 List 是一个双向链表,支持在头部和尾部进行高效的插入和删除操作,非常适合…...

3.17BUUCTF练习day1

BUUCTF练习day1 [极客大挑战 2019]EasySQL1&#xff08;字符型&#xff0c;账号密码型&#xff0c;get型&#xff09; 判断闭合方式 在用户名输入1‘&#xff0c;此时密码先输入任何数字时&#xff0c;出现语法错误 说明闭合方式为单引号闭合&#xff0c;在判断完闭合方式后…...

【贪心算法】柠檬水找零

1.题目解析 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 分情况讨论 5---》直接收下 10---》找五元&#xff0c;收下 20----》105△ ----》555 由于5元更有用&#xff0c;则尽可能保留5元 3.代码 class Solution {public boolean lemonadeCh…...

黑马跟学.苍穹外卖.Day08

黑马跟学.苍穹外卖.Day08 苍穹外卖-day8课程内容1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码导入1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 1.4 代码提交 2. Ap…...

ABAP语言的动态编程(4) - 综合案例:管理费用明细表

本篇来实现一个综合案例&#xff1a;管理费用明细表。报表在实际项目中&#xff0c;也有一定的参考意义&#xff0c;一方面展示类似的报表&#xff0c;比如管理费用、研发费用等费用的明细&#xff0c;使用业务比较习惯的展示格式&#xff1b;另一方面正好综合运用前面学习的动…...

通过Geopandas进行地理空间数据可视化

目录 引言 安装与导入 数据加载与探索 数据预处理 基本地图可视化 添加其他数据到地图上 空间分析与查询 地图叠加与分组 空间缓冲区 交互式地图可视化 实际应用案例 城市规划 环境监测 结论 引言 在数据科学领域,地理空间数据可视化扮演着至关重要的角色。它不…...

【大语言模型_5】xinference部署embedding模型和rerank模型

一、安装xinference pip install xinference 二、启动xinference ./xinference-local --host0.0.0.0 --port5544 三、注册本地模型 1、注册embedding模型 curl -X POST "http://localhost:5544/v1/models" \ -H "Content-Type: application/json" \…...

CSS3学习教程,从入门到精通,CSS3 选择器权重问题语法知识点及案例代码(5)

CSS3 选择器权重问题语法知识点及案例代码 一、选择器权重概述 在 CSS 中&#xff0c;当多个选择器同时匹配同一个元素时&#xff0c;浏览器会根据选择器的权重来决定哪个样式生效。权重高的选择器的样式会覆盖权重低的选择器的样式。 二、选择器权重计算规则 1. 内联样式&…...

在Vue3中使用Echarts的示例

1.常用-引用ts文件方式 1.1 导出ts文件-一个简单的柱状图 export const baseBarChart (xdata: string[], data: number[][], legendData: string[]) > {if (data.length 0) {return noData;}// 定义颜色数组const color [#00CCCC,#FF9900,#1677DC,#FF6666,#B366FF,#666…...

Three.js 阴影 (Shadow) 知识点整理

阴影主要由 castShadow 和 receiveShadow 控制&#xff0c;并通过不同类型的光源 (DirectionalLight、SpotLight、PointLight) 生成。我们将系统地整理与阴影相关的知识点。 1️⃣ 基础概念 castShadow &#x1f3ad;&#xff1a;物体是否投射阴影。receiveShadow &#x1f3d…...

GHCTF web方向题解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…...

Logic-RL:小参数qwen模型复现DeepSeek R1 zero

最近很多参照DeepSeek模型训练推理模型的工作,本文将深入 “Logic-RL: Unleashing LLM Reasoning with Rule-Based Reinforcement Learning” 的论文,该论文提出了一种Rule-Based Reinforcement Learning, Logic-RL框架,旨在提升 LLM 的逻辑推理能力,在qwen2.5-7b-instruct…...

CVE-2017-5645(使用 docker 搭建)

介绍: 是一个与 Apache Log4j2 相关的安全漏洞,属于远程代码执行,它可能允许攻击者通过构造恶意的日志信息 在目标系统上执行任意代码 Log4j2 介绍 Log4j2 是 Apache 的一个日志记录工具,属于 Java 应用的日志框架,它是 Log4j 的升级版,性能更好,功能更多.它被广泛的适用于 J…...

conda install 和 pip install 的区别

conda install 和 pip install 是两个常用的包安装命令&#xff0c;但它们在很多方面存在差异。 1. 所属管理系统不同 1.1 conda install conda install 是Anaconda和Miniconda发行版自带的包管理工具 conda 的安装命令。conda 是一个跨平台的开源包管理系统和环境管理系统&…...

蓝桥杯备考:特殊01背包问题——》集合subset

我们划分成两个集合&#xff0c;实际上我们只需要看一部分就行了&#xff0c;也就是从集合的所有元素里挑出恰好满足集合总和的一半儿&#xff0c;当然&#xff0c;如果我们的集合总和是奇数的话&#xff0c;我们是无论如何也挑不出刚好一半儿的&#xff0c;因为我们没有小数&a…...

设计模式之外观模式:原理、实现与应用

引言 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过提供一个统一的接口来简化复杂系统的使用。外观模式隐藏了系统的复杂性&#xff0c;使得客户端可以通过一个简单的接口与系统交互。本文将深入探讨外观模式的原理、实现方式以及实…...

C#设计模式Demo——MVC

设计模式Demo——MVC 1.View1.1页面示例1.2View代码1.3修改界面以及代码 2.Model3.Controller4.数据结构5.枚举类型6.工具类6.1缓存信息6.2扩展类. 文件结构图 1.View 1.1页面示例 1.2View代码 using System; using System.Data; using System.Windows.Forms; using MVC模式…...

【sql靶场】第18-22关-htpp头部注入保姆级教程

目录 【sql靶场】第18-22关-htpp头部注入保姆级教程 1.回顾知识 1.http头部 2.报错注入 2.第十八关 1.尝试 2.爆出数据库名 3.爆出表名 4.爆出字段 5.爆出账号密码 3.第十九关 4.第二十关 5.第二十一关 6.第二十二关 【sql靶场】第18-22关-htpp头部注入保姆级教程…...

LabVIEW棉花穴播器排种自动监测系统

一、项目背景与行业痛点 1. 农业需求驱动 我国棉花主产区&#xff0c;种植面积常年超250万公顷&#xff0c;传统人工播种存在两大核心问题&#xff1a; 效率瓶颈&#xff1a;人均日播种面积不足0.5公顷&#xff0c;难以匹配规模化种植需求&#xff1b; 精度缺陷&#xff1a;人…...

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层&#xff1a;调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…...

golang开发支持onlyoffice的token功能

一直都没去弄token这块&#xff0c;想着反正docker run的时候将jwt置为false即可。 看了好多文章&#xff0c;感觉可以试试&#xff0c;但是所有文件几乎都没说思路。 根据我的理解和成功的调试&#xff0c;思路是&#xff1a; 我们先定义2个概念&#xff0c;一个是文档下载…...

Qt for WebAssembly程序中文乱码问题处理过程

一、环境 操作系统DeepinV23 Qt版本6.8.2 编程语言C 二、问题现象 Qt for WebAssembly应用在浏览器页面上英文字母显示正常&#xff0c;中文显示为乱码。 经测试分析原因为默认字体不能正常显示汉字。 三、处理过程 1.准备中文字体文件 从Windows下复制宋体简体字体文件…...

速通大厂测开

最近26届暑期实习招聘和25届春招已经开始&#xff0c;测开学习圈也有同学拿到offer了 今天分享一位25届秋招圈友快速拿到大厂测开offer的经历&#xff0c;希望对大家有所帮助 我是某211本科生&#xff0c;在去年暑假准备考研的间隙意外收获了某大厂测开实习offer&#xff0c;…...

基于Netty实现高性能HTTP反向代理

以下将分步骤实现一个基于Netty的高性能HTTP反向代理&#xff0c;支持动态路由、负载均衡和基础鉴权功能。 1. 项目依赖配置&#xff08;Maven&#xff09; 2. 定义路由规则 3. 实现HTTP反向代理服务端 4. 实现反向代理处理器 5. 实现基础鉴权 6. 性能优化策略 连接池管理…...

Spring Boot集成MyBatis与MySQL

Spring Boot集成MyBatis与MySQL开发全攻略 一、前言&#xff1a;现代Java持久层开发的选择 在微服务架构盛行的今天&#xff0c;Spring Boot以其"约定优于配置"的理念成为Java开发的事实标准。结合MyBatis这一灵活高效的ORM框架和MySQL这一成熟稳定的关系型数据库&…...

【NLP 37、实践 ⑨ NER 命名实体识别任务 LSTM + CRF 实现】

难过的事情我要反复咀嚼&#xff0c;嚼到它再也不能困扰我半分 —— 25.3.13 数据文件&#xff1a; 通过网盘分享的文件&#xff1a;Ner命名实体识别任务 链接: https://pan.baidu.com/s/1fUiin2um4PCS5i91V9dJFA?pwdyc6u 提取码: yc6u --来自百度网盘超级会员v3的分享 一、配…...

再学:函数可见性、特殊函数、修饰符

目录 1.可见性 2.合约特殊函数 constructor && getter 3. receive && fallback 4.view && pure 5.payable 6.自定义函数修饰符 modifier 1.可见性 public&#xff1a;内外部 private&#xff1a;内部 external&#xff1a;外部访问 internal&…...

基于Spring Boot的项目申报系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)

Axure是一款非常强大的原型设计工具&#xff0c;它允许设计师和开发者快速创建高保真原型&#xff0c;以展示应用或网站的设计和功能。通过引入各种元件库&#xff0c;如ElementUI元件库&#xff0c;可以极大地丰富Axure的原型设计能力&#xff0c;使其更加贴近实际开发中的UI组…...