单链表的下标访问
请编写程序输出单链表中对应于下标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;
}