15-7-22 Oj-更换火车头

问题及代码:

/*
*  问题:
*  假设火车有n节车厢(从前往后编号依次为1,2,3,...,n),每节车厢的人数依次为M1,M2,M3,...,Mn。
*  火车头的编号为0,连接在1号车厢上。火车进站后,将火车头从1号车厢卸下,接在第n节车厢上,反方向行驶。
*  即火车的1号车厢为原来的第n号车厢,...,火车的n号车厢为原来的第1号车厢。请输出火车反向行驶后,每节车厢的人数。
*/

#include <iostream>
#include <windows.h>
using namespace std;
struct Train {
    int num;  //人数
    Train *next;
};

/*********************************************************************
*功能描述:往车厢里面装人,用了简单的递归算法实现反复输入。
            使用了静态变量,目的是重复调用函数时不取消变量的值
*输入参数:整型变量,代表车厢数
*输出参数:Train类的指针变量,最终返回的代表车头(第0节车厢)的地址
*********************************************************************/
Train *creat(int n)
{
    static int i=0;
    if(i==0)
        {
            cout<<"请输入车头人数:";
            i++;
        }
    else
        cout<<"请输入车厢"<<i++<<"人数:";
    Train *t=new Train;
    cin>>t->num ;
    if(n==1) {
        t->next = NULL;
        return t;
    }
    t->next = creat(n-1);
    return t;
}

/**************************************************************
*功能描述:输出每节车厢的人数信息
*输入参数:Train类的指针变量,代表车头的地址,从车头开始输出
*输出参数:Train的指针变量,最终返回的代表车头的地址
*************************************************************/
void print(Train *p)
{
    static int i=0;
    if(p==NULL)
        return ;
    if(i==0)
        {
            cout<<"车头人数:"<<p->num<<endl;
            i++;
        }
    else
        cout<<"车厢"<<i++<<"人数:"<<p->num<<endl;
    print(p->next);
}

/**************************************************************
*功能描述:删除每节车厢因为输入人数时动态分配的内存空间
*输入参数:Train类的指针变量,代表车头的地址,从车头开始删除
*输出参数:无
**************************************************************/
void del(Train *p)
{
    if(p==NULL)
        return ;
    Train *t;
    t=p->next;
    delete p;
    del(t);
}

/*************************************************************
*功能描述:将车头调转到车尾,将车头逐个和下一节车厢调换位置
*输入参数:Train类的指针变量,代表车头的地址。
*输出参数:无
*************************************************************/
Train *rev(Train *p)
{
    Train *head=NULL,*t;
    while(p){
        t=p->next;
        p->next = head;
        head = p;
        p=t;
    }
    return head;
}

int main(void)
{
    int j;
    int n;
    Train *head;
    Train *rev(Train *p);
    cout<<"请输入车厢数:";
    cin>>n;
    head = creat(n);
    head=rev(head);
    cout<<"车头调转中";
    for(j=0;j<7;j++)
    {
        cout<<'.';
        Sleep(150);
    }
    cout<<endl;
    cout<<"车头调转后,各车厢人数为:"<<endl;
    print (head);
    del(head);
    return 0;
}


运行结果:


小结:

和最近做的链表感觉很像。

因为明天考试去Oj刷了下题,前面都挺顺利,就这题,卡了我半小时,一直想搞明白他写的那些函数都是什么意思。

在几次反复看了之后终于明白,加了一条p=t语句程序就成了,感觉这题不错,应该发一下博客。

加油~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值