数据结构-线性表的一些基础操作 c++代码

//线性表的顺序存储结构
template <class T>
class Linearlist
{
	public:
		Linearlist(int MaxListSize == 10);
		~Linearlist()
		{
			delete []element;
		}

		bool IsEmpty() const
		{
			return length == 0;
		}
		bool IsFull() const
		{
			return length == MaxSize;
		}
		int Length() const
		{
			return length;
		}

		bool Find(int k, T &item) const;
		int search(const T &item) const;
		void Delete(int k, T &item);
		void Insert(int k, const T &item);
	private:
		int MaxSize, length, T *element;
};

template <class T>
Linearlist<T>::Linearlist(int MaxListSize == 10)
{
	MaxSize = MaxListSize;
	element = new T[MaxSize];   //申请规模为MaxSize的数组空间
	length = 0;                // 初始时没有真正的表结点,故表长度为0
}

//存取:将下标为k的结点的字段值赋给item并返回true,若不存在则返回false;
template <class T>
bool Linearlist<T>::Find(int k, T &item)  const
{
	if (k < 0 || length == 0 || k >length-1)
	{
		cout << " unreasonable position or empty list!" << endl;
		return false;
	}
	else
	{
		item = element[k];
		return true;
	}
}

//查找:在表中查找字段值为item的结点并返回其下标;若表中没有item,则返回-1;
template <class T>
int Linearlist<T>::search(const T &item) const
{
	for (int k = 0; k <= length-1; k++)
	{
		if(element[k] == item)
			return k;
	}
	return -1;
}

//删除表中下表为k的结点并将其值赋给item
template <class T>
void Linearlist<T>::Delete(int k, T &item)
{
	if (find(k, item))   //若找到下标为k的结点,则将其后面所有结点均向前移动一个位置
	{
		for (int i=k; i<length; i++)
		{
			element[i] = element[i+1];
		}
		item = element[k];
		length--;
	}
}

//在下表为k的结点后插入item
template <class T>
void Linearlist<T>::Insert(int k, const T &item)
{
	if(IsFull())                   //若表已满,无法插入新结点
	{
		cout << "The list is full!" << endl;
		exit(1);
	}
	else if (k<0 || k>length-1)
	{
		cout << "The node does not exist!" << endl;
		exit(1);
	}
	else
	{
		for (i=length-1; i>=k+1; i--)
		{
			element[i+1] = element[i];
		}
	}
	element[k+1] = item;
	length++;
}

//单链表结点结构SLNode
template<class T>
struct SLNode
{
	T data;                      //数据域
	SLNode<T> *next;             //指针域

	SLNode(SLNode *nextNode = NULL)
	{
		next = nextNode;
	}

	SLNode(const T &item, SLNode *nextNode = NULL)
	{
		data = item;
		next = nextNode;
	}
};

// SLNode 的定义参考博文数据结构-栈的一些基础操作c++代码
//单链表的链式存储结构
template <class T>
class SLList
{
	public:
		SLList(){	head = new SLNode<T>()};   //构造函数,构造一个只有哨位结点的空表
		SLList(T &item);                       //构造函数
		~SLList();
		bool IsEmpty() const {return head->next == NULL;};
		int length() const;
//		bool Find(int k, T &item) const;
		int Search(const T &item) const;
		void Delete(int k, T &item);
		void Insert(int k, const T &item);
	private:
		SLNode<T> *head;
		SLNode<T> *tail;
		SLNode<T> *currptr;
};

//单链表的构造函数,生成一个只有哨位结点的空表
template<class T>
SLList<T>::SLList()
{
	head = tail = currptr = new SLNode<T>();
	size = 0;
}

//单链表的构造函数,生成含有哨位结点和一个表结点的表
template<class T>
SLList<T>::SLList(T &item)
{
	tail = currptr = new SLNode<T>(item);         //生成一个表结点
	head = new SLNode<T>(currptr);               //生成哨位结点
	size = 1;
}

//单链表的析构函数
template <class T>
SLList<T>::~SLList()
{
	while (!IsEmpty())
	{
		currptr =  head->next;
		head->next = currptr->next;
		delete currptr;
	}
	delete head;
}

//算法Insert
//在当前结点后插入一个data域值为item的结点
template <class T>
void SLList<T>::Insert(const T &item)
{
	currptr->next = new SLNode<T>(item, currptr->next);
	if (tail == currptr)
		tail = currptr->next;
	size++;
}

//在表尾插入一个data域值为item的结点
template <class T>
void SLList<T>::InsertFromTail(const T &item)
{
	tail->next = new SLNode<T>(item, NULL);
	tail = tail->next;
	size++;
}

//在哨位结点后插入
template <class T>
void SLList<T>::InsertFromHead(const T &item)
{
	if(IsEmpty())
	{
		head->next = new SLNode<T>(item, head->next);
		tail = head->next;
	}
	else
	{
		head->next = new SLNode<T>(item, head->next);
	}
	size++;
}

//算法Delete
//删除当前结点的后继结点并将其data值返回给变量de_item

template <class T>
bool SLList<T>::Delete(T &de_item)
{
	if(currptr == tail || IsEmpty())
	{
		cout << "No next node or empty list!";
		return false;
	}
	SLNode<T> *temp = currptr->next;
	currptr->next = temp->next;
	size--;
	de_item = temp->data;

	if(temp == tail)
		tail = currptr;
	delete temp;
	return true;
}

// 删除哨位结点后的第一个真正表结点并将其data值返回给变量de_item
template <class T>
bool SLList<T>::DeleteFromHead(T &de_item)
{
	if (IsEmpty())
	{
		cout << "Empty list!";
		return false;
	}

	SLNode<T> *temp = head->next;
	head->next = temp->next;
	size--;
	de_item = temp->data;
	if (temp == tail)
	{
		tail = head;
	}
	delete temp;
	return true;
}

//删除表尾结点并将其data值返回给变量de_item

template <class T>
bool SLList<T>::DeleteFromTail(T &de_item)
{
	if (IsEmpty())
	{
		cout << "Empty list!";
		return false;
	}
	//令当前指针指向表尾结点的前驱结点
	SetEnd();
	Prev();
	de_item = tail->data;
	currptr->next = NULL;
	size--;
	delete tail;
	tail = currptr;
	return true;
}

时间: 2024-08-02 11:02:01

数据结构-线性表的一些基础操作 c++代码的相关文章

数据结构线性表插入删除的示例

昨天留的作业,数据结构书和c语言书真的不一样,需要自己加加补补,今天写的时候迷迷瞪瞪的,反正在我电脑上能用. 数据结构线性表插入删除的示例: 代码: #include<iostream> #include<cstdio> using namespace std; #define list_init_size 100 #define listincrement 10 typedef struct { int *elem; int length; int listsize; }sqli

数据结构与算法-线性表顺序存储结构删除操作的实现

这一章节我们来看一下线性表顺序存储结构删除操作的简单实现 package com.ray.testobject; public class Test { private Object[] list; public Object[] getList() { return list; } /** * 初始化list * * @param num * 元素个数 */ private void iniList(int num) { list = new Object[num]; for (int i =

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

数据结构——线性表

提示:以下内容不适合零基础人员,仅供笔者复习之用. 一.线性结构的基本特征: 1.集合中必存在唯一的一个"第一元素": 2.集合中必存在唯一的一个 "最后元素": 3.除最后元素在外,均有 唯一的后继: 4.除第一元素之外,均有 唯一的前驱. 如:java中的List接口,就是线性表.ArrayList就是顺序线性表,LinkedList就是链表线性表. 二.线性表的基本操作: 1.InitList(*L): 初始化操作,建立一个空的线性表L. 2.ListEmpt

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之字符串

基本概念 串(字符串)  由0个或多个字符组成的有限序列,例如s="hello world" 串名  上例中的s 子串  某串任意连续字符组成的子序列,称为此字符串的子串 空串  0个字符的串,s="" 空格串  由一个或多个字符组成的串 模式匹配算法 作用 定位某子串T在字符串S中的位置 主串 S 模式串  T 针对模式匹配算法从简到难我们需要了解两种算法: [1] 朴素的模式匹配算法 [2] KMP匹配算法 朴素的模式匹配算法: 所谓朴素就是简单,这是一种简单的

数据结构-线性表(2)

线性表定义: 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构. 存储空间是否连续: 一.顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺