链式表逆向输入和顺向输入

#include<iostream>
using namespace std;
typedef struct Lnode{
struct Lnode *next;
int data;
}Lnode,*Linklist;
int Initlist(Linklist &L){
L=(Linklist)malloc(sizeof(Lnode));
if(!L)return 0;
L->next=NULL;
return 0;
}
int shun(Linklist &L,int i){
int j;
for(j=0;j<i;j++)
{Linklist S;
Initlist(S);
cin>>S->data;
S->next=L->next;
L->next=S;
}
return 0;
}
int ni(Linklist &L,int j){
int i;Linklist pa=L;
for(i=0;i<j;i++){
Linklist S;
Initlist(S);
cin>>S->data;
S->next=pa->next;
pa->next=S;
pa=S;
}
return 0;
}
int shuchu(Linklist &L){
Linklist A=L->next;
while(A){
cout<<A->data<<" ";
A=A->next;
}
return 0;
}
int main(){
Linklist L;int i;Linklist B;
Initlist(L); Initlist(B);
cout<<"================顺向输入==============="<<endl<<"请输入数字个数"<<endl;
cin>>i;
shun(L,i);
shuchu(L);cout<<endl;
cout<<"================逆向输入==============="<<endl<<"请输入数字个数"<<endl;
cin>>i;
ni(B,i);
shuchu(B);
cout<<endl;
return 0;
}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【样例输入】 5 1 2 3 4 5 3 6 【样例输出】 1 2 6 3 4 5 5 4 3 6 2 1 【样例输入】 5 1 2 3 4 5 0 6 【样例输出】 error 【样例输入】 5 1 2 3 4 5 6 6 【样例输出】 error 【样例输入】 1 1 1 2 【样例输出】 1 2 2 1 【样例输入】 1 1 0 2 【样例输出】 error 【样例输入】 1 1 2 2 【样例输出】 error 【解题思路】 题目要求我们实现带头结点的双向链,因此我们需要在链头部加入空节点,方便对链进行操作。 在插入元素时,需要先判断插入位置是否合法,位置不合法则输出error,否则,我们需要遍历链找到要插入位置的前一个节点,然后进行插入操作。 在输出时,需要分别从头开始顺向输出,和从尾开始逆向输出。这个过程中,需要注意控制输出格式,每个元素之间需要用空格分隔开。 【注意点】 1、插入位置合法的范围是[1,链长度+1],因为可以在链末尾插入元素。 2、插入元素时需要注意对前后节点的连接操作,以及更新链长度。 3、输出时需要注意控制输出格式,每个元素之间需要用空格分隔开。 【算法描述】 1、定义双向链节点结构体,包含前驱指针pre、后继指针next和节点数据data。 2、定义双向链结构体,包含头结点指针head、尾结点指针tail和链长度len。 3、实现双向链的初始化操作,即创建头结点。 4、实现双向链的插入操作,需要先判断插入位置是否合法,然后遍历链找到要插入位置的前一个节点,然后进行插入操作。 5、实现双向链的顺向输出操作,从头开始遍历链,输出每个节点的data。 6、实现双向链逆向输出操作,从尾开始遍历链,输出每个节点的data。 7、在主函数中读入数据,调用双向链的初始化操作和插入操作,然后输出链。 8、完成。 【算法分析】 本题的时间复杂度为O(n),主要是在插入操作和顺向输出、逆向输出操作中耗时最多,其中插入操作需要遍历链,时间复杂度为O(n),顺向输出和逆向输出操作分别需要遍历链,时间复杂度也为O(n)。因此总的时间复杂度为O(n)。 【注意事项】 在进行双向链的插入操作时,需要注意对前后节点的连接操作,以及更新链长度。同时,在遍历链时需要注意判断节点是否为空,防止出现空指针异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值