数据结构一:链表(约瑟夫问题)
生活随笔
收集整理的這篇文章主要介紹了
数据结构一:链表(约瑟夫问题)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一:約瑟夫問題
- 約瑟夫問題-循環(huán)鏈表典型應(yīng)用
- 例題:
n 個人圍成一個圓圈,首先第 1 個人從 1 開始一個人一個人順時針報數(shù),報到第 m 個人,令其出列。然后再從下一 個人開始從 1 順時針報數(shù),報到第 m 個人,再令其出列,…,如此下去,求出列順序。 - 假設(shè):
m = 8,n=3
二:代碼
1 main.c
/* main.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "CircleLinkList.h"#define M 8 #define N 3 //創(chuàng)建數(shù)據(jù)結(jié)構(gòu)體 typedef struct MYNUM{CircleLinkNode node;int val; }My_Num; //打印回調(diào) void my_Print(CircleLinkNode*data){My_Num *num=(My_Num*)data;printf("%d ",num->val); } //比較回調(diào) int my_Compare(CircleLinkNode*data1,CircleLinkNode*data2){My_Num *num1=(My_Num*)data1;My_Num *num2=(My_Num*)data2;if(num1->val==num2->val){return CIRCLELINKLIST_TRUE;}else{return CIRCLELINKLIST_FALSE;} } int main(void){ //初始化CircleLinkList *clist=_Init_List();//創(chuàng)建數(shù)據(jù)My_Num num[M];for(int i=0;i<M;i++){num[i].val=i+1;_Insert_List(clist,i,(CircleLinkNode*)&num[i]);//插入}//打印_Print_List(clist,my_Print);printf("\n ");int index=1;CircleLinkNode* Current_Node=clist->head.next;//輔助指針 while(_Size_List(clist)>1){//有三個就輸出if(index==N){//_Print_List(clist,my_Print);My_Num *num=(My_Num*)Current_Node;printf("%d ",num->val);//將其釋放//按照值刪除CircleLinkNode* Current_Next=Current_Node->next;//緩存下一結(jié)點 _DeleteByValue_List(clist,Current_Node,my_Compare); Current_Node= Current_Next;//循環(huán)到頭結(jié)點就跳過if(Current_Node==&(clist->head)){Current_Node=Current_Node->next;} index=1;} Current_Node=Current_Node->next;//循環(huán)到頭結(jié)點就跳過if(Current_Node==&(clist->head)){Current_Node=Current_Node->next;} index++;}if(_Size_List(clist)==1){My_Num *num=(My_Num*)_Front_List(clist);printf("%d ",num->val);}else{printf("error!");}printf("\n");//釋放內(nèi)存_Free_List(clist);return 0; }2 CircleLinkList.h
/* CircleLinkList.h 實現(xiàn)機(jī)制為linux鏈表(企業(yè)鏈表) */ #ifndef _CIRCLELINKLIST_H_ #define _CIRCLELINKLIST_H_ #include <stdio.h> #include <stdlib.h>#define CIRCLELINKLIST_TRUE 1 #define CIRCLELINKLIST_FALSE 0//創(chuàng)建小節(jié)點 typedef struct CIRCLELINKNODE{struct CIRCLELINKNODE *next; }CircleLinkNode; //鏈表 typedef struct CIRCLELINKLIST{CircleLinkNode head;//head頭結(jié)點,是結(jié)構(gòu)體 int size;//鏈表數(shù)據(jù)個數(shù) }CircleLinkList; //值刪除回調(diào)函數(shù) typedef int (*COMPARE)(CircleLinkNode *data1,CircleLinkNode *data2); //打印回調(diào)函數(shù) typedef void (*PRINT)(CircleLinkNode *data);//初始化 CircleLinkList *_Init_List(); //插入 void _Insert_List(CircleLinkList *clist,int pos,CircleLinkNode *data); //按照位置刪除 void _DeleteByPos_List(CircleLinkList *clist,int pos); //按照值刪除 void _DeleteByValue_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare); //返回第一個數(shù)據(jù) CircleLinkNode *_Front_List(CircleLinkList *clist); //獲得鏈表長度 int _Size_List(CircleLinkList *clist); //打印 void _Print_List(CircleLinkList *clist,PRINT my_Print); //查找 int _Find_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare); //釋放內(nèi)存 void _Free_List(CircleLinkList *clist); #endif3 CircleLinkList.c
/* CircleLinkList.c */ #include "CircleLinkList.h"//初始化 CircleLinkList *_Init_List(){CircleLinkList *clist=(CircleLinkList *)malloc(sizeof(CircleLinkList));clist->head.next=&(clist->head);clist->size=0;return clist; } //插入 void _Insert_List(CircleLinkList *clist,int pos,CircleLinkNode *data){if(clist==NULL){return ;}if(pos<0||pos>clist->size){pos=clist->size;//默認(rèn)往尾部插 }CircleLinkNode *pCurrent=&(clist->head);for(int i=0;i<pos;i++){//尋找前一結(jié)點 pCurrent=pCurrent->next; }//插入數(shù)據(jù)data->next=pCurrent->next;pCurrent->next=data;clist->size++; }//打印 void _Print_List(CircleLinkList *clist,PRINT my_Print){if(clist==NULL){return ;}CircleLinkNode *pCurrent=(clist->head.next);for(int i=0;i<clist->size;i++){if(pCurrent==&(clist->head)){//如果打印多次,跳過頭指針 pCurrent=pCurrent->next; }//打印my_Print(pCurrent);pCurrent=pCurrent->next; } } //按照位置刪除 void _DeleteByPos_List(CircleLinkList *clist,int pos){if(clist==NULL){return ;}if(pos<0||pos>=clist->size){return ;}CircleLinkNode *pCurrent=&(clist->head);for(int i=0;i<pos;i++){//尋找前一結(jié)點 pCurrent=pCurrent->next; }//將這個要刪除結(jié)點緩存CircleLinkNode *DelNode= pCurrent->next;pCurrent->next=DelNode->next;//釋放刪除結(jié)點空間,/*if(DelNode!=NULL){free(DelNode);DelNode=NULL;} */clist->size--; } //按照值刪除 void _DeleteByValue_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare){if(clist==NULL){return ;}if(data==NULL){return ;}CircleLinkNode *PreCurrent= &(clist->head);//數(shù)據(jù)的前一個 CircleLinkNode *pCurrent=PreCurrent->next;//查找到相對應(yīng)的數(shù)據(jù) for(int i=0;i<clist->size;i++){if(my_Compare(pCurrent,data)==CIRCLELINKLIST_TRUE){//匹配成功 PreCurrent->next=pCurrent->next;clist->size--;break;}//沒有匹配到//PreCurrent->next= pCurrent;//pCurrent->next=PreCurrent->next; PreCurrent=pCurrent;pCurrent=PreCurrent->next;}} //返回第一個數(shù)據(jù) CircleLinkNode *_Front_List(CircleLinkList *clist){return clist->head.next; } //獲得鏈表長度 int _Size_List(CircleLinkList *clist){return clist->size; } //查找 int _Find_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare){if(clist==NULL){return -1;}if(data==NULL){return -1;}CircleLinkNode *pCurrent=(clist->head.next);int pos=-1;for(int i=0;i<clist->size;i++){if(my_Compare(pCurrent,data)==CIRCLELINKLIST_TRUE){//找到了 pos=i;break;}pCurrent=pCurrent->next;}return pos; } //釋放內(nèi)存 void _Free_List(CircleLinkList *clist){if(clist!=NULL){free(clist);clist=NULL;} }3:結(jié)果顯示
1.編譯環(huán)境
centos 3.10.0-862.el7.x86_64 gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)2.編譯命令
gcc main.c CircleLinkList.c -std=c99./a.out3.結(jié)果
1 2 3 4 5 6 7 83 6 1 5 2 8 4 7總結(jié)
以上是生活随笔為你收集整理的数据结构一:链表(约瑟夫问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构一:链表(循环链表)
- 下一篇: 数据结构二:栈