/* * @Author: your name * @Date: 2021-06-20 17:11:37 * @LastEditTime: 2021-06-20 19:21:51 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \slist\slist.c */ #include "loop_list.h" #include "stdlib.h" #include "stdio.h" pkt_node_t pkt_creat_joseph(void) { pkt_node_t p, r, h; p = (pkt_node_t)malloc(sizeof(struct pkt_node)); p->next = p; p->data = 1; h = p; int n, i; loop: printf("input a number:"); scanf("%d", &n); if (n < 0) { printf("input error < 0\n"); goto loop; } r = h; for (i = 2; i <= n; i++) { p = (pkt_node_t)malloc(sizeof(struct pkt_node)); p->data = i; r->next = p; r = p; /* r ponit list tail */ } p->next = h; /* tail node ponit head node */ return h; } int pkt_show_list(pkt_node_t l) { pkt_node_t p = l; int i = 0; while (p->next != l) { printf("l[%d] = %d\n", i, p->data); p = p->next; i++; } printf("l[%d] = %d\n", i, p->data); return 0; } int pkt_joseph(pkt_node_t l, int k, int m) { PKT_ASSERT(l); pkt_node_t p = l; while (p->next->data != k) { p = p->next; /* find k node prev node*/ } printf("l[k] = %d\n", p->next->data); pkt_node_t r = p; pkt_node_t q; int i; while (r->next != r) { for (i = 0; i < m - 1; i++) /* find next del node prev node */ { r = r->next; } q = r->next; /* save delete node to q */ r->next = q->next; printf("del = %d\n", q->data); free(q); } printf("del = %d\n", r->data); /* last node */ free(r); return 0; } int main(int argc, char **argv) { pkt_node_t list; list = pkt_creat_joseph(); pkt_show_list(list); pkt_joseph(list, 3, 4); return 0; }