数据结构实验--------线性表的实现

   使用的教材是电子工业出版社出版的《Data Structures and Algorithm Analysis in C++  》(《数据结构与算法分析(C++)》(第三版)),作者是【美】Clifford A Shaffer,译者是张铭、刘晓丹等。所以,有些代码与书上给出来的几近相同,如有侵权,请联系本人(741239458@qq.com),我会删除文章的。

        

       ----ListADT.h-------

#ifndef LIST
#define LIST

template<typename E> class List
{
private :
	void operator = (const List& ){}
	List (const List&){}
public :
	List() {}
	virtual ~List() {}
	virtual void clear() = 0;
	virtual void insert(const E& item ) = 0;
	virtual void append(const E& item ) = 0;
	virtual E remove() = 0;
	virtual void moveToStart() = 0;
	virtual void moveToEnd() = 0;
	virtual void prev() = 0;
	virtual void next() = 0 ;
	virtual int length() const = 0;
	virtual int currPos() const = 0;
	virtual void moveToPos(int pos) = 0;
	virtual const E& getValue() const = 0;
};

template<typename E>
class Alist:public List<E>
{
private :
	int listSize;
	int maxSize;
	int curr;
	E* listArray;
public :
	Alist (int size=50)
	{
		maxSize = size;
		listSize = curr = 0;
		listArray = new E[maxSize];
	}
	~Alist() { delete[] listArray; }

	void clear()
	{
		delete [] listArray;
		listSize = curr =0;
		listArray = new E[maxSize];
	}

	void insert(const E& item)
	{
		if(listSize>=maxSize)
			return;
		for(int i=listSize;i>curr;i--)
		{
			listArray[i] = listArray[i-1];
		}
		listArray[curr] = item;
		listSize++;
	}

	void append(const E&item)
	{
		if(listSize>=maxSize)
			return;
		listArray[listSize++] = item;
	}

	E remove()
	{
		E temp = listArray[curr];
		listSize--;
		for(int i=curr;i<listSize;i++)
		{
			listArray[i] = listArray[i+1];
		}
		return temp;
	}

	void moveToStart()
	{
		curr = 0;
	}

	void moveToEnd()
	{
		curr = listSize-1;
	}

	void prev()
	{
		if(curr==0)
			return;
		curr--;
	}

	void next()
	{
		if(curr==listSize-1)
			return ;
		curr++;
	}

	int length() const
	{
		return listSize;
	}

	int currPos() const
	{
		return curr;
	}

	void moveToPos(int pos)
	{
		if(pos>=listSize)
			return;
		curr = pos;
	}

	const E& getValue() const
	{
		return listArray[curr];
	}
};
#endif

----Main.cpp----

#include"ListADT.h"
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;

template<typename E> void print(Alist<E>& arrayList)
{
	arrayList.moveToStart();
	while(arrayList.currPos()<arrayList.length()-1)
	{
		cout<<arrayList.getValue()<<"  ";
		arrayList.next();
	}
	cout<<arrayList.getValue()<<endl;
}

int main()
{
	srand(int(time(0)));
	Alist<int> arrayList;
	cout<<"Input data are :"<<endl;
	for(int i=0;i<10;i++)
	{
		int temp = rand()/200;
		arrayList.append(temp);
	}
	print(arrayList);
	cout<<"\nInsert 99 to the position 6th"<<endl;
	arrayList.moveToPos(5);
	arrayList.insert(99);
	print(arrayList);
	cout<<"\nRemove the value on the position 3rd."<<endl;
	arrayList.moveToPos(2);
	arrayList.remove();
	print(arrayList);
	cout<<"\nAppend 999 ."<<endl;
	arrayList.append(999);
	print(arrayList);
	system("PAUSE");
}


运行截图:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
选题1:(易)实现顺序表各种基本运算的算法 参考实验指导书“实验题 1:实现顺序表各种基本运算的算法实现”。 选题2:(易)实现单链表各种基本运算的算法 参考实验指导书“实验题 2:实现单链表各种基本运算的算法实现”。 选题3:(易)编写算法实现二个有序的线性表的合并问题(存储结构可选:顺序表/单链表)。 参考课件“chap002线性表.ppt”相关例题。 选题4:(难)运用单向循环链表实现约瑟夫环的问题。 参考实验指导书“实验题 4:运用单向循环链表实现约瑟夫环的问题”。 选题5:(易)将元素X插入到链表中合适的位置。 完成习题集中的算法并编程实现:2.11。参考课件“chap002线性表习题讲解.ppt”2.11。 带头结点的单链表L,其中有n 个元素非递减有序排列,将元素X插入到链表中合适的位置。 提示:先创建链表,其中的元素值可由随机函数按阶段生成或键盘输入,先打印初始链表数据,然后插入新结点,再打印结果链表。 插入前: 插入后: 选题6:(易)删除表中所有大于mink且小于maxk的元素。 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。 参考实验指导书“实验题 5:删除有序单链表中所有大于 mink 且小于 maxk的元素”。 选题7:(中等)删除单链表中多余元素。 完成习题集中的算法并编程实现:2.20。参考课件“chap002线性表习题讲解.ppt”2.20。 已知单链表中的元素有序,写一算法,删除表中所有值相同的多余元素(使操作后线性表中的元素值均不相同),同时释放被删结点空间。 选题8:(易)实现单链表的就地逆置。 完成习题集中的算法并编程实现:2.22。参考课件“chap002线性表习题讲解.ppt”2.22。 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2...,an)逆置为(an,an-1,...,a1)。 选题9:(难)单链表拆分。 将带头结点的单链表LA中分拆成LB和LC两条单链表,LA中的data域为奇数的节点依次进入LB,而为偶数的节点进入LC。 参考课件“chap002线性表习题讲解.ppt”第35页例题。
实验目的: 1.熟悉线性表的概念和基本操作。 2.掌握线性表的顺序存储和链式存储方式,并能够进行相应的操作。 3.设计和实现基于线性表的图书信息管理系统。 实验内容: 1.线性表的概念和基本操作 线性表是由n个数据元素(a1,a2,……an)组成的有限序列,其中n为表长,当n=0时,称为空表。 线性表的基本操作包括:初始化、插入、删除、查找、遍历等。 2.线性表的顺序存储 线性表的顺序存储方式是将线性表中的元素按其逻辑顺序依次存放在一段连续的存储单元中,称为顺序表。 顺序表的基本操作包括:初始化、插入、删除、查找、遍历等。 3.线性表的链式存储 线性表的链式存储方式是将线性表中的元素存放在任意的存储单元中,通过指针将各个存储单元连接起来,称为链表。 链表的基本操作包括:初始化、插入、删除、查找、遍历等。 4.图书信息管理系统 图书信息管理系统是一种基于线性表的应用,主要用于管理图书信息。 图书信息管理系统的功能包括:添加图书信息、删除图书信息、查找图书信息、修改图书信息、显示图书信息等。 实验步骤: 1.设计数据结构,包括图书信息结构体、顺序表结构体、链表结构体等。 2.实现顺序表的基本操作,包括初始化、插入、删除、查找、遍历等。 3.实现链表的基本操作,包括初始化、插入、删除、查找、遍历等。 4.设计和实现图书信息管理系统,包括添加图书信息、删除图书信息、查找图书信息、修改图书信息、显示图书信息等功能。 5.测试和调试系统,确保系统能够正常运行。 实验总结: 本次实验主要学习了线性表的概念和基本操作,掌握了线性表的顺序存储和链式存储方式,并设计和实现了基于线性表的图书信息管理系统。通过本次实验,我深入了解了线性表的原理和应用,提高了数据结构的编程能力和实践能力,为以后的学习和应用打下了基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值