//用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序
#include<stdio.h>
#include<iostream>
#include<assert.h>
using namespace std; //new delete-------建议用malloc free,这样就C了
//循环链表,每次删除
struct node{
int value;
node* next;
};
//需要指针的引用,而不是指针的拷贝--------这里其实不需要引用,拷贝就可以
void insert_after(node* &before, int insert_value){
assert(before != NULL);
node* t = new node;
t->value = insert_value;
t->next = before->next;
before->next = t;
}
//从循环链表的任何一个节点开始,遍历一次
void print(node* x){
assert((x != NULL)&&(x->next != NULL));
node* begin = x;
printf("%d ",x->value);
x = x->next;
while(x != begin){
printf("%d ",x->value);
x = x->next;
}
printf("\n");
printf("M==1时,输出完毕\n");
}
int main(){
int N=0, M=0;
printf("Please input N and M:\n");
scanf("%d %d",&N,&M);
//插入值1:N
//没有head--value为空的头
node* begin = new node;
node* first = begin;//备份
begin->value = 1;
begin->next = begin;//循环
for(int i=2; i<=N; i++){
int insert_value = i;
insert_after(begin, insert_value);
begin = begin->next;//begin始终是尾巴
}
//从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序
if(M==1){
print(first);
return 0;
}
node* t = first;
node* x = t;
//printf("%d - ",t->value);
t = t->next; //此时x是t的前一个节点
int n = 1;//已经遍历一个了
int out_n = 0;//输出的节点数目
//只剩一个节点时结束
while(out_n != N){
n++;
//每数到M输出该数值,并删除该节点
if(n%M==0){
printf("%d ",t->value);
out_n++;
//删除
x->next = t->next; //x本身不变
delete(t);
}else{
x = t;
}
t = x->next;
}
printf("\n");
printf("M!=1时,输出完毕");
return 0 ;
}
用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C/C++程序(链表)
最新推荐文章于 2021-05-20 00:03:33 发布