有一个单向循环链表队列,从头开始报数,当报到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 }