C语言进阶-第四周:利用链表逆序输出(10分)

逆序输出(10分)

 

题目内容:

你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束。然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1。

 

输入格式:

一系列正整数,输入-1表示结束,-1不是输入的数据的一部分。

 

输出格式:

按照与输入相反的顺序输出所有的整数,每个整数后面跟一个空格以与后面的整数区分,最后的整数后面也有空格。

 

输入样例:

1 2 3 4 -1

 

输出样例:

4 3 2 1 

时间限制:500ms内存限制:32000kb

    //利用链表逆序输出,20180618 
    #include <stdio.h>  
    #include <stdlib.h>  
    
	//定义一个结点,该结点包含数据和指向前一个结点的指针
	//这有利于后面逆序输出  
    typedef struct _node {  
        int value;  
        struct _node *before;  
    } Node;  
      
    int main()  
    {  
        Node * head = NULL;  //头结点初始化为空 
        int number;  
        do {  
            scanf("%d", &number);  
            if ( number != -1)  
            {  
                Node *p = (Node*)malloc(sizeof(Node));  
                p->value = number;  
                p->before = head;  //p->before为头结点,将新结点p连接到链表(即p的指针指向头结点) 
                head = p;  //再将头结点更新为p结点 
            }  
        } while ( number != -1);  
        Node *p;  //新建结点p进行遍历 
        for ( p = head; p; p=p->before) {  
            printf("%d ", p->value);  
        }  
          
        return 0;  
    }  

学会数据结构是必要的,最近才逐渐会使用和理解链表。下面是编写的一个拥有前向指针和后继指针的链表,也可以实现类似的功能,但更为灵活,可以随意实现正向或者逆向的数据输出。

    //利用链表逆序输出,20180618
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    using namespace std;

    typedef struct _node {
        struct _node *before;
        int value;
        struct _node *next;
    } Node;

    int main()
    {
        Node * head = NULL;  //头结点初始化为空
        Node * tail = head;
        int number;
        do {
            scanf("%d", &number);
            if ( number != -1)
            {
                Node *p = (Node*)malloc(sizeof(Node));
                p->before=NULL;
                p->value = number;
                p->next = NULL;  //p->next为头结点,将新结点p连接到链表(即p的指针指向头结点)
                if(tail){
                     p->before = tail;
                     tail->next = p;  //再将头结点更新为p结点
                     tail=p;
                }
                else{
                    tail=p;
                    head=tail;
                }
            }
        } while ( number != -1);
        Node *p;  //新建结点p进行遍历
        for ( p = tail; p; p=p->before) {
            printf("%d ", p->value);
        }
        return 0;
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉大秦少游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值