线性表
1.顺序表
需求分析
/*
创建顺序表
具体功能:
初始化顺序表
销毁顺序表
获取顺序表元素个数
输出顺序表中的内容
自动扩容
增 --- 插入数据(包含了尾部添加功能)
删 --- 删除数据(包含了尾部删除功能)
改 --- 修改数据
查 --- 查找数据
尾部追加
尾部删除
*/
C语言实现
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int dataType;
typedef struct SeqList {
dataType* arr;
int capacity;
int size;
}SeqList;
bool initList(SeqList&, int);
void destroyList(SeqList&);
int sizeList(SeqList&);
void printList(SeqList&);
bool expandList(SeqList&, int);
bool insertList(SeqList&, dataType, int);
bool deleteList(SeqList&, int);
bool modifyList(SeqList&, dataType, int);
int findList(SeqList&, dataType);
bool appendList(SeqList&, dataType);
bool popList(SeqList&);
int main()
{
SeqList myList;
bool res = initList(myList, 5);
(res == true) ? printf("顺序表初始化成功!\n") : printf("顺序表初始化失败!\n");
int size = sizeList(myList);
printf("顺序表中元素的个数:%d\n", size);
printList(myList);
insertList(myList, 10, 0);
insertList(myList, 20, 0);
insertList(myList, 30, 0);
insertList(myList, 40, 0);
printList(myList);
deleteList(myList, 2);
printList(myList);
modifyList(myList, 66, 2);
printList(myList);
int searchTarget = 40;
int index = findList(myList, searchTarget);
printf("元素%d的下标:%d\n", searchTarget, index);
appendList(myList, 50);
printList(myList);
popList(myList);
printList(myList);
destroyList(myList);
char justPause = getchar();
return 0;
}
bool initList(SeqList& sl, int capacity)
{
sl.arr = (dataType*)malloc(sizeof(dataType) * capacity);
if (sl.arr == NULL) return false;
sl.capacity = capacity;
sl.size = 0;
return true;
}
void destroyList(SeqList& sl)
{
free(sl.arr);
sl.arr = NULL;
sl.size = 0;
sl.capacity = 0;
}
int sizeList(SeqList& sl)
{
return sl.size;
}
void printList(SeqList& sl)
{
printf("[ ");
for (int i = 0; i < sl.size; i++)
{
printf("%d, ", sl.arr[i]);
}
printf("]\n");
}
bool expandList(SeqList& sl, int size)
{
dataType* p = (dataType*)malloc(sizeof(dataType) * (sl.capacity + size));
if (sl.arr == NULL) return false;
for (int i = 0; i < sl.size; i++)
{
p[i] = sl.arr[i];
}
free(sl.arr);
sl.capacity += size;
sl.arr = p;
p = NULL;
return true;
}
bool insertList(SeqList& sl, dataType element, int index)
{
if (index < 0 || index > sl.size) return false;
if (sl.size == sl.capacity)
{
if (expandList(sl, 10) == false) return false;
}
for (int i = sl.size; i > index; --i)
{
sl.arr[i] = sl.arr[i - 1];
}
sl.arr[index] = element;
sl.size++;
return true;
}
bool deleteList(SeqList& sl, int index)
{
if (sl.size == 0) return false;
if (index < 0 || index > sl.size - 1) return false;
for (int i = index; i < sl.size - 1; i++)
{
sl.arr[i] = sl.arr[i + 1];
}
sl.size--;
return true;
}
bool modifyList(SeqList& sl, dataType element, int index)
{
if (index < 0 || index > sl.size - 1) return false;
sl.arr[index] = element;
return true;
}
int findList(SeqList& sl, dataType element)
{
for (int i = 0; i < sl.size; i++)
{
if (sl.arr[i] == element) return i;
}
return -1;
}
bool appendList(SeqList& sl, dataType element)
{
return insertList(sl, element, sl.size);
}
bool popList(SeqList& sl)
{
return deleteList(sl, sl.size - 1);
}
C++实现
#include <iostream>
template<class T>
class SeqList
{
private:
T* arr;
int capacity;
int size;
public:
SeqList();
~SeqList();
int sizeList();
void printList();
bool expandList();
bool insertList(T, int);
bool deleteList(int);
bool modifyList(T, int);
int findList(T);
bool appendList(T);
bool popList();
};
int main()
{
SeqList<int> sl;
int size = sl.sizeList();
printf("顺序表中元素的个数:%d\n", size);
sl.printList();
sl.insertList(10, 0);
sl.insertList(20, 0);
sl.insertList(30, 0);
sl.insertList(40, 0);
sl.printList();
sl.deleteList(2);
sl.printList();
sl.modifyList(66, 2);
sl.printList();
int searchTarget = 40;
int index = sl.findList(searchTarget);
printf("元素%d的下标:%d\n", searchTarget, index);
sl.appendList(50);
sl.printList();
sl.popList();
sl.printList();
system("pause");
return 0;
}
template<class T>
SeqList<T>::SeqList()
{
this->arr = new T[capacity];
this->capacity = capacity;
this->size = 0;
}
template<class T>
SeqList<T>::~SeqList()
{
delete this->arr;
this->capacity = 0;
this->size = 0;
}
template<class T>
int SeqList<T>::sizeList()
{
return this->size;
}
template<class T>
void SeqList<T>::printList()
{
std::cout << "[ ";
for (int i = 0; i < this->size; i++)
{
std::cout << this->arr[i] << ", ";
}
std::cout << "]" << std::endl;
}
template<class T>
bool SeqList<T>::expandList()
{
T* temp = new T[this->capacity + 10];
if (temp == nullptr) return false;
for (int i = 0; i < this->size; i++)
{
temp[i] = this->arr[i];
}
delete this->arr;
this->arr = temp;
this->capacity += size;
temp = nullptr;
return true;
}
template<class T>
bool SeqList<T>::insertList(T element, int index)
{
if (index < 0 || index > this->size) return false;
if (this->size == this->capacity) expandList();
for (int i = size; i > index; i--)
{
this->arr[i] = this->arr[i - 1];
}
this->arr[index] = element;
this->size++;
return true;
}
template<class T>
bool SeqList<T>::deleteList(int index)
{
if (index < 0 || index > this->size - 1) return false;
for (int i = index; i < this->size - 1; i++)
{
this->arr[i] = this->arr[i + 1];
}
this->size--;
return true;
}
template<class T>
bool SeqList<T>::modifyList(T element, int index)
{
if (index < 0 || index > this->size - 1) return false;
this->arr[index] = element;
return true;
}
template<class T>
int SeqList<T>::findList(T element)
{
for (int i = 0; i < this->size; i++)
{
if (this->arr[i] == element) return i;
}
return -1;
}
template<class T>
bool SeqList<T>::appendList(T element)
{
return insertList(element, this->size);
}
template<class T>
bool SeqList<T>::popList()
{
return deleteList(this->size - 1);
}
2.链表
需求分析
C语言实现
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int dataType;
typedef struct Node
{
dataType data;
Node* next;
}Node;
void init(Node*);
int size(Node*);
void print(Node*);
bool insert(Node*, dataType, int);
bool remove(Node*, int);
bool modify(Node*, dataType, int);
int find(Node*, dataType);
bool append(Node*, dataType);
bool pop(Node*);
void destroy(Node*);
int main()
{
Node headNode;
init(&headNode);
printf("链表元素的个数:%d\n", size(&headNode));
print(&headNode);
insert(&headNode, 66, 1);
insert(&headNode, 77, 1);
insert(&headNode, 88, 1);
print(&headNode);
remove(&headNode, 1);
print(&headNode);
modify(&headNode, 99, 0);
print(&headNode);
int index = find(&headNode, 66);
(index == -1) ? printf("查找不到此数据!\n") : printf("查到此数据的下标:%d\n", index);
append(&headNode, 6666);
print(&headNode);
pop(&headNode);
print(&headNode);
destroy(&headNode);
char justPause = getchar();
return 0;
}
void init(Node* node)
{
node->next = NULL;
}
int size(Node* node)
{
int size = 1;
while (node->next)
{
size++;
node = node->next;
}
return size;
}
void print(Node* node)
{
printf("(*) -> ");
while (node->next)
{
node = node->next;
printf("%d -> ", node->data);
}
printf("\n");
}
bool insert(Node* node, dataType element, int index)
{
if (index < 1) return false;
while (--index)
{
node = node->next;
if (node == NULL) return false;
}
Node* temp = (Node*)malloc(sizeof(Node));
if (temp == NULL) return false;
temp->data = element;
temp->next = node->next;
node->next = temp;
return true;
}
bool remove(Node* node, int index)
{
if (index < 1) return false;
while (--index)
{
node = node->next;
if (node == NULL) return false;
}
Node* temp = node->next;
node->next = node->next->next;
free(temp);
return true;
}
bool modify(Node* node, dataType element, int index)
{
if (index < 1) return false;
while (--index)
{
node = node->next;
if (node == NULL) return false;
}
node->next->data = element;
return true;
}
int find(Node* node, dataType element)
{
int index = 0;
while (node->next)
{
node = node->next;
index++;
if (node->data == element) return index;
}
return -1;
}
bool append(Node* node, dataType element)
{
while (node->next)
{
node = node->next;
}
Node* temp = (Node*)malloc(sizeof(Node));
if (temp == NULL) return false;
temp->data = element;
temp->next = NULL;
node->next = temp;
return true;
}
bool pop(Node* node)
{
if (node->next == NULL) return false;
Node* prev = NULL;
while (node->next)
{
prev = node;
node = node->next;
}
free(node);
prev->next = NULL;
return true;
}
void destroy(Node* node)
{
Node* temp = NULL;
while (node->next)
{
temp = node->next;
node->next = node->next->next;
free(temp);
}
}
C++实现
#include<iostream>
template <class T>
class Node
{
public:
T data;
Node<T>* next;
Node()
{
this->next = nullptr;
}
~Node()
{
this->next = nullptr;
}
};
template<class T = int>
class Link
{
private:
Node<T>* head;
int size;
public:
Link();
~Link();
int getSize();
void printLink();
bool insert(T, int);
bool remove(int);
bool modify(T, int);
int find(T);
bool append(T);
bool pop();
};
int main()
{
Link<> myLink;
printf("链表元素的个数:%d\n", myLink.getSize());
myLink.printLink();
myLink.insert(66, 1);
myLink.insert(77, 1);
myLink.insert(88, 1);
myLink.insert(99, 1);
myLink.printLink();
myLink.remove(1);
myLink.printLink();
myLink.modify(100, 2);
myLink.printLink();
int index = myLink.find(66);
(index == -1) ? printf("查找不到此数据!\n") : printf("查到此数据的下标:%d\n", index);
myLink.append(1024);
myLink.printLink();
myLink.pop();
myLink.printLink();
system("pause");
return 0;
}
template<class T>
Link<T>::Link()
{
this->head = new Node<T>;
this->size = 1;
}
template<class T>
Link<T>::~Link()
{
Node<T>* temp = nullptr;
while (this->head->next)
{
temp = this->head->next;
this->head->next = this->head->next->next;
delete temp;
}
delete this->head;
this->head = nullptr;
this->size = 0;
}
template<class T>
int Link<T>::getSize()
{
return this->size;
}
template<class T>
void Link<T>::printLink()
{
Node<T>* temp = this->head->next;
std::cout << "(*) -> ";
while (temp)
{
std::cout << temp->data << " -> ";
temp = temp->next;
}
std::cout << std::endl;
}
template<class T>
bool Link<T>::insert(T data, int index)
{
if (index < 1 || index > this->size) return false;
Node<T>* targetNodePre = this->head;
for (int i = 0; i < index - 1; i++)
{
targetNodePre = targetNodePre->next;
}
Node<T>* newNode = new Node<T>;
newNode->data = data;
newNode->next = targetNodePre->next;
targetNodePre->next = newNode;
this->size++;
return true;
}
template<class T>
bool Link<T>::remove(int index)
{
if (index < 1 || index > this->size) return false;
Node<T>* targetNodePre = this->head;
for (int i = 0; i < index - 1; i++)
{
targetNodePre = targetNodePre->next;
}
Node<T>* temp = targetNodePre->next;
targetNodePre->next = targetNodePre->next->next;
delete temp;
this->size--;
return true;
}
template<class T>
bool Link<T>::modify(T data, int index)
{
if (index < 1 || index > this->size) return false;
Node<T>* targetNodePre = this->head;
for (int i = 0; i < index - 1; i++)
{
targetNodePre = targetNodePre->next;
}
targetNodePre->next->data = data;
return true;
}
template<class T>
int Link<T>::find(T data)
{
int index = 0;
Node<T>* targetNodePre = this->head;
while (targetNodePre->next)
{
targetNodePre = targetNodePre->next;
index++;
if (targetNodePre->data == data) return index;
}
return -1;
}
template<class T>
bool Link<T>::append(T data)
{
return insert(data, this->size);
}
template<class T>
bool Link<T>::pop()
{
return remove(this->size - 1);
}
3.扩展
双向链表
#include<iostream>
template<class T>
class Node
{
public:
T data;
Node* next;
Node* prev;
Node()
{
this->next = nullptr;
this->prev = nullptr;
}
~Node()
{
this->next = nullptr;
this->prev = nullptr;
}
};
template<class T = int>
class Link
{
private:
Node<T>* head;
int size;
public:
Link()
{
this->head = new Node<T>;
this->size = 1;
}
~Link()
{
Node<T>* temp = nullptr;
while (this->head->next)
{
temp = this->head->next;
this->head->next = this->head->next->next;
delete temp;
}
delete this->head;
this->head = nullptr;
this->size = 0;
}
bool insert(T data, int index)
{
if (index < 1 || index > this->size) return false;
Node<T>* targetNodePre = this->head;
for (int i = 1; i < index; i++)
{
targetNodePre = targetNodePre->next;
}
Node<T>* newNode = new Node<T>;
newNode->data = data;
newNode->next = targetNodePre->next;
newNode->prev = targetNodePre;
if (targetNodePre->next != nullptr) targetNodePre->next->prev = newNode;
targetNodePre->next = newNode;
this->size++;
return true;
}
bool remove(int index)
{
if (index < 1 || index > this->size - 1) return false;
Node<T>* targetNode = this->head;
for (int i = 1; i <= index; i++)
{
targetNode = targetNode->next;
}
if (targetNode->next != nullptr) targetNode->next->prev = targetNode->prev;
targetNode->prev->next = targetNode->next;
delete targetNode;
this->size--;
return true;
}
void printLink()
{
std::cout << "(*) <==> ";
Node<T>* temp = this->head;
while (temp->next)
{
temp = temp->next;
std::cout << temp->data << " <==> ";
}
std::cout << std::endl;
}
};
int main()
{
Link<int> myLink;
myLink.printLink();
myLink.insert(10, 1);
myLink.printLink();
myLink.insert(20, 2);
myLink.printLink();
myLink.insert(30, 3);
myLink.printLink();
myLink.remove(1);
myLink.printLink();
myLink.remove(1);
myLink.printLink();
myLink.remove(1);
myLink.printLink();
system("pause");
return 0;
}
循环链表
特殊线性表
1.栈
通过顺序表实现
#include<iostream>
#include<string>
using namespace std;
template<class T>
class Stack
{
public:
T* arr;
int capacity;
int top;
Stack()
{
this->arr = new T[10];
this->capacity = 10;
this->top = -1;
}
~Stack()
{
delete[] this->arr;
this->capacity = 0;
this->top = -1;
}
Stack& push(T data)
{
top++;
this->arr[top] = data;
return *this;
}
Stack& pop()
{
top--;
return *this;
}
void show()
{
string symbol = "";
for (int i = 0; i <= top; i++)
{
symbol += "----";
}
cout << "*" << symbol << endl << "| ";
for (int i = 0; i <= top; i++)
{
std::cout << this->arr[i] << " ";
}
cout << endl << "*" << symbol << endl << endl;
}
};
int main()
{
Stack<int> s;
s.push(10);
s.push(20);
s.push(30).show();
s.pop().show();
s.pop().show();
s.pop().show();
system("pause");
return 0;
}
通过链表实现
#include<iostream>
#include<string>
using namespace std;
template<class T>
class Node
{
public:
T data;
Node* next;
Node()
{
this->next = nullptr;
}
};
template<class T>
class Stack
{
public:
Node<T>* head;
int size;
Stack()
{
this->head = new Node<T>;
this->size = 0;
}
~Stack()
{
Node<T>* temp = nullptr;
while (this->head->next)
{
temp = this->head->next;
this->head->next = this->head->next->next;
delete temp;
}
delete this->head;
this->head = nullptr;
this->size = 0;
}
Stack& push(T data)
{
Node<T>* newNode = new Node<T>;
newNode->data = data;
newNode->next = this->head->next;
this->head->next = newNode;
size++;
return *this;
}
Stack& pop()
{
Node<T>* temp = nullptr;
if (this->head->next)
{
temp = this->head->next;
this->head->next = this->head->next->next;
delete temp;
}
size--;
return *this;
}
void show()
{
string symbol = "";
for (int i = 0; i < this->size; i++)
{
symbol += "----";
}
cout << "*" << symbol << endl << "| ";
if (this->size == 0)
{
cout << endl << "*" << symbol << endl << endl;
return;
}
Node<T>** arr = new Node<T>*[this->size];
int index = 0;
Node<T>* temp = this->head;
while (temp->next)
{
temp = temp->next;
arr[index] = temp;
index++;
}
for (int i = this->size - 1; i > -1; i--)
{
std::cout << arr[i]->data << " ";
}
cout << endl << "*" << symbol << endl << endl;
delete[] arr;
}
};
int main()
{
Stack<int> s;
s.push(10);
s.push(20);
s.push(30).show();
s.pop().show();
s.pop().show();
s.pop().show();
system("pause");
return 0;
}
2.队列
通过顺序表实现
// C++
#include<iostream>
#include<string>
using namespace std;
// 队列所存储数据的类型
typedef int E;
// 队列 (通过顺序表实现循环队列)
class Queue
{
public:
E* arr; // 用于记录队列的内存地址
int capacity; // 用于记录队列的容量
int size; // 用于记录队列中元素的个数
int front; // 用于记录队首位置
int rear; // 用于记录队尾位置
Queue()
{
this->capacity = 5;
this->arr = new E[this->capacity];
this->size = 0;
this->front = this->rear = 0;
}
~Queue()
{
delete[] this->arr;
this->arr = nullptr;
this->capacity = 0;
this->size = 0;
this->front = this->rear = 0;
}
// 入队
Queue& enqueue(E data)
{
// 判断队列是否已满
if (this->size == this->capacity) return *this;
// 循环入队
this->arr[rear] = data;
this->size++;
this->rear++;
this->rear %= this->capacity; // 循环队列的核心算法
return *this;
}
// 出队
Queue& dequeue()
{
// 判断队列是否为空
if (size == 0) return *this;
// 循环出队
this->front++;
this->size--;
this->front %= this->capacity; // 循环队列的核心算法
return *this;
}
// 输出
void show()
{
string symbol = "";
for (int i = 0; i < this->size; i++)
{
symbol += "<<<<";
}
if (this->size == 0) symbol = "<<<<";
cout << symbol << endl;
for (int i = this->front; i < this->front + this->size; i++)
{
cout << this->arr[i % this->capacity] << " ";
}
cout << endl << symbol << endl << endl;
}
};
int main()
{
Queue q; // 创建并初始化队列
q.show(); // 输出队列里面的内容
// 入队
q.enqueue(10).show();
q.enqueue(20).show();
q.enqueue(30).show();
// 出队
q.dequeue().show();
q.dequeue().show();
q.dequeue().show();
system("pause");
return 0;
}
通过链表实现
#include<iostream>
#include<string>
using namespace std;
typedef int E;
class Node
{
public:
E data;
Node* next;
Node()
{
this->next = nullptr;
}
};
class Queue
{
public:
Node* head;
Node* tail;
int size;
Queue()
{
this->head = new Node;
this->tail = this->head;
this->size = 0;
}
~Queue()
{
Node* temp = nullptr;
while (this->head->next)
{
temp = this->head->next;
this->head->next = this->head->next->next;
delete temp;
}
delete this->head;
this->head = this->tail = nullptr;
this->size = 0;
}
Queue& enqueue(E data)
{
Node* newNode = new Node;
newNode->data = data;
newNode->next = nullptr;
this->tail->next = newNode;
this->tail = newNode;
this->size++;
return *this;
}
Queue& dequeue()
{
Node* temp = nullptr;
if (this->head->next)
{
temp = this->head->next;
this->head->next = this->head->next->next;
delete temp;
}
this->size--;
return *this;
}
void show()
{
string symbol = "";
for (int i = 0; i < this->size; i++)
{
symbol += "<<<<";
}
if (this->size == 0) symbol = "<<<<";
cout << symbol << endl;
Node* temp = this->head;
while (temp->next)
{
temp = temp->next;
cout << temp->data << " ";
}
cout << endl << symbol << endl << endl;
}
};
int main()
{
Queue q;
q.show();
q.enqueue(10).show();
q.enqueue(20).show();
q.enqueue(30).show();
q.dequeue().show();
q.dequeue().show();
q.dequeue().show();
system("pause");
return 0;
}