题目内容:
你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束。然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1。
输入格式:
一系列正整数,输入-1表示结束,-1不是输入的数据的一部分。
输出格式:
按照与输入相反的顺序输出所有的整数,每个整数后面跟一个空格以与后面的整数区分,最后的整数后面也有空格。
输入样例:
1 2 3 4 -1
输出样例:
4 3 2 1
#include <stdio.h>
#include <stdlib.h>
typedef struct _point {
int value;
struct _point *next;
} point; //定义一个point的结构
int main () {
point* head = NULL;
int number;
int cnt=0;
int i;
do {
scanf ("%d", &number );
if (number != -1){
point *p = (point *)malloc (sizeof (point));
p->value = number;
p->next = NULL;//输入不是-1,构建结构体变量
point *last = head; //判断是否为第一个节点
if (last){ //判断是否为第一个节点
while (last->next){ //将下一个节点与上一个节点连接
last = last->next;
} //从第一个节点开始向后遍历每个节点,看next是否空,若空,执行下一步
last->next = p; //将新读入的数所在的指针,存入上一个空的节点上 ,制造出下一个节点的位置
} else head = p;
}
cnt++;
}
while (number != -1);
int a[cnt-1];
for (i = 0; i<cnt-1; i++){
a[i]=head->value;
head = head->next;
}
for (i = cnt-2; i>=0; i--){
printf ("%d ", a[i]);
};
return 0;
}
每次构建节点,利用计数器记录,将最后的结果作为数组的长度;输出结果时,将每个节点的数值重新存入一个已知长度的数组,并遍历数组输出结果;
OJ测试结果:
输入的数据按照顺序依次存入链表后,重新再逆序输出,所需要的时间过长,那么能否在输入过程中逆序存入数组;
//head依旧初始化为NULL
{
scanf ("%d", &number );
if (number != -1){
point *p = (point *)malloc (sizeof (point));
p->value = number;
p->next = head;
head = p;//将第一个结点的指针传给head,
//在下一次循环中,head作为新节点next所储存的值
}
}
while (number != -1);
通过对输入数据的存入方式进行修改,再对链表进行遍历输出,运行的结果能够满足500ms的要求。