C语言实现《剑指offer》——05从尾到头打印链表

本文介绍了一种使用C语言从尾到头打印链表的方法,提供了两种实现方式:一种是利用数组实现链表的逆序打印,另一种是通过栈结构进行链表的逆序打印。文章详细展示了每种方法的代码实现,包括链表节点的定义、链表的创建、遍历以及逆序打印的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇是第5题_从尾到头打印链表的C语言实现:
题目描述:输入一个链表,从尾到头打印链表每个节点的值。
解法1:链表倒序的数组实现

#include<stdio.h>
#include<stdlib.h>
#define N 1000

typedef struct node     // 复习typedef的基础知识!!!!!!!
{
	int data;
	struct node *next;
}Listnode;

void ListTraverse(Listnode *);
int main(int argc, char* argv[])
{
	freopen("test.txt","r",stdin);
	int input,count = 0;
	int a[N]; 
	Listnode *head, *cur, *tmp;
	head = (Listnode *)malloc(sizeof(Listnode));
	head->next = NULL;
	cur = head;
	scanf("%d",&input);
	while(input != -1)
	{
		count++;				//统计有多少个数据
		tmp = (Listnode *)malloc(sizeof(Listnode));
		tmp->data = input;
		tmp->next = NULL;		//把最新输入的数字放在一个链表节点里,并为next赋初值NULL
		cur->next = tmp;		//把新节点加到当前节点的后面
		cur = tmp;				//移动当前节点
		scanf("%d",&input);
	}
	//ListTraverse(head);
	cur = head->next;
	int i =0;
	while(cur != NULL)
	{
		a[i] = cur->data;
		i++;
		cur = cur->next;
	}
	for (i = count-1; i >= 0; i--)
		printf("%d\n",a[i]);
	
	return 0;
}

void ListTraverse(Listnode *Lianbiao)
{
	Listnode *p = Lianbiao->next;	//链表的第一个节点(不算head节点)的指针暂存到p中 
	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	return ;
}

解法2:链表倒序的栈实现

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define N 1000


typedef struct node     
{
	int data;
	struct node *next;
}Listnode;

/*****************有关栈的内容*******************/
#define maxsize 1000
typedef Listnode* datatype;  
typedef struct stack
{
	datatype data[maxsize];
	int top;
}MyStack;

void Init(MyStack *s)
{
	s->top = -1;
}
bool IsEmpty(MyStack *s)
{
	if (s->top == -1)
		return true;
	else
		return false;
}
bool IsFull(MyStack *s)
{
	if(s->top == maxsize - 1)
		return true;
	else
		return false;
}

void Push(MyStack *s,datatype Element)
{
	if(!IsFull(s))
	{
		s->top ++;
		s->data[s->top] = Element;
	}
	else
		printf("栈满\n");
}
//仅出栈,不输出值
void Pop(MyStack *s)
{
	if(!IsEmpty(s))
	{
		
		s->top --;
	}
	else
		printf("栈空\n");
}
//仅输出值,不出栈
datatype Top(MyStack *s)
{
	if(!IsEmpty(s))
	{
		return s->data[s->top];
	}
	else
	{
		printf("栈空\n");
		return NULL;
	}
}
/**********************栈的内容结束************/



void ListTraverse(Listnode *);
int main(int argc, char* argv[])
{
	freopen("test.txt","r",stdin);
	int input,count = 0;
	int a[N]; 
	Listnode *head, *cur, *tmp;
	head = (Listnode *)malloc(sizeof(Listnode));
	head->next = NULL;
	cur = head;
	scanf("%d",&input);
	while(input != -1)
	{
		count++;				//统计有多少个数据
		tmp = (Listnode *)malloc(sizeof(Listnode));
		tmp->data = input;
		tmp->next = NULL;		//把最新输入的数字放在一个链表节点里,并为next赋初值NULL
		cur->next = tmp;		//把新节点加到当前节点的后面
		cur = tmp;				//移动当前节点
		scanf("%d",&input);
	}
	//ListTraverse(head);
	MyStack *s;
	s = (MyStack *)malloc(sizeof(MyStack));		//第一次代码中遗漏,指针没有明确的内存地址空间,必须在堆上申请内存
	Init(s);				//第一次代码中遗漏
	cur = head->next;
	while(cur != NULL)
	{
		Push(s,cur);
		cur = cur->next;
	}
	while(!IsEmpty(s))
	{
		tmp = Top(s);
		printf("%d\n",tmp->data);
		Pop(s);
	}
	return 0;
}

void ListTraverse(Listnode *Lianbiao)
{
	Listnode *p = Lianbiao->next;	//链表的第一个节点(不算head节点)的指针暂存到p中 
	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	return ;
}

测试样例和更详细的题目描述,可以参考我的github:Matthew-Haonan的github.

持续更新,欢迎留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值