题目内容:
你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束。然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1。
输入格式:
一系列正整数,输入-1表示结束,-1不是输入的数据的一部分。
输出格式:
按照与输入相反的顺序输出所有的整数,每个整数后面跟一个空格以与后面的整数区分,最后的整数后面也有空格。
输入样例:
1 2 3 4 -1
输出样例:
4 3 2 1
时间限制:500ms内存限制:32000kb
思路:使用双向链表,记录最后一个结点的位置,然后挨个访问前驱节点并输出。自己写出了一堆不理解的地方但是结果好像还对,人麻了。
需要定义包含指向前一结点的指针former和指向后一结点的指针next的结点
#include <stdlib.h>
#include<stdio.h>
typedef struct NODE{
int data;
struct NODE * next;
struct NODE * former;
}numset; //链表的每个结点,包括数据,前一结点指针,下一节点指针
typedef struct List{
numset* head;
numset* end;
numset* now;
int size;
}list; //为了方便将链表传入函数,定义的结构体。可访问头结点,尾节点,当前节点,链表大小(虽然没用上)
void read(list* );
void put(list* );
int main(){
list pset;//相当于 numset* pset;
pset.head=NULL;
pset.end=NULL;
pset.now=NULL;
pset.size=0;//初始化链表。相当于pset=NULL;
read(&pset);
put(&pset);
//free(pset);//到底什么时候应该用free...我很费解,这里放到后面的put()函数里free了
return 0;
}
void read(list* p){
int n;
//numset* position=(numset*)malloc(sizeof(numset));
numset* position=NULL;//存一下当前节点A1的位置,当处理到了下一个节点A2,就可以把这个位置赋给A2的前驱指针。现在没有任何结点,位置指针指向空。
//到底什么时候要申请空间..我也没太明白
while(scanf("%d",&n) && n!=-1){
p->now=(numset*)malloc(sizeof(numset));
p->now->data=n;
p->now->former=position;//把前驱节点挂到之前保存的位置上
if(!p->head){
p->head=p->now;//如果头结点指针指向空,则把头指针挂在刚输入的结点
}
p->end=p->now;//把尾指针挂在最新输入的结点
p->size++;
// printf("now=%d\n",p->now->data); //测试用。输出刚读入的结点
position=p->now;//存一下当前节点A1的位置,当处理到了下一个节点A2,就可以把这个位置赋给A2的前驱指针
p->now=p->now->next;
// printf("former=%d\n",p->now->former); //测试用。为社么这里总是输出一个同样的值???我很费解
}
}
void put(list* p){
while(p->end){
printf("%d ",p->end->data);
// if(p->end->former) //printf("former=%d\n",p->end->former->data);测试用,这里输出的前驱值都是对的啊啊啊为什么...抓狂ing
free(p->end);
p->end=p->end->former;
}
}
求解...为什么两个函数中对前驱节点的输出得到的结果不一样??