【數據結構】C++實現(一)

一.順序表

用數組實現。尾插尾刪較容易,頭插頭刪需使用循環平移元素。

  • 注意插入元素時判斷容量,以及擴容方式。
#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章