当前位置:   article > 正文

c语言数据结构单链表的转置,数据结构与算法-单链表-线性表转置

单链表就地转置 数据结构

问题:《数据结构与算法分析(C++语言版)》p58 五、2

已知一个如下图所示的带头结点的单链表head(注:若头指针名是head,则把单链表称为表head),其存储结构为:

typedef struct Lnode{

ElemType data;

struct Lnode *next;

}Lnode,*LinkList;

e5c1bb9c410df02b7fc76d3b127535dd.png

请编写一个线性表的转置算法。线性表转置是指将(a1,a2,...,an) ( a 1 , a 2 , . . . , a n )变为(an,an−1,...,a1) ( a n , a n − 1 , . . . , a 1 )。

问题分析

程序代码

运行结果

在原链表中区别对待第一次操作的正确输出:

在原链表中未区别对待第一次操作的错误输出:

注意事项

问题分析

根据题意,首先要创建一个带头结点的单链表,单链表包含头结点,每个结点包括数据与data和指针域*next,为了简化操作,可设单链表的元素为数字1~10,为此需要创建初始化单链表的函数,首先将头结点指向NULL,然后用循环连续创建10个新结点,并将他们依次相连,并赋值;为了能够显示出转置前后的区别,需要编写一个打印函数,需要从首元结点(Head->next)依次遍历到最后一个结点(p->next=NULL),并用cout语句输出,注意需要加上分隔符;最后为了实现该题的核心功能,需要创建一个转置函数(Reverse),其中需考虑第一次操作与后续操作不同的情况,否则会出现第一个结点(即转置后的最后一个结点)出现自己指向自己的死循环;最后在主程序中调用相应的函数,可以选择在原单链表进行操作,也可重新建立一个单链表进行操作。

程序代码

#include

#include

#define ElemType int

using namespace std;

typedef struct Lnode{

ElemType data;

struct Lnode *next;

}Lnode,*LinkList;

int InitList(LinkList h) {

Lnode *p;

h->next=NULL;//初始化头结点

for(int i=0; i<10; i++) {

p=new Lnode;

p->data=i+1;//依次加一

p->next=NULL;

h->next=p;

h=p;

}p->next=NULL;//最后指向空

}

int ListPrint(LinkList h) {

h=h->next;//指向首元结点

while(h) {

cout

h=h->next;

}

cout

Lnode *p,*q;

int j=0;//计数器,用来区别第一次操作和后续操作

p=h->next;

while(p!=NULL){

q=p->next;//q结点指向p结点的后一个

if(j==0)//如果是第一次操作

p->next=NULL;//首个结点(转置后的最后一个结点)指向空,避免打印时出现死循环

else

p->next=h->next;//指向新的首元结点

h->next=p;//首元结点指向新的结点,即把位序更大的元素挪到前面

p=q;//结点后移

j++;//计数器+1

}

}

int main() {

Lnode *head,*head2,*a,*b;

InitList(head);

ListPrint(head);

Reverse(head);

ListPrint(head);

//head2=new Lnode; 使用新的单链表进行存储

// a=head->next;

// head2->next=NULL;

// while(a){

// b=a->next;

// a->next=head2->next;

// head2->next=a;

// a=b;

// }

// a=head2->next;

// ListPrint(head2);

}

运行结果

在原链表中区别对待第一次操作的正确输出:

1 2 3 4 5 6 7 8 9 10

10 9 8 7 6 5 4 3 2 1

在原链表中未区别对待第一次操作的错误输出:

1 2 3 4 5 6 7 8 9 10

10 9 8 7 6 5 4 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ……

注意事项

也可以在Reverse函数中不使用计数器j,即需要先对第一次循环特别操作,让第一个结点先指向NULL,然后再将后续的操作进入循环。

使用新的单链表进行存储时,则不需要进行特殊操作,因为新链表的头指针本来指向的就是NULL,所以把原来链表的元素插入进去不会产生死循环的现象

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/62867
推荐阅读
  • 【数据结构】 常见的八大排序算法
    排序有内部排序和外部排序,这里八大排序就是内部排序,指直接插入,希尔,选择,堆排,冒泡,快排,归并,计数。附有动图解释和思维导图汇总_八大排序八大排序概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,这里八大排序就是内部排... [详细]

  • 【愚公系列】软考中级-软件设计师 016-数据结构(数组、矩阵和广义表)
    数组(Array)是一种用于存储多个相同类型的元素的数据结构。它可以被看作是一个容器,其中的元素按照一定的顺序排列,并且可以通过索引访问。数组的长度是固定的,一旦定义后,就不能再改变。矩阵(Matrix)是一个具有行列的二维数组。它是由一... [详细]

  • 注意:双链表不可随机存取,按位查找和按值查找操作都只能用遍历的方式实现,时间复杂度为。思路:从头结点开始,找到某个位序的前驱结点,对该前驱结点执行后插操作;思路:找到给定结点的前驱结点,再对该前驱结点执行后插操作;双链表的初始化(带头结点)... [详细]

  • 数据量的增长与程序运行时间增长所呈现的比例函数,则称为时间渐进复杂度函数简称时间复杂度。链式存储的表状结构,链表可以分为:单向链表、双向链表、循环链表、内核链表。1.只要空间足够,理论上可以存放无限个数据。1.数据访问不太方便(空间不连续)... [详细]

  • 性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1(度为0的结点数比度为2的结点数多1)二分搜索树的每个结点的值(大于其左子树的所有结点的值|小于其右子树的所有结点的值)性质1:在二叉树的第i层上至多... [详细]

  • 类型说明符数组名[常量表达式]说明:常量表达式中可以包含常量和符号常量(宏命名),不能包含变量。即C语言中不允许对数组大小作动态定义。线性表经常进行插入和删除操作长度可变而C中数组长度是不可变。数组名其实就是首元素地址所以也可以直... [详细]

  • /初始化//判断是否为空else。数据结构(队列Queue)文章目录一、队列1、队列的定义2、队列的顺序实现2.1、初始化2.2、入队2.3、出队2.4、查找2.5、判断队列满/空3、队列的链式实现3.1、初始化3.2、入队3.3、出队4、... [详细]

  • 【代码】数据结构.队列顺序表示。数据结构.队列顺序表示一、队列的定义二、队列顺序实现#include<iostream>usingnamespacestd;constintN=10;typedefstruct{intdat... [详细]

  • 【代码】数据结构.数据结构.一、的定义二、初始化#include<iostream>usingnamespacestd;constintN=10;typedefstruct{intdata[N];inttop;}SqSt... [详细]

  • 队列的定义,特点,队列的基本操作实现数据结构(队列)一.什么是队列1.队列定义    队列是一种特殊的线性表,特殊之处在于他只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入... [详细]

  • 的基本定义,顺序,链的介绍代码实现,力扣经典题分享数据结构()一.什么是1.的定义    是一种特殊类型的线性表,它的特点是仅允许在其一端进行插入(入)和删除(弹出)操作。这一端称为... [详细]

  • 之前我们已经学了数组和链表。它们是Arraylist和LinkedList的底层结构。【数据结构之前我们已经学了数组和链表。它们是Arraylist和LinkedList的底层结构。集合命名和数据结构的关系:1.**二叉这是一个普通二... [详细]

  • 数据结构是计算存储,组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。数据结构可演示线上地址。【数据结构】数据... [详细]

  • *树形结构:**数据元素之间是一对多关系**图结构:**数据元素之间是多对多关系。数据结构(绪论+算法基本概念)文章目录一、绪论1.1、数据结构基本概念1.2、数据结构三要素1.2.1、逻辑结构1.2.2、数据运算1.2.3、物理... [详细]

  • 该项目基于开发板Linux系统,利用文件IO数据结构制作了一个超市购物系统。程序通过检索目录下的图片信息,将商品信息保存到链表中,并能够根据用户选择自动跳转到商品详细界面。界面设计简陋但功能实现较为完整。项目主要突出了对数据结构文件IO... [详细]

  • 一、完美二叉又叫满二叉,即除了最后一个层级的叶子节点外,其余每个结点都有两个子结点二、完全二叉需要满足两个条件:(1)除了最后一层外,其它各层的结点个数都达到最大个数(2)最后一层的结点集中在左侧,且结点连续,只有右侧部分可以缺失结点... [详细]

  • 二叉定义、特点和常见分类_二叉分类二叉分类    一、基本概念专业术语中文描述Root根节点一棵顶点Child孩子结点一个结点含有根节点称为该结点子节点Leaf叶子结点没... [详细]

  • 数据结构二叉、二叉搜索、遍历二叉、先序遍历二叉、中序遍历二叉、后序遍历二叉、程序实现二叉_非空左子非空左子一、(1)的定义:(Tree):n(n≥0)个结点构成的有限集合当n=0时,称为空对于任一棵非空(n... [详细]

  • 二叉树:度最多为2的树二叉树特点:1>n0=n2+12>非空二叉树上第k层上至多有个结点(k>=1)3>高度为H的二叉树至多有个结点(H>=1)满二叉树:对于一棵高度为H的二叉树,将含有个结点的二叉树称为满二叉树满二叉树特点:满二叉树只有最... [详细]

  • 是我们常用的数据结构,如堆、二叉搜索、B等,它们都有自己的特点,使得我们在程序设计中常常使用。下面就说说的基础知识,二叉完全二叉。并用java使用链表描述完全二叉。_完全二叉只有非空左子完全二叉只有非空左子是我... [详细]

相关标签
  

闽ICP备14008679号