剑指offer05题链表的倒序输出

题目:输入链表的头结点,从尾到头打印出所有结点的值。(倒序输出链表)

一般有两种办法,

一:利用栈的“后进先出”的特性,把链表每个结点都放到栈里面,然后再出栈输出。

下面是实现代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void InitStack(STACK* s);								/*初始化栈*/
void Push(STACK* s,int e);								/*进栈*/
void Pop(STACK* s,int *e);								/*出栈*/
int StackEmpty(STACK *s);								/*判断是否空栈*/
void readlist_end(LinkList L);							/*主要处理函数,用于把链表数据进栈,然后出栈*/
void echo_list(LinkList L,int flag);					/*用于输出链表数据*/
LinkList creat_list(int len);							/*创建链表*/

typedef struct node
{
	int data;
	struct node* next;
}Lnode,*LinkList;

typedef struct stack
{
	LinkList top;
}STACK;

int StackEmpty(STACK *s)
{
	if(s->top==NULL)
		return 1;
	else
		return 0;
}

void InitStack(STACK *s)
{
	s->top=NULL;
}

void Push(STACK *s,int e)
{
	LinkList l;
	l=(LinkList)malloc(sizeof(Lnode));
	l->data=e;
	l->next=s->top;
	s->top=l;
}

void Pop(STACK *s,int *e)
{
	LinkList l;
	if(StackEmpty(s)) 
		exit(-1);
	l=s->top;
	*e=l->data;
	s->top=l->next;
	free(l);
}

void readlist_end(LinkList L)
{
	STACK s; 
	InitStack(&s);
	LinkList p;
	int e;
	p=L;
	while(p!=NULL) 
	{
		Push(&s,p->data);
		p=p->next;
	}
	while(s.top!=NULL)
	{
		Pop(&s,&e);
		printf("%d ",e);
	}
	printf("\n");
}
/*
 * LinkList:链表
 * flag
 *	1:释放空间
 *	other:只输出,不错处理.
 * */
void echo_list(LinkList L,int flag)
{
	LinkList p;
	LinkList m;
	p=L;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		m=p;
		p=p->next;
		if(flag==1)
		{
			free(m);
		}
	}
	printf("\n");
}
LinkList creat_list(int len)
{
	int i;
	LinkList l;
	LinkList p;
	LinkList m;
	l=(LinkList)malloc(sizeof(Lnode));
	l->data=0;
	l->next=NULL;
	m=l;
	for(i=1;i<len;i++)
	{
		p=(LinkList)malloc(sizeof(Lnode));
		p->data=i;
		p->next=NULL;
		m->next=p;
		m=p;
	}
	m->next=NULL;
	return 0;
}
int main()
{
	LinkList L;
	L=creat_list(10);
	printf("逆序后数据:");
	readlist_end(L);
	printf("原始数据:");
	echo_list(L,1);
	return 0;

}
二:利用递归特性进行输出,先递归再输出数据(收到递归层数影响,数据量太大就不行了,但是代码简单)

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{

		int data;
		struct node* next;
}Lnode,*LinkList;

LinkList creat_list(int len)
{

	int i;
	LinkList l;
	LinkList p;
	LinkList m;
	l=(LinkList)malloc(sizeof(Lnode));
	l->data=0;
	l->next=NULL;
	m=l;
	for(i=1;i<len;i++)
	{
		p=(LinkList)malloc(sizeof(Lnode));
		p->data=i;
		p->next=NULL;
		m->next=p;
		m=p;
	}
	m->next=NULL;
	return l;
}
void readlist_end(LinkList L)
{
	if(L->next!=NULL)
		readlist_end(L->next);
	printf("%d ",L->data);
}
/*LinkList:the link table.
**flag
**	1:free the memery.
**	other:not free the memery.
***/
void echo_list(LinkList L,int flag)
{

	LinkList p;
	LinkList m;
	p=L;	
	while(p!=NULL)
	{
		printf("%d ",p->data);
		m=p;
		p=p->next;
		if(flag==1)
		{
			free(m);
		}
	}
	printf("\n");
}
int main()
{

	LinkList L;
	L=creat_list(10);
	readlist_end(L);
	printf("\n");
	echo_list(L,1);
	return 0;

}

如果有哪地方不对,请及时帮我指出,免得误导大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值