网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列

1

逆序输出的数列(10分)

题目内容:

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

输入格式:

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

输出格式:

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

输入样例:

1 2 3 4 -1

输出样例:

4 3 2 1

时间限制:2000ms内存限制:128000kb
 
  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 struct num
  5 {
  6     int num;//数字
  7     struct num *next;//下一个结点
  8 };
  9 typedef struct num NUM;//简写
 10 
 11 //涉及4个函数
 12 NUM *Init();//创建头结点,头结点不存储数据
 13 void Add(NUM *head, int num);//插入数据到尾部
 14 void Print(NUM *head);//顺序打印,非递归
 15 NUM *Dao(NUM *head);//链表逆序,返回新的头指针
 16 
 17 void main()
 18 {
 19     int num = 1;
 20     NUM *head = Init();//创建头结点,头结点不存储数据
 21 
 22     scanf("%d", &num);
 23 
 24     while (num != -1)//输入 - 1表示结束
 25     {
 26         Add(head, num);
 27         scanf("%d", &num);
 28     }
 29 
 30     NUM *newhead = Dao(head);//链表逆序,返回新的头指针
 31 
 32     Print(newhead);//顺序打印,非递归
 33 
 34     system("pause");
 35 }
 36 
 37 NUM *Init()//创建头结点,头结点不存储数据
 38 {
 39     NUM *head = (NUM*)malloc(sizeof(NUM));//创建头结点
 40     if (head == NULL)
 41     {
 42         printf("分配内存失败
");
 43         return NULL;
 44     }
 45     else
 46     {
 47         head->next = NULL;//最后指向NULL
 48         return head;//返回头指针
 49     }
 50 }
 51 
 52 void Add(NUM *head, int num)//插入数据到尾部
 53 {
 54     NUM *p = head;//第1步,创建指针p,用于移动
 55     if (p == NULL)
 56     {
 57         return;
 58     }
 59     while (p->next != NULL)//遍历
 60     {
 61         p = p->next;
 62     }
 63 
 64     NUM *new = (NUM*)malloc(sizeof(NUM));//第2步,创建指针new,用于存储新数据
 65     if (new == NULL)
 66     {
 67         printf("分配内存失败
");
 68         return;
 69     }
 70     new->num = num;//学号
 71     new->next = NULL;//最后指向NULL
 72 
 73     p->next = new;//第3步,p指向new
 74 }
 75 
 76 void Print(NUM *head)//顺序打印,非递归
 77 {
 78     NUM *p = head;//创建指针,用于移动
 79     int count = 0;//计数器
 80 
 81     while (p->next != NULL)
 82     {
 83         if (count)
 84         {
 85             printf(" ");
 86         }
 87         printf("%d", p->next->num);
 88         p = p->next;
 89         count++;
 90     }
 91 }
 92 
 93 NUM * Dao(NUM *head)//链表逆序,返回新的头指针
 94 {
 95     NUM * p = NULL;//创建指针p
 96     NUM * q = head->next;//创建指针q
 97     NUM * r = NULL;//创建指针r
 98 
 99     while (q)
100     {
101         r = q->next;//指针r指向q的下一个结点
102         q->next = p;//指针q指向前面结点
103         p = q;//移动指针p
104         q = r;//移动指针q
105     }
106 
107     NUM *newhead = (NUM *)malloc(sizeof(NUM));//创建指针newhead,作为新头指针
108     newhead->next = p;//新头指针指向指针p
109     return newhead;//返回新头指针
110 }
原文地址:https://www.cnblogs.com/denggelin/p/5619531.html