数组循环删除

转自:http://blog.csdn.net/laibinghua/article/details/5905670

有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。 
7个数为例: 
{0,1,2,3,4,5,6,7} 0-->1-->2
(删除)-->3-->4-->5(删除)-->6-->7-->0(删除),如此循环直到最后一个数被删除。 
方法1:数组 
#include <iostream> 
using namespace std; 
#define null 1000 

int main() 

int arr[1000]; 
for (int i=0;i<1000;++i) 
arr[i]=i; 
int j=0; 
int count=0; 
while(count<999) 

while(arr[j%1000]==null) 
j=(++j)%1000; 
j=(++j)%1000; 
while(arr[j%1000]==null) 
j=(++j)%1000; 
j=(++j)%1000; 
while(arr[j%1000]==null) 
j=(++j)%1000; 
arr[j]=null; 
++count; 

while(arr[j]==null) 
j=(++j)%1000; 

cout<<j<<endl; 
return 0; 
}
方法2:链表 
#include<iostream> 
using namespace std; 
#define null 0 
struct node 

int data; 
node* next; 
}; 
int main() 

node* head=new node; 
head->data=0; 
head->next=null; 
node* p=head; 
for(int i=1;i<1000;i++) 

node* tmp=new node; 
tmp->data=i; 
tmp->next=null; 
head->next=tmp; 
head=head->next; 

head->next=p; 
while(p!=p->next) 

p->next->next=p->next->next->next; 
p=p->next->next; 

cout<<p->data; 
return 0; 

方法3:通用算法 
#include <stdio.h> 
#define MAXLINE 1000 //
元素个数 
/* 
MAXLINE 
元素个数 
a[] 
元素数组 
R[] 
指针场 
suffix 
下标 
index 
返回最后的下标序号 
values 
返回最后的下标对应的值 
start 
从第几个开始 
间隔 
*/ 
int find_n(int a[],int R[],int K,int& index,int& values,int s=0) { 
int suffix; 
int front_node,current_node; 
suffix=0; 
if(s==0) { 
current_node=0; 
front_node=MAXLINE-1; 

else { 
current_node=s; 
front_node=s-1; 

while(R[front_node]!=front_node) { 
printf("%d/n",a[current_node]); 
R[front_node]=R[current_node]; 
if(K==1) { 
current_node=R[front_node]; 
continue; 

for(int i=0;i<K;i++){ 
front_node=R[front_node]; 

current_node=R[front_node]; 

index=front_node; 
values=a[front_node]; 

return 0; 

int main(void) { 
int a[MAXLINE],R[MAXLINE],suffix,index,values,start,i,K; 
suffix=index=values=start=0; 
K=2; 

for(i=0;i<MAXLINE;i++) { 
a[i]=i; 
R[i]=i+1; 

R[i-1]=0; 
find_n(a,R,K,index,values,2); 
printf("the value is %d,%d/n",index,values); 
return 0; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值