题目:
有一个单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列,根据出列的先后顺序重新组成单向循环链表。
函数原型: void reorder(Node **head , int m) ;
编程实现:
#include
#include
typedef struct node
{
int data;
struct node *next;
}node,*listqueue;
void createlist(listqueue &L,int num)
{
L=(listqueue)malloc(sizeof(listqueue));
L->data=1;
L->next=L;
listqueue p,q=L;
for(int i=2;i<=num;i++)
{
p=(listqueue)malloc(sizeof(listqueue));
p->data=i;
p->next=L;
q->next=p;
q=p;
}
}
void reorder(node **head,int m)
{
listqueue pPrev,pCurr;
pPrev=pCurr=*head;
int i=1;
while(pCurr!=NULL)
{
if(i==m)
{
printf("%3d",pCurr->data);
pPrev->next=pCurr->next;
pCurr=pPrev->next;
i=1;
}
pPrev=pCurr;
pCurr=pPrev->next;
i++;
if(pPrev==pCurr)
{
printf("%4d\n",pCurr->data);
break;
}
}
}
void main()
{
listqueue head;
createlist(head,10);//创建数据从1到10的循环链表,head->data=1;
reorder(&head,3);
}