#include
#include
/*结构体*/
struct node
{
int num,secret;
struct node *next;
};
/*建造循环链表,并返回头指针*/
node *creatlinklist(int m)
{
node *head,*p,*q;
head=p=(node *)malloc(sizeof(node));
int j;
printf("输入第1个密码:");
scanf("%d",&j);
p->secret=j;
p->num=1;
for(int i=2;isecret=j;
q->num=i;
p->next=q;
p=q;
};
p->next=head;
return(head);
};
/*按规则实现排列*/
/*第一种方法 找到一个打印一个*/
/*void fun(node *H,int K,int M)
{
int i,j;
node *p;
for(j=1;jnext->secret;
printf("%dt",p->next->num);
p->next=p->next->next;
H=p->next;
};
for(i=1,p=H;inext);
printf("%dt",p->num);
printf("%dt",p->next->num);
printf("n");
};*/
/*第二种方法 把循环链表按规则变成单链表*/
void fun(node *H,int K,int M)
{
node *p,*q,*nhead;
int i,e;
/*按规则找到第一个节点,并将其作为新链表头结点nhead ,尾节点q*/
for(i=1,p=H;inext);
nhead=q=p->next;
K=q->secret;
p->next=p->next->next;
/*按规则找到剩下的节点并用尾插法连到新链表尾节点后*/
for(e=1;enext;inext);
K=p->next->secret;
q->next=p->next;
q=p->next;
p->next=p->next->next;
};
for(i=1,p=p->next;inext);
q->next=p;
/*输出序列*/
printf("输出密码序列:n");
for(p=nhead,i=1;inext)
{
int j=p->secret;
printf("%dt",j);
};
printf("n输出顺序序列:n");
for(p=nhead,i=1;inext)
{
int j=p->num;
printf("%dt",j);
};
printf("n");
};
/*主程序*/
void main()
{
int n,k;
node *h;
printf("输入节点数n:");
scanf("%d",&n);
printf("输入k值:");
scanf("%d",&k);
h=creatlinklist(n);
fun(h,k,n);
}