数据结构与算法分析--代码
参考书籍:[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 =