这道题目理解题意后,其实不难
#include "stdio.h"
#include "stdlib.h"
typedef struct NODE{
int data;
struct NODE *prior;
struct NODE *next;
} NODE;
int main(void)
{
int n,k ,m,i,num;
int back_ahead;
NODE * begin_1,*begin_2,*out_1,*out_2;
NODE *begin,*list,*goon;
begin=(NODE *)malloc(sizeof(NODE));
begin->data=1;
begin->prior=begin;
begin->next=begin;
if(scanf("%d,%d,%d",&n,&k,&m),(n>=k)&&n&&k&&m){
for (list=begin,i=2; i<=n; list=list->next,i++) {
goon=(NODE *)malloc(sizeof(NODE));
goon->data=i;
goon->next=begin;
goon->prior=list;
list->next=goon;
begin->prior=goon;
}
for (i=1,begin_1=begin; i!=k; i++) {
begin_1=begin_1->next;
}
begin_2=begin_1;
for (num=n; num>1; ) {
for (back_ahead=1; back_ahead!=m; back_ahead++) {
begin_2=begin_2->prior;
begin_1=begin_1->next;
}
out_1=begin_1;
out_2=begin_2;
(begin_1->next==out_2)?(begin_1=begin_1->next->next):(begin_1=begin_1->next);
(begin_2->prior==out_1)?(begin_2=begin_2->prior->prior):(begin_2=begin_2->prior);
if (out_2==out_1) {
printf("%d,",out_1->data);
out_1->prior->next=out_1->next;
out_1->next->prior=out_1->prior;
free(out_1);
num--;
}
else {
printf("%d-%d,",out_1->data,out_2->data);
out_1->prior->next=out_1->next;
out_1->next->prior=out_1->prior;
free(out_1);
out_2->prior->next=out_2->next;
out_2->next->prior=out_2->prior;
free(out_2);
num-=2;
}
}
if (begin_1->data==begin_2->data) {
printf("%d,",begin_1->data);
}
printf("\n");
}
if (!n||!k||!m) {
printf("n,m,k must bigger than 0.\n");
}
if (n<k) {
printf("k should not bigger than n.\n");
}
return 0;
}
但实际编写过程中,Debug RE错误多次
使用链表,关乎指针操作,就用特别注意考虑全面情况
还是那句话,希望得到指点。