[C语言]使用链表逆序输出(双向链表)

题目内容:

你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-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;
		
		
		
	}
}

求解...为什么两个函数中对前驱节点的输出得到的结果不一样??

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值