【数据结构】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;
}
原创文章 77 获赞 57 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43550839/article/details/104334667