循环链表——跳海问题

题目:因为轮船要沉没,需要船员跳海保护轮船,船员围坐一圈,首先指出从第几号开始,顺序数七个人,被数到的人跳海,循环直到只剩一人。

思路:用循环链表。

结构体:

struct linklist{
    int data;
    struct linklist *next;
};    
typedef struct linklist * linknode;

创建循环链表:

linknode sub,temp;

linknode creat(int n){
    linknode L=new linklist;
    linknode last=L;
    L->next=NULL;
    for(int i=0;i<n;i++){
        linknode p=new linklist;
        p->data=i+1;
        last->next=p;
        last=p;
    }
    last->next=L->next;
    return L->next;
}

注意这道题目不能含有头指针,从第一个有效节点开始,其数据域为1!

选出跳海的人:

int left(linknode &S,int r,int n){
    linknode temp=S,q;
    for(int i=0;i<r-1;i++)
    temp=temp->next;  //从第r个开始
    while(n>1){
        for(int j=0;j<5;j++)       //删除从他之后第七个,先找到从他之后第六个
            temp=temp->next;
        q=temp->next;           
        temp->next=q->next;
        delete q;
        temp=temp->next;   
        n--;             
}
return temp->data;
}

主函数:

int main(){
linknode test=creat(4);
int theOne=left(test,1,4);
int a=theOne;
cout<<a<<endl;
}

 

posted @ 2016-09-11 19:24  zym233  阅读(239)  评论(0编辑  收藏  举报