数据结构作业-2

 

题目:设有一个线性表 (a0, a1, …, an-2, an-1) 存放在单链表中。试编写一个算法将该线性表原地逆置,即利用原结点空间置换为 (an-1, an-2, …, a1, a0),并分析该算法的时间复杂度。

 

1.需求分析

 

 1) 用单链表存放一个线性表 (a0, a1, …, an-2, an-1) 。

 2) 将该线性表原地逆置,即利用原结点空间置换为 (an-1, an-2, …, a1, a0)。

 3) 分析算法的时间复杂度。

 

2.概要设计

         函数调用关系:

 

ADT

//链表的节点定义

typedef struct LinkNode

{

  DataType data;//数据域

  struct LinkNode *next;//指向下一个节点的指针

}NodeType;

 

3.详细设计

                  //创建链表,用户输入节点的data域值,输入结束

NodeType *Create()

{

创建头结点head=NULL;

接收数据d,并创建头结点;

创建多个非头结点;

返回head

}

 

//实现单链表的逆置(翻转)。将头节点为head的单链表逆置

NodeType* Invert(NodeType* head)

{

  if (链表长度为1)

         {   没法翻转, return NULL;  }

  p=head

  q=head->next;

  while(q不到链表的结尾处)

  {

     r=q->next;

     q->next指向p;

     p=q;

     q=r;

  }

  head->next=NULL;

  head=p;

  return head;

}

 

4.调试分析

    

         程序的时间复杂度为O(n/2)

        

5.使用说明

    运行程序,按照提示即可。

         注释和去注释相应的代码,即可完成响应的不同操作。一共有3处。

6.测试结果

测试组一:

建立单连表,元素类型为int,以0结束输入,不能以0开始

输入第1个节点值:3

输入第2个节点值:4

输入第3个节点值:5

输入第4个节点值:6

输入第5个节点值:7

输入第6个节点值:8

输入第7个节点值:0

创建的是:从左往右,单链表的元素为:  3  4  5  6  7  8

翻转之后:从左往右,单链表的元素为:  8  7  6  5  4  3

 

测试组二:

建立单连表,元素类型为int,以0结束输入,不能以0开始

输入第1个节点值:12

输入第2个节点值:34

输入第3个节点值:56

输入第4个节点值:78

输入第5个节点值:90

输入第6个节点值:0

创建的是:从左往右,单链表的元素为:  12  34  56  78  90

翻转之后:从左往右,单链表的元素为:  90  78  56  34  12

 

测试组三:

建立单连表,元素类型为char,以#结束输入

输入第1个节点值:q

输入第2个节点值:#

创建的是:从左往右,单链表的元素为:  q

只有一个,没法翻转,至少得两个

翻转之后:从左往右,单链表的元素为:空表

 

测试组四:

建立单连表,元素类型为char,以#结束输入

输入第1个节点值:x

输入第2个节点值:u

输入第3个节点值:e

输入第4个节点值:h

输入第5个节点值:u

输入第6个节点值:i

输入第7个节点值:p

输入第8个节点值:i

输入第9个节点值:n

输入第10个节点值:g

输入第11个节点值:#

创建的是:从左往右,单链表的元素为:  x  u  e  h  u  i  p  i  n  g

翻转之后:从左往右,单链表的元素为:  g  n  i  p  i  u  h  e  u  x

测试组五:

建立单连表,元素类型为char,以#结束输入

输入第1个节点值:shu

输入第2个节点值:输入第3个节点值:输入第4个节点值:#

创建的是:从左往右,单链表的元素为:  s  h  u

翻转之后:从左往右,单链表的元素为:  u  h  s

        

         测试组六:大量数据

                  翻转随机数据100000个,所用时间:16

                  

7.附录

源程序文件清单。

  


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值