“数据结构与算法”平时测验二

■ 线性表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

#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<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;

}

答案:

void List::insert(ElemType val)
{
    LinkNode *n=new LinkNode;
    n->data=val;
    LinkNode *p=first;
    int flag=0;
    while(p->link!=NULL)
    {
        if(p->link->data>val)

        {n->link=p->link;
        p->link=n;
        flag=1;
        break;}
        p=p->link;
    }
    if(!flag) p->link=n;
}
void List::reverse()
{
    LinkNode *c=first;
    int cnt=0;
    while(c->link!=NULL)
    {
        cnt++;
        c=c->link;
    }
    if(cnt==1) return;
    if(cnt==2)
    {
    LinkNode *L=first->link;
    LinkNode *M=L->link;
    first->link=M;
    M->link=L;
    L->link=NULL;
    }
    else if(cnt>=3)
    {LinkNode *L=first->link;
    LinkNode *M=L->link;
    LinkNode *R=M->link;
    L->link=NULL;
    while(R->link!=NULL)
    {
        M->link=L;
        L=M;
        M=R;
        R=R->link;
    }
    R->link=M;
    M->link=L;
    first->link=R;
    return;}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值