单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列

有一个单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列,根据出列的先后顺序重新组成单向循环链表。

函数原型: void reorder(Node **head , int m)

//没有将要出列的元素重新组织成循环列表,只将按顺序出列的元素依次打印出来,有待完善

 1 // 单向循环链表队列 报数出列.cpp 
 2 //没有将要出列的元素重新组织成循环列表,只将按顺序出列的元素依次打印出来,有待完善
 3 #include "stdafx.h"
 4 #include <stdlib.h>
 5 
 6 typedef struct node
 7 {
 8     int data;
 9     struct node *next;
10 }node,*listqueue;
11 
12 void creatlist(listqueue &L,int num)//新建一个单链表,元素的值从1到num,head->date=1
13 { 
14     L=(listqueue)malloc(sizeof(listqueue));
15     L->data=1;
16     L->next=L;
17     listqueue p,q=L;
18     for(int i = 2;i<=num;i++) 
19     {
20         p = (listqueue)malloc(sizeof(listqueue));
21         p->data = i;
22         p->next=L;
23         q->next=p;
24         q=p;
25     }
26 }
27 
28 void CountoffRing(listqueue head,int m)
29 {
30     listqueue pPrev,pCurr;
31     pPrev=pCurr=head;
32     int i=1;
33     while(pCurr!=NULL)
34     {
35         if(i==m)//i初始为1,每次打印出第m个元素后,将该结点踢出,再将i=1,进行循环
36         {
37             printf("%3d",pCurr->data);//打印出列的元素
38             pPrev->next=pCurr->next;
39             pCurr=pPrev->next;
40             i=1;
41         }
42         pPrev=pCurr;
43         pCurr=pPrev->next;
44         i++;
45         if(pPrev==pCurr)//最后一个
46         {
47             printf("%4d",pCurr->data);
48             break;
49         }
50     }
51 }
52 
53 void main()
54 {
55     listqueue head;
56     creatlist(head,10);//创建数据从1到10的循环链表,head->data=1;
57     CountoffRing(head,3);
58 }
原文地址:https://www.cnblogs.com/xingele0917/p/2712280.html