数据结构测试 线性表ADT实现

题目描述:
超文本标记语言假设线性表ADT的数据元素类型为正整数,采用带头结点的单链式存储结构。线性表ADT实现的大部分代码已经给出,请补充写出类的两个成员函数insert和reverse。 注意:只需提交需要补充的函数代码,其他代码不能自己重写和修改。

 insert函数:在元素值从小到大有序的线性表中插入一
 个元素,仍然保持有序。
 reverse函数:实现线性表元素的倒置,即将线性表中
 数据元素的顺序反转。
 线性表元素输入时,以 endTag 作为结束标志。
	
例如输入: 3 8 7 2 4 9 1 6 5 0
则输出:9 8 7 6 5 4 3 2 1
预置代码如下: (其中/*   */ 部分是要补充的insert和reverse函数)

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int ElemType;  //数据元素类型
class List; //前视定义,否则友元无法定义
//结点类定义
class LinkNode
{  friend  class List; 
   private: 
     LinkNode *link; 
     ElemType data;  
   public: 
     LinkNode (LinkNode *ptr = NULL)    {link=ptr;}
     LinkNode(const ElemType & item, LinkNode *ptr = NULL){  data=item;link=ptr;} 
     ~LinkNode(){}; 
}; 
//单链表类定义 

class List   

{  private:    

     LinkNode *first; //指向链表头结点的指针          

   public:

     List (ElemType x) { first = new LinkNode (x);}   // 带头结点

     ~List (){ MakeEmpty();}         //析构函数

     void MakeEmpty ( );      //线性表置空    

     void insert(ElemType val);   //在有序线性表中插入元素val

     void reverse();   //线性表的倒置

     void output();    //线性表的输出               

}; 

void List:: MakeEmpty ( )
 { LinkNode *q;
   while (  first->link != NULL ) 
	{ q = first->link;  //指向别摘下结点 
     first->link = q->link;//从链中摘下结点
     delete q;        //释放摘下的结点 
    }
};	
void List ::output ( )
{  LinkNode  *p=first->link; 
   while(p!=NULL)
   { if(p==first->link) cout<<p->data;

     else  cout<<" "<<p->data;
     p=p->link;
   }
   cout<<endl;
}
/*

**************************************************

请写出 insert 成员函数

**************************************************

**************************************************

请写出 reverse 成员函数

**************************************************

*/

int  main()
{   List list(0);
    ElemType endTag=0;
    ElemType val;
    //下面通过不断读入元素,插入到有序单链表中,建立从小到大的有序单链表
    cin>>val;
    while(val!=endTag) 
     {  list.insert(val);     //在有序表中插入一个元素

        cin>>val;  

      }
    list.reverse ();   //线性表倒置
    cout<<"The result is:"<<endl;
    list.output ();
    return 0;
}

解题思路:
1.补全代码insert
插入排序按照从小到 一边插入一边排序
2.reverse()
正序遍历用辅助数组记录数值反序输入原线性表

实现代码

void List::insert(ElemType val) {
	LinkNode *p = new LinkNode(val);
	LinkNode *tem = first->link;
    LinkNode *pritem = first;//tem的前驱
	if(first->link == NULL) {
	//初始adl为空直接插入
		first->link = p;
		return;
	}
	while(tem && p->data > tem->data) {
	   插入结点数据大于指针tem指向数据或tem到数据最后
		pritem = pritem->link;
		tem =tem->link;
	}
	p->link = pritem->link;//插入
	pritem->link=p;
}

void List::reverse() {
	LinkNode *p = first->link;
	ElemType num=0,*n;
	while(p!=NULL) {
		num++;
		p=p->link;
	}//确定辅助数组大小
	p = first->link;
	n = new ElemType[num]();
	num = 0;
	while(p!=NULL)  {
		n[num] = p->data;//正序记录
		num++;
		p = p->link;
	}
	p = first->link;
	for(int i =num-1; i>=0; i-- ) {
		p->data = n[i];//反序覆盖
		p=p->link;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HuangDXian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值