链式存储基础及应用(约瑟夫问题)

单链表的下标访问

请编写程序输出单链表中对应于下标i到下标j之间的数据。
【输入】
第一行整数n(1<=n)
第二行 n个整数
第三行 i的值 j的值(i和j为合法下标,j >= i)
【输出】下标i到j之间的数值
例如:
【输入】

5
3 6 9 10 1
0 2

【输出】

3 6 9

#include <iostream>
#include <cstdio>
using namespace std;
struct node{
    int entry;
    node* next;
    node();
    node(int item,node*add_on=NULL);
};
node::node()
{
    next=NULL;
}
node::node(int item,node*add_on)
{
    entry=item;
    next=add_on;
}
int main()
{
    int n;
    cin>>n;

    int item;
    cin>>item;
    node *head=new node(item);
    node *cur=head;

    for(int i=1;i<n;i++)
    {
        cin>>item;
        node *newptr=new node(item);
        cur->next=newptr;
        cur=newptr;
    }
    cur->next=NULL;

    int i,j;
    cin>>i>>j;
    node *p;
	node *temp;
    for(int k=0;k<n;k++)
    {
        p=head;
        if(k<i||k>j)
        {
            head=head->next;
            delete p;
        }
        else
        {
			temp=p;
			cout<<p->entry<<" ";
			delete temp;
            head=head->next;
        }
    }
    return 0;
}

单链表的指定值插入

请编写程序在单链表的值为x的元素之后均插入值为y的元素,并输出所有的插入位置。
【输入】
第一行整数n(1<=n)
第二行为单链表中的n个整数
第三行 x(x在单链表中存在)y要插入的整数,x和y均为int类型,且不相等
【输出】y插入在单链表中的下标位置
例如:
【输入】

5
3 6 9 10 1
6 7 //在所有的数字6后面插入数字7

【输出】

2 //7插入后的位置

#include <iostream>
#include <cstdio>
using namespace std;
struct node{
    int entry;
    node *next;
    node();
    node(int item,node *add_on=NULL);
};
node::node()
{
    next=NULL;
}
node::node(int item,node *add_on)
{
    entry=item;
    next=add_on;
}

int main()
{
    int n;
    cin>>n;
    int item;
    cin>>item;
    node*head=new node(item);
    node*cur=head;
    for(int i=1;i<n;i++)
    {
        cin>>item;
        node*newptr=new node(item);
        cur->next=newptr;
        cur=newptr;
    }
    cur->next=NULL;

    int x,y;
    cin>>x>>y;
    int place=0;
    while(head!=NULL)
    {
        cur=head;
        if(cur->entry==x)
        {
            delete cur;
            head=head->next;
            cout<<++place<<" ";
            place++;
        }
        else
        {
            delete cur;
            head=head->next;
            place++;
        }
    }
    return 0;
}

删除单链表的指定值

请编写程序删除单链表中所有值为x的元素。并输出删除x后的链表信息。
【输入】
第一行整数n(1<=n)
第二行为单链表中的n个整数
第三行 x,x为int类型
【输出】删除x后的单链表信息
例如:
【输入】

6
3 6 9 10 6 1
6

【输出】

3 9 10 1

#include <iostream>
#include <cstdio>
using namespace std;
struct node{
    int entry;
    node *next;
    node();
    node(int item,node*add_on=NULL);
};
node::node()
{
    next=NULL;
}
node::node(int item,node*add_on)
{
    entry=item;
    next=add_on;
}

int main()
{
    int n,item;
    cin>>n>>item;

    node*head=new node(item);
    node*cur=head;
    for(int i=1;i<n;i++)
    {
        cin>>item;
        node*newptr=new node(item);
        cur->next=newptr;
        cur=newptr;
    }
    cur->next=NULL;

    int out;
    cin>>out;
    while(head!=NULL)
    {
        node *p=head;
        if(p->entry==out)
            delete p;
        else
        {
            cout<<p->entry<<" ";
            delete p;
        }
        head=head->next;
    }
    return 0;
}

应用——约瑟夫问题(单链表环)

n 个人围成一个圆圈,首先第1个人从1开始一个人一个人顺时针报数, 报到第m个人,令其出列。然后再从下一个人开始,从1顺时针报数,报到第m个人,再令其出列,…,如此下去, 直到圆圈中只剩一个人为止。此人即为优胜者。请用环形链表实现约瑟夫问题。
【输入】n(2<=n<=60) m(1<=m)
【输出】最后的胜利者编号(编号范围是1至n)
例如:
【输入】

8 3

【输出】

7

#include <iostream>
using namespace std;
struct node{
    int entry;
    node *next;
    node();
    node(int item,node*add_on=NULL);
};
node::node()
{
    next=NULL;
}
node::node(int item,node*add_on)
{
    entry=item;
    next=add_on;
}

int main()
{
    int n,m;
    cin>>n>>m;
//创建一个单链表环
    if(n==2&&m==1)
    {
        cout<<n;
        return 0;
    }
    int first=1;
    node *head=new node(first);
    node *cur=head;
    for(int item=2;item<=n;item++)
    {
        node *newptr=new node(item);
        cur->next=newptr;
        cur=newptr;
    }
    cur->next=head;

    int i=0,j=0;  //i计数,j判断是否删去
    node *p=head;
    while(p->next!=p)  //只剩一个元素时退出
    {
        i++;
        j=(i+1)%m;
        if(j==0)
        {
            node*temp;
            temp=p->next;
            p->next=p->next->next;
            delete temp;
            i++;
        }
        p=p->next;
    }
    cout<<p->entry;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值