hello,欢迎来到笼包叔叔的博客,本篇文章将要介绍线性表的链式表示和实现。
链表储存结构的特点是用一组任意的储存单元存储线性表的数据元素(这组储存单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素a(i),与其直接后继数据元素a(i+1)之间的逻辑关系,对数据元素a(i)来说,除了储存其本身的信息之外,还需储存一个指示其后继的信息(即直接后继的储存位置)。这两部分信息组成数据元素a(i)的储存映像,称为结点(node).它包括两个域:其中储存数据元素信息的域叫做数据域,储存后继位置的域成为指针域。
具体代码实现:
class node { public: //-----指针域------- node * next; //指向直接后继的指针 //-----数据域------- char content; //储存数据 };
将一个结点弄明白后,接下来就来探索如何使用结点构建成一个链表:
以上代码实现:
//构建单链表 void CreatList() { //构建第一个结点 node *head = new node; cout << "输入第1个结点的值:"; cin >> head->content; head->next = NULL; //构建第二个结点 head->next = new node; cout << "输入第2个结点的值:"; cin >> head->next->content; head->next->next = NULL; //构建第三个结点 head->next->next = new node; cout << "输入第3个结点的值:"; cin >> head->next->next->content; head->next->next->next = NULL; }
这样构建的话,结点个数少的话,还可以接受,如果有100个结点或者更多结点嘞?
//创建单链表 void CreatList(int len) { ElemType a; //a表示输入的值 //构建第一个结点的结点 node *head = new node; node *p = head; //p表示当前链表的最后一个结点 cout << "请输入第一个值" << endl; cin >> a; p->content = a; p->next = NULL; //构建第二个以及第二个以后的结点 for (int i = 1; i < len; i++) { p->next = new node; p = p->next; cout << "请输入第" << i + 1 << "个值" << endl; cin >> a; p->content = a; p->next = NULL; } }
单链表插入元素:单链表与数组相比有一个很大的有点就是在插入元素和删除元素的时候,不需要移动插入点后面的元素,节省了很多的时间。
在单链表中插入元素需要怎么做呢?
1.利用new新建一个结点。
2.使新建结点的指针域内的指针指向插入位置的后一个结点。
3.插入位置的前一个结点的指针域内的指针指向新建的结点。
实现代码:
//插入节点 //函数的第一个参数表示的是要操作的链表,第二个参数len表示插入位置,第三个参数e表示的是插入的内容 void NodeInsertion(node *L, int len, double e) { len--; node *pq = L; //pq表示插入的前一个节点 node *p1 = new node; //p1表示的是要插入的节点 p1->content = e; //将内容赋值给新的节点 for (int i = 0; i < len - 1; i++) //循环的作用是找到插入的位置 pq = pq->next; //插入节点 p1->next = pq->next; pq->next = p1; }
在单链表中删除元素要肿么做嘞?
1.找到要删除结点的位置。
2.使即将被删除的结点的前面的结点的指针域的指针指向即将被删除的结点的后面的指针。
3.利用delete删除结点
代码实现:
//删除节点 void NodeDelete(node *L, int len) { node *pq = L; //pq表示的是删除位置的前一个节点 node *p = NULL; //p表示的是要删除的节点 //循环是为了寻找被删除的位置 for (int i = 0; i < len - 2; i++) pq = pq->next; p = pq->next; pq->next = p->next; delete pq; }
遍历单链表:
可以创建一个临时的指针变量node *temporary,这个指针指向的位置就是即将访问的位置,访问完之后,将temporary变量赋值为该位置的指针域内指针的值,然后,就可以访问下一个结点的值了
代码实现:
//输出单链表 void shuchu(node *L) { cout << "链表中的内容为:"; node *temporary = L; while (temporary != NULL) { cout << temporary->content << " "; temporary = temporary->next; } cout << endl; }
那么,整个单链表的步骤基本都说完啦,下面就该放出全部的代码啦!
#include<iostream> using namespace std; typedef int ElemType; class node { public: node * next; ElemType content; node(); }; //构造函数 node::node() { next = NULL; } //创建单链表 node *CreatList1(int len) { ElemType a; node *head = new node; node *p = head; cout << "请输入第一个数字" << endl; cin >> a; p->content = a; for (int i = 1; i < len; i++) { p->next = new node; p = p->next; cout << "请输入第" << i + 1 << "个数字" << endl; cin >> a; p->content = a; p->next = NULL; } return head; } //销毁单链表 void DestoryList(node *L) { node *p = L->next; while (L->next != NULL) { p = L->next; L->next = p->next; delete p; cout << "删除" << endl; } delete L; } //输出单链表 void shuchu(node *L) { cout << "链表中的内容为:"; node *p = L; while (p != NULL) { cout << p->content << " "; p = p->next; } cout << endl; } //插入节点 //函数的第一个参数表示的是要操作的链表,第二个参数len表示插入位置,第三个参数e表示的是插入的内容 void NodeInsertion(node *L, int len, double e) { len--; node *pq = L; //pq表示插入的前一个节点 node *p1 = new node; //p1表示的是要插入的节点 p1->content = e; //将内容赋值给新的节点 for (int i = 0; i < len - 1; i++) //循环的作用是找到插入的位置 pq = pq->next; //插入节点 p1->next = pq->next; pq->next = p1; } //删除节点 //函数的第一个参数表示的是要操作的链表,第二个参数len表示插入位置,第三个参数e表示的是插入的内容 void NodeDelete(node *L, int len, double e) { node *pq = L; //pq表示的是删除位置的前一个节点 node *p = NULL; //p表示的是要删除的节点 //循环是为了寻找被删除的位置 for (int i = 0; i < len - 2; i++) pq = pq->next; p = pq->next; pq->next = p->next; delete p; } //查找节点 //函数的第一个参数表示的是要操作的链表,第二个参数len表示第几个节点 void NodeFind(node *L, int len) { node *p = L; //循环是为了寻找位置 for (int i = 0; i < len - 1; i++) p = p->next; cout << "第" << len << "个节点的内容是" << p->content << endl; } //改变节点的内容 //函数的第一个参数表示的是要操作的链表,第二个参数len表示的是第几个节点,第三个参数e是要改变的内容 void NodeChange(node *L, int len, double e) { node *p = L; for (int i = 0; i < len - 1; i++) p = p->next; cout << "将第" << len << "个节点的" << p->content << "修改为" << e << endl; p->content = e; } //主函数 int main() { node *head = CreatList1(4); shuchu(head); NodeInsertion(head, 3, 12); shuchu(head); NodeDelete(head, 3, 12); shuchu(head); NodeFind(head, 2); NodeChange(head, 3, 78); shuchu(head); DestoryList(head); system("pause"); return 0; }
本人菜鸟一个,如果有大神看到我的代码,希望可以指出我的不足之处,非常感谢!