【C++】【六】约瑟夫问题
生活随笔
收集整理的這篇文章主要介紹了
【C++】【六】约瑟夫问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
核心代碼:
int index = 1;clinknode* pcur = list->head.next;while (Size_circlelinkist(list)>1){if (index == N) {mynum* temnum = (mynum*)pcur;printf("%d ", temnum->val);clinknode* pnext = pcur->next;RemoveByValue_circlelinkist(list, pcur, mycompare);pcur = pnext;if (pcur == &(list->head)) {pcur = pcur->next;}index = 1;}pcur = pcur->next;if (pcur == &(list->head)) {pcur = pcur->next;}index++;}if (Size_circlelinkist(list) == 1) {mynum* temp = (mynum*)Front_circlelinkist(list);printf("%d ", temp->val);}else {printf("occur error!\n");}
全部調(diào)用代碼:?
main.cc
#define _CRT_SECURE_NO_WARNINGS#include <iostream>
#include <stdlib.h>
#include <string.h>
#include "circlelinklist.h"#define M 8
constexpr auto N = 3;typedef struct MYNUM {circlelinkist node;int val;
}mynum;void MYPRINT(clinknode* data) {mynum* num = (mynum*)data;printf("%d ", num->val);
}int mycompare(clinknode* data1, clinknode* data2) {mynum* num1 = (mynum*)data1;mynum* num2 = (mynum*)data2;if (num1->val == num2->val) {return 1;}return 0;
}
int main()
{circlelinkist* list = Init_circlelinkist();mynum num[M];for (int i = 0; i < M; ++i) {num[i].val = i + 1;Insert_circlelinkist(list, i,(clinknode*)&num[i]);}Print_circlelinkist(list, MYPRINT);printf("\n");//yuesefu work space printf("==================\n");int index = 1;clinknode* pcur = list->head.next;while (Size_circlelinkist(list)>1){if (index == N) {mynum* temnum = (mynum*)pcur;printf("%d ", temnum->val);clinknode* pnext = pcur->next;RemoveByValue_circlelinkist(list, pcur, mycompare);pcur = pnext;if (pcur == &(list->head)) {pcur = pcur->next;}index = 1;}pcur = pcur->next;if (pcur == &(list->head)) {pcur = pcur->next;}index++;}if (Size_circlelinkist(list) == 1) {mynum* temp = (mynum*)Front_circlelinkist(list);printf("%d ", temp->val);}else {printf("occur error!\n");}printf("\n");printf("==================\n");Free_circlelinkist(list);system("pause");return 0;
}
cieclrlinklist.h
#ifndef CIRCLELINKLIST
#define CIRCLELINKLISTtypedef struct clinknode {struct clinknode* next;
}clinknode;typedef struct circlelinkist {clinknode head;int size;
}circlelinkist;typedef int(*COMPARE)(clinknode*, clinknode*);typedef void(*PRINTNODE)(clinknode*);circlelinkist* Init_circlelinkist();void Insert_circlelinkist(circlelinkist* clist, int pos, clinknode* data);clinknode* Front_circlelinkist(circlelinkist* clist); void RemoveByPos_circlelinkist(circlelinkist* clist, int pos);void RemoveByValue_circlelinkist(circlelinkist* clist, clinknode* data, COMPARE compare);int Size_circlelinkist(circlelinkist* clist);int Find_circlelinkist(circlelinkist* clist, clinknode* data, COMPARE compare);void Print_circlelinkist(circlelinkist* clist, PRINTNODE print); void Free_circlelinkist(circlelinkist* clist);//typedef struct PERSON {
// clinknode node;
// char name[64];
// int age;
//}person;
//
//
//void myprint(clinknode* data) {
// person* p = (person*)data;
// printf("name:%s, age:%d \n", p->name, p->age);
//}
//
//int mycompare(clinknode* data1, clinknode* data2) {
// person* p1 = (person*)data1;
// person* p2 = (person*)data2;
//
// if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age) {
// return CIRCLELINKLIST_TRUE;
// }
// return CIRCLELINKLIST_FALSE;
//}#endif // !CIRCLELINKLIST
cieclrlinklist.cc
#include <iostream>
#include <stdlib.h>
#include "circlelinklist.h"#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0circlelinkist* Init_circlelinkist() {circlelinkist* clist = (circlelinkist*)malloc(sizeof(circlelinkist));clist->head.next = &(clist->head);clist->size = 0;return clist;
}void Insert_circlelinkist(circlelinkist* clist, int pos, clinknode* data) {if (clist == NULL) {return;}if (data == NULL) {return;}if (pos<0 || pos>clist->size) {pos = clist->size;}//輔助指針變量clinknode* pcur = &(clist->head);for (int i = 0; i < pos; ++i) {pcur = pcur->next;}data->next = pcur->next;pcur->next = data;clist->size++;
}clinknode* Front_circlelinkist(circlelinkist* clist) {return clist->head.next;
}void RemoveByPos_circlelinkist(circlelinkist* clist, int pos) {if (clist == NULL) {return;}if (pos < 0 || pos >= clist->size) {return;}clinknode* pcur = &(clist->head);for (int i = 0; i < pos; ++i) {pcur = pcur->next;}clinknode* pnext = pcur->next;pcur->next = pnext->next;clist->size--;
}void RemoveByValue_circlelinkist(circlelinkist* clist, clinknode* data, COMPARE compare) {if (clist == NULL) {return;}if (data == NULL) {return;}clinknode* pper = &(clist->head);clinknode* pcur = &(clist->head);for (int i = 0; i < clist->size; ++i) {if (compare(pcur, data) == CIRCLELINKLIST_TRUE) {pper->next = pcur->next;break;}pper = pcur;pcur = pcur->next;}clist->size--;
}int Size_circlelinkist(circlelinkist* clist) {if (clist->size == 0) {return CIRCLELINKLIST_TRUE;}return clist->size;
}int IsEmpty_circlelinkist(circlelinkist* clist) {if (clist->size == 0) {return CIRCLELINKLIST_TRUE;}return CIRCLELINKLIST_FALSE;
}int Find_circlelinkist(circlelinkist* clist, clinknode* data, COMPARE compare) {if (clist == NULL) {return CIRCLELINKLIST_FALSE;}if (data == NULL) {return CIRCLELINKLIST_FALSE;}clinknode* pcur = clist->head.next;int flag = -1;for (int i = 0; i < clist->size; ++i) {if (compare(pcur, data) == CIRCLELINKLIST_TRUE) {flag = i;break;}pcur = pcur->next;}return flag;
}void Print_circlelinkist(circlelinkist* clist, PRINTNODE print) {if (clist == NULL) {return;}clinknode* pcur = clist->head.next;//for (int i = 0; i < clist->size * 3; ++i)for (int i = 0; i < clist->size; ++i) {/* if (pcur == &(clist->head)) {pcur = pcur->next;printf("========================\n");}*/print(pcur);pcur = pcur->next;}
}void Free_circlelinkist(circlelinkist* clist) {if (clist == NULL) {return;}
}//typedef struct PERSON {
// clinknode node;
// char name[64];
// int age;
//}person;//void myprint(clinknode* data) {
// person* p = (person*)data;
// printf("name:%s, age:%d \n", p->name, p->age);
//}
//
//int mycompare(clinknode* data1, clinknode* data2) {
// person* p1 = (person*)data1;
// person* p2 = (person*)data2;
//
// if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age) {
// return CIRCLELINKLIST_TRUE;
// }
// return CIRCLELINKLIST_FALSE;
//}
?
總結(jié)
以上是生活随笔為你收集整理的【C++】【六】约瑟夫问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】【五】循环链表
- 下一篇: 哈利波特魔法觉醒卡牌怎么升级?