算法习题---线性表之单链表逆序打印

一:题目

逆序打印单链表中的数据,假设指针指向单链表的开始结点

二:思路

1.可以使用递归方法,来进行数据打印
2.可以借助数组空间,获取长度,逆序打印数组
3.若是可以,对链表数据使用头插法,逆序排列,然后正序打印即可

三:算法实现(这里使用方法一:递归实现简单易懂)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

#define OK 1
#define ERROR 0

typedef int Status;

typedef struct Node
{
    int data;
    struct Node* next;
}LNode,*LinkList;

//初始化链表,带有头结点
Status InitList(LinkList* L)
{
    LNode* p,*q;

    //初始化头结点
    *L = (LinkList)malloc(sizeof(LNode));
    if (*L == NULL)
        return ERROR;
    (*L)->next = NULL;
    p = *L;

    //头插法插入数据1-10,也就是说创建后的链表数据是由10-1的
    for (int i = 0; i < MAXSIZE; i++)
    {
        q = (LNode*)malloc(sizeof(LNode));
        q->data = i + 1;
        q->next = p->next;
        p->next = q;
    }

    return OK;
}

void InvertPrint(LinkList L)
{
    if (L!=NULL)
    {
        InvertPrint(L->next);
        printf("%d->", L->data);
    }
}

int main()
{
    LinkList L;
    //初始化链表数据
    InitList(&L);
    //打印数据
    InvertPrint(L->next);

    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/ssyfj/p/9567541.html

时间: 2024-12-28 18:00:22

算法习题---线性表之单链表逆序打印的相关文章

算法习题---线性表之单链表的查找

一:问题 已知一个带头结点的单链表,结点结构为(data,link)假设该链表只给出了头指针list,在不改变链表的前提下,设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值,并返回1,否则,只返回0. 注意: 这里的链表中没有给出链表长度哟 二:思路 设置两个指针p.q,分别指向该链表的第一个元素(头结点的下一个元素)和头结点,一个整数num(初值为1),p向后移动一个位置num值加1,如果num值大于k,则p,q一起移动,p移

单链表逆序打印!

单链表打印的时候 一般 if (p== NULL) return; printf("%d ",p->data ); reverse_show(p->next); 结果: 123456 就可以依次打印了 但是如果把打印语句放在后面 就会逆序打印 if (p== NULL)return; reverse_show(p->next); printf("%d ",p->data ); 结果 654321 这是因为退出的时候 是从后面进行的!

[大话数据结构]线性表之单链表结构和顺序存储结构

线性表定义: 零个或者多个数据元素的有限序列.元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继.其他每个元素都有且只有一个前驱和后继.并且数据元素的类型要相同. 线性表的抽象数据类型: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素. 数据元素之间的关系是一对一的关系.

续上文----线性表之单链表(C实现)

本文绪上文线性表之顺序表(C实现) 本文将继续使用单链表实现线性表 的另外一种存储结构.这种使用 链表实现的存储结构在内存中是 不连续的. C实现代码如下: #include<stdio.h> typedef struct node { int data; struct node *next; }Node; //链表的初始化 Node* InitList(int number) { int i; Node *pHead=(Node *)malloc(sizeof(Node)); Node *T

链表 - 单链表逆序

单链表逆序是经典的链表操作算法,单链表逆序的算法思想是将链表箭头反指(假设next指针是一个箭头),即所谓的改链,改链过程如下. 逆序前: head-->......prev-->cur-->next-->......->NULL 逆序后: NULL<--......prev<--cur<--next<--......head 算法逻辑: 1.空链表或只有一个元素,返回原链表head. 2.定义3个指针prev.cur.next,初始化时,prev指向

华为机试题-- 单链表逆序

[问题] 单链表逆序 [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ListNode { int value; struct ListNode *next; }ListNode; typedef struct ListNode *List; List reverseList(List head) //列表逆序 { ListNode *rear, *curr,

单链表逆序或者逆序输出

分为两种情况,一种是只逆序输出,实际上不逆序:另一种是把链表逆序. ********************逆序输出*********************** 1 #include<iostream> 2 #include<stack> 3 #include<assert.h> 4 using namespace std; 5 6 7 typedef struct node{ 8 int data; 9 node * next; 10 }node; 11 12 //

单链表逆序的三种方法

一.不使用额外存储空间的逆序 LinkList ReverseLink(LinkList L) { LinkList *next; LinkList *prev = NULL; LinkList *head = L->next; while(head != NULL) { next = head->next; head->next = prev; prev = head; head = next; } L->next = prev return L; } 二.头插法逆序 LinkL

C++链表逆序打印节点

#include <iostream> #include <stack> using namespace std; template<typename Type> struct Node { Type data; Node *next; Node(Type d = Type()):data(d),next(NULL){} }; template<typename Type> class List { public: List() { head = NULL;