C/C++逆序打印链表

原创 2018年04月15日 10:50:56
C 逆序打印链表
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXSIZE 128
#define SIZE 10

typedef struct ListNode* List;

struct ListNode{
	int val;
	struct ListNode* next;
};

typedef struct{
	List nodes[SIZE];
	int top;
}Stack;

int InitStack(Stack **stack) {
	*stack = (Stack*)malloc(sizeof(Stack));
	if(*stack == NULL)
		return -1;
	(*stack)->top = -1;
}

int Push(Stack *stack, List node) {
	if (stack->top == SIZE - 1)
		return -1;
	stack->top++;
	stack->nodes[stack->top] = node;
	printf("%d\t", node->val);
	return 0;
}

int Pop(Stack *stack, List *node) {
	if (stack->top == -1) 
		return -1;
	*node = stack->nodes[stack->top];
	stack->top--;
}

void PushList(Stack *stack, List head) {
	List t = head->next;
	while(t) {
		Push(stack, t);
		t = t->next; 
	}
	printf("\n");
}

void PopList(Stack *stack) {
	List t;
	while(stack->top != -1) {
		Pop(stack, &t);
		printf("%d\t", t->val);
	}
	printf("\n");
}

List CreateList1(List head, int *data, int size) {
	//头插法
	List p;
	int i;
	head->next = NULL;
	
	for(i = 0; i < size; i++){
		p = (List)malloc(sizeof(struct ListNode));
		p->val = data[i];
		p->next = head->next;
		head->next = p;
	}
	
	return head;
} 

List CreateList2(List head, int *data, int size) {
	//尾插法 
	int i;
	List p, q;
	
	p = q = head;
	
	for(i = 0; i < size; i++) {
		p = (List)malloc(sizeof(struct ListNode));
		p->val = data[i];
		q->next = p;
		q = p;
	}
	q->next = NULL;
	
	return head;
}

List ReverseList(List head) {
	List last = NULL, next = NULL, p;
	
	p = head->next;
	
	while(p) {
		next = p->next;
		p->next = last;
		last = p;
		p = next;
	}
	head->next = last;
	return head;
}

void PrintList(List head) {
	List t = head->next;
	while(t) {
		printf("%d\t", t->val);
		t = t->next; 
	}
	printf("\n");
}

List Recursion(List head) {
	if (head == NULL)
		return NULL;
	if (head->next) {
		Recursion(head->next);
	}
	printf("%d\t", head->val);
} 


int main(void)
{
	List list;
	int data[SIZE], i;
	Stack *stack;
	
	for(i = 0; i < SIZE; i++) {
		data[i] = i;
	}
	
	list = (List)malloc(sizeof(struct ListNode));
	list->next = NULL;
	
	list = CreateList2(list, data, SIZE);
	PrintList(list);
	
	//通过反转链表实现链表逆序打印 
//	printf("list reverse...\n");
//	list = ReverseList(list);
//	PrintList(list);

    //通过递归逆序打印链表 
//	printf("call recursion print list...\n");
//	Recursion(list->next);
	
	//通过栈逆序打印链表 
	InitStack(&stack);
	printf("push list into stack...\n");
	PushList(stack, list);
	printf("pop list outto stack...\n");
	PopList(stack);
	
	return 0;
}

c++ 逆序打印链表

#include <stdio.h>
#include <string.h>
#include <stack>   
#include <iostream>
#include <stdlib.h>

typedef struct ListNode* List;

struct ListNode{
	int val;
	struct ListNode* next;
};

List CreateList(List head, int* data, int size){
	int i;
	List p, q;
	p = q = head;
	
	for(i = 0; i < size; i++) {
		p = (List)malloc(sizeof(struct ListNode));
		p->val = data[i];
		q->next = p;
		q = p;
	}
	q->next = NULL;
	
	return head;
}

void PrintList(List head) {
	List p = head->next;
	
	while(p){
		printf("%d\t", p->val);
		p = p->next;
	}
	printf("\n");
}

void PrintReverse(List head){
	std::stack<List> list;
	List p;
	
	if(head == NULL)
		return;
	
	p = head->next;
	
	while(p){
		list.push(p);
		p = p->next;
	}
	
	while(!list.empty()){
		p = list.top();
		std::cout << p->val << "\t";
		list.pop();
	}
	std::cout<<std::endl;
}

int main(void)
{
	List head;
	int i, len = 0, data[20];
	head = (List)malloc(sizeof(struct ListNode));
	
	for(i = 0; i < 10; i++) {
		data[i] = i;
	}

	head = CreateList(head, data, 10);
	PrintList(head);
	
	std::cout << "reverse print list..." << std::endl;
	PrintReverse(head);
	return 0;
}

递归逆序打印单链表(c实现)

递归逆序打印单链表。交换打印语句和递归调用的顺序,可以实现顺序打印和逆序打印链表。 #include #include typedef struct Node { int data; str...
  • u010049696
  • u010049696
  • 2015-01-05 22:55:25
  • 1445

C/C++笔试经典——链表倒序

设链表节点为: typedef struct tagListNode{ int data; struct tagListNode* next; }ListNode, *List;...
  • hbuxiaofei
  • hbuxiaofei
  • 2014-07-03 17:15:16
  • 3488

C++链表逆序打印节点

#include #include using namespace std; template struct Node { Type data; Node *next; N...
  • liuhuiyan_2014
  • liuhuiyan_2014
  • 2015-05-24 10:43:53
  • 674

【链表】C++链表反转、链表逆序打印

题目:C++实现链表逆序打印、链表反转 如何将链表逆序,取决于题目的要求。如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印。 方法1:只逆序打印,不改变...
  • yebanxin
  • yebanxin
  • 2016-07-18 15:46:14
  • 4992

经典面试题之逆序打印单链表

题目:输入一个链表的头节点,从头到尾反过来打印每个节点的值。 思路:要打印单链表就必须遍历单链表,遍历的顺序是从头到尾,而打印的顺序是从尾到头,就是说最先遍历的节点最后打印,最后遍历的节点最先打印,就...
  • jyy305
  • jyy305
  • 2017-04-29 14:05:03
  • 899

C语言实现单链表的逆序打印(带头结点)

我在之前一篇博客《C语言实现单链表(不带头结点)的逆序打印》中详细实现了对一个不带头节点的链表的逆序打印,整体思路也是非常的简单,也就是依次遍历原链表,然后把取出的节点用头插法建立一个新的链表,新链表...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016-03-01 20:07:18
  • 3661

C语言实现单链表逆序与逆序输出实例

这篇文章主要介绍了C语言实现单链表逆序与逆序输出,是数据结构与算法中比较基础的重要内容,有必要加以牢固掌握,需要的朋友可以参考下 单链表的逆序输出分为两种情况,一种是只逆序输出,实际上不逆序;另一种是...
  • win_turn
  • win_turn
  • 2016-02-19 00:24:25
  • 5543

单链表反序,逆序的两种方法

我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来。比如下面是第一次交换,我们先让头结点的next域指向结点a2,再让结点a1的next域指向结点a3,最后将结点a2的...
  • wujiafei_njgcxy
  • wujiafei_njgcxy
  • 2016-12-05 21:42:36
  • 1011

C++实现链表逆序

链表的结构
  • a1037488611
  • a1037488611
  • 2014-10-20 14:34:35
  • 1699

C++使用递归来顺序和逆序输出链表的全部元素

  • 2012年03月31日 20:33
  • 64KB
  • 下载
收藏助手
不良信息举报
您举报文章:C/C++逆序打印链表
举报原因:
原因补充:

(最多只允许输入30个字)