一.顺序表
用数组实现。尾插尾删较容易,头插头删需使用循环平移元素。
- 注意插入元素时判断容量,以及扩容方式。
#include<iostream>
using namespace std;
#define SIZE 10
template <class T>
class seqlist1 {
public:
seqlist1()
:capacity(SIZE)
,size(0)
{
array = new T[SIZE];
}
~seqlist1() {
delete array;
capacity = 0;
size = 0;
}
void pushback(T a) {
if (size == capacity) {
T * temp = new T[SIZE*2];
memset(temp, 0, sizeof(T)*SIZE*2);
memcpy(temp, array, SIZE * sizeof(T));
delete[]array;
array = temp;
capacity = SIZE * 2;
}
array[size++] = a;
}
void popback() {
if(size!=0)
size--;
}
void pushfront(T a) {
if (size >= capacity) {
T * temp = new T[SIZE * 2];
memset(temp, 0, sizeof(T)*SIZE * 2);
memcpy(temp, array, SIZE * sizeof(T));
delete[]array;
array = temp;
capacity = SIZE * 2;
}
for (int i = size; i > 0; i--) {
array[i] = array[i-1];
}
array[0] = a;
size++;
}
void popfront() {
if (size > 0) {
for (size_t i = 0; i < size - 1; i++) {
array[i] = array[i + 1];
}
size=size-1;
}
}
int find(T a) {
size_t i;
if (size == 0)
return -1;
else {
for (i = 0; i < size; i++) {
if (array[i] == a)
return i;
}
return -1;
}
}
int insert(T a, int pos) {
if (size >= capacity) {
T * temp = new T[SIZE * 2];
memset(temp, 0, sizeof(T)*SIZE * 2);
memcpy(temp, array, SIZE * sizeof(T));
array = temp;
delete[]temp;
capacity = SIZE * 2;
}
for (int i = size; i > pos; i--) {
array[i] = array[i - 1];
}
array[pos] = a;
size++;
}
void earse(int pos) {
for (size_t i = pos; i < size-1; i++) {
array[i] = array[i + 1];
}
size--;
}
void print() {
for (size_t i = 0; i <= size - 1; i++) {
cout << array[i] << " ";
}
}
private:
T * array;
size_t size;
size_t capacity;
};
int main() {
seqlist1<int> a1;
return 0;
}
二.链表
- 用一个类来封装结点,用一个类来实现功能
- 链表真的不好用
#include<iostream>
using namespace std;
#define SIZE 10
class Node {
public:
int date;
Node * ptr;
};
class sList {
public:
sList(int a)
{
head = new Node;
head->ptr = NULL;
head->date = a;
}
~sList() {
Node *p;
while (head) {
p = head;
head = head->ptr;
delete p;
}
head = NULL;
}
void pushfront(int a) {
Node * jd = new Node;
jd->date = a;
jd->ptr = head;
head = jd;
}
void popfront() {
if (head == NULL) {
return;
}
else if (head->ptr == nullptr) {
delete head;
head = nullptr;
}
else {
Node* temp = head;
head = head->ptr;
delete temp;
temp = NULL;
}
}
Node* find(int a) {
Node* temp = head;
while (temp->date != a && temp->ptr != nullptr) {
temp=temp->ptr;
if (temp->date == a) {
return temp;
}
}
}
void earse(int a) {
if (head->date == a) {
popfront();
}
Node* temp = head;
if (temp->ptr != nullptr) {
while (temp->ptr->ptr != nullptr) {
if (temp->ptr->date == a) {
temp->ptr = temp->ptr->ptr;
}
temp = temp->ptr;
}
}
}
void print() {
Node* temp = head;
while (temp->ptr != nullptr) {
cout << temp->date << "->";
temp = temp->ptr;
}
cout <<temp->date<< endl;
return ;
}
private:
Node * head;
};
int main() {
sList a1(5);
return 0;
}