数据结构与算法分析-代码


参考书籍:[1]Clifford A.Shaffer.数据结构与算法分析[M].北京:电子工业出版社,2020.

Chapter 4 Lists, Stacks and Queues

4.1 Lists 线性表

4.1.1 Array-based Lists 顺序表

arraylist.h

#pragma once
#include<iostream>
using namespace std;

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

	~List()
	{
   
		delete[] listArray;
	}

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

	void insert(const E& item)//在curr处加一个元素并把其它元素后移
	{
   
		if (listSize >= maxSize)
		{
   
			cout << "List capacity exceeded" << endl;
			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)
		{
   
			cout << "List capacity exceeded" << endl;
			return;
		}
		listArray[listSize++] = item;
	}

	void remove()//除去curr处的元素并把其它元素前移
	{
   
		if (curr < 0 || curr >= listSize)
		{
   
			cout << "No element" << endl;
			return;
		}
		//E it = listArray[curr];可以返回删除的值
		for (int i = curr; i < listSize - 1; i++)
			listArray[i] = listArray[i + 1];
		listSize--;
		return;
	}

	void printlist()//打印列表元素
	{
   
		int i = 0;
		while (i != listSize)
		{
   
			cout << listArray[i] << ' ';
			i++;
		}
	}

	void moveToStart()//curr移到头部
	{
   
		curr = 0;
	}

	void moveToEnd()//curr移到尾部
	{
   
		curr = listSize;
	}

	void prev()//curr前移
	{
   
		if (curr != 0) curr--;
	}

	void next()//curr后移
	{
   
		if (curr < listSize) curr++;
	}

	int length() const//返回列表长度
	{
   
		return listSize;
	}

	int currPos() const//返回curr位置
	{
   
		return curr;
	}

	void moveToPos(int pos)//curr移到pos位置
	{
   
		if (pos < 0 || pos >= listSize)
		{
   
			cout << "No current element" << endl;
			return;
		}
		curr = pos;
	}

	const E& getValue() const//返回curr的值
	{
   
		if (curr < 0 || curr >= listSize)
		{
   
			cout << "No current element" << endl;
			return 0;
		}
		return listArray[curr];
	}
};

模板一般整个放到头文件中
模板会在被使用的时候实例化,在这之前并不会生成二进制的机器码,所以必须在用到的地方被引入,如果把实现放到cpp里的话,引用到这个模板的地方虽然包含了相应的头文件知道有符号(比如函数)的存在,却不知道这个符号到底要做什么(函数没有实现),就会出错。–引用老师的解释

arraylist.cpp

#include"list.h"
#include<iostream>

int main()
{
   
	List<int> a(10); 
	a.append(1);
	a.append(2);
	a.append(3);
	a.moveToPos(2);
	a.insert(4);
	a.moveToStart();
	a.remove();
	a.printlist();
	return 0;//结果输出2 4 3
}

4.1.2 Singly Linked List 单链表

用单链表实现排序功能

#include<iostream>
using namespace std;

template<class T>
class node
{
   
public:
	T data;  
	node* next; 
	node()
	{
   
		data = 0;
		next = NULL;
	}
	node(T d, node* next = NULL)
	{
   
		data = d;
		next = next;
	}
};

template<class T>
class List:public node<T>
{
   
private:
	node<T>* head;
	node<T>* tail;
	node<T>* curr;
	int  size;  
public:
	List(T a[],int size)
	{
   
		size = size;
		curr = tail = head = new node<T>();
		for (int i = 0; i < size; i++)
		{
   
			curr->next = new node<T>(a[i], NULL);
			tail = curr->next;
			curr =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值