这学期开始学数据结构了,然而学校教材都是写的伪代码,真的要掌握还是需要课后自己用c++复现。看到有大神平常会把学习的内容以博客的形式记录下来,从而帮助自己总结和归纳知识点,我也打算尝试一下这种方法。今后会把自己常用的数据结构实现方法记录在这里,也当是对自己的学习做回顾和总结。
新手入门 请多指教 有错轻喷
规范名称
节点:Node
链表:LinkedList
头文件
#include<iostream> using namespace std;定义结点
//定义结点 struct Node { public: int val;//存储数据 Node* next;//指针域 //构造函数 Node(int v = 0) :val(v), next(NULL) {} };定义单链表类
(本帖中单链表均有头结点)
class LinkedList { public: Node* head;//头结点 int size; LinkedList()//构造函数 { head = new Node; size = 0; } //以下部分可插入更多功能函数 };不同功能的实现
(所有功能都以内置在LinkedList内的函数实现,函数的插入位置已在上方注解标明)
初始化
前插法实现逆序输入初始化
//已知插入个数len,前插法实现逆序输入初始化。 //如果未知插入个数,那么while条件为(cin>>v),函数参数列表为空,while下方的cin>>v删去 void Init_R(int len) { int v; while (len--) { cin >> v; Node* p = new Node(v); p->next = head->next; head->next = p; size++; } return; }后插法实现顺序输入初始化
//已知插入个数len,后插法实现顺序输入初始化。 //如果未知插入个数,那么while条件为(cin>>v),函数参数列表为空,while下方的cin>>v删去 void Init(int len) { int v; Node* tail = head;//tail指向当前链表末尾,从头结点开始 while (len--) { cin >> v; Node* p = new Node(v); tail->next = p; tail = p; size++; } return; }插入结点
//在下标为i的地方插入元素e bool insert(int i, int e) { if (i<0 || i>size) return 0;//判断下标i是否合法 Node* p = head;//p指向插入的前一个位置 while (i--) { p = p->next;//移动p } Node* newnode = new Node(e); newnode->next = p->next; p->next = newnode; size++; return 1; }删除结点
//删除下标为i的元素 bool remove(int i) { if (i<0 || i>size - 1) return 0;//注意这里的i最大只能到size-1,而插入可以到size Node* p = head;//p指向删除的前一个位置 while (i--) { p = p->next; } Node* temp = p->next;//temp用于过渡,让p能跳过下一个指向下下个结点 p->next = temp->next; size--; return 1; }取值
//返回下标为i的结点的值,存入e中 bool getval(int i, int& e) { if (i<0 || i>size - 1) return 0;//判断下标i是否合法 Node* p = head; for (int j = 0; j <= i; j++)//因为p从头结点开始遍历链表,所以需要移动i+1次才能移动到下标i处 { p = p->next; } e = p->val; return 1; }查找
//查找第一个等于e的元素的下标,-1表示没有找到 int find_first(int e) { Node* p = head->next;//p从下标0开始遍历链表 int index = 0; while (p) { if (p->val == e) { return index; } else { p = p->next; index++; } } if (!p) return -1; }遍历
//从头开始遍历链表(以输出为例) void Print() { Node* p = head->next; while (p) { cout << p->val << " "; p = p->next; } cout << endl; return; }销毁链表
//销毁链表 void deletelist() { Node* p = head; while (p) { Node* temp = p->next;//temp存放下一个结点; delete p; p = temp; } head = NULL; size = 0; return; }在主函数中新建链表
int main() { LinkedList L; return 0; }