前言
这是本人第一篇博客,旨在记录梳理自己学习数据结构的过程(c++实现),另一方面也能给有需要的小伙伴一些学习上的便利,大家一起互相学习!
单向链表
在动态分配内存空间时,最常使用的就是单向链表(single linked list)。一个单向链表节点基本由两个元素组成,即数据字段和指针,而指针将会指向下一个元素的内存所在地址。
在单向链表中第一个节点是链表头指针,指向最后一个节点的指针设为NULL,表示它是链表尾,不指向任何地方。
单向链表的创建与遍历
在c++中,若以动态分配产生链表节点的方式,可以先行定义一个类数据类型,接着在类中定义一个指针变量,其数据类型与此类相同,作用是指向下一个链表节点,另外类中至少要有一个数据字段。例如,声明一个书籍链表节点的结构,则数据字段可能包含下面三个:书名(title)、作者(author)、价格(price),以及一个指针(next)。之后就可以动态创建链表的每个节点。
遍历(traverse)单向链表的过程,就是使用指针运算来访问链表中的每一个节点,为了便于操作,可以定义一个指针变量作为链表的读取游标。
本文为了用最简单的范例展示单向链表的创建与遍历,链表结构采用一个数据一个指针的形式,具体实现代码如下所示:
实现代码
#include<iostream>
using namespace std;
class list{ //定义链表结构
public:
int data;
class list *next;
};
typedef class list node;
typedef node *link;
int main(){
link newnode,head,phead; //声明三个链表结构的指针
int n;
cout<<"请输入将要存储的元素个数: "<<endl;
cin>>n;
phead = new node; //phead暂当链表头指针
if(!phead){ //分配内存失败时phead=NULL
cout<<"[Error!内存分配失败!]"<<endl;
}
cout<<"请依次输入存储元素: "<<endl;
cin>>phead->data; //输入节点的数据
head = phead; //保留链表头指针,以phead为指向当前节点的指针
for(int i = 0;i < n-1;i++){
newnode = new node;
if(!newnode){
cout<<"[Error!内存分配失败!]"<<endl;
}
cin>>newnode->data;
newnode->next = NULL;
phead->next = newnode; //把新节点加在链表后面
phead = phead->next; //让phead保持在链表的最后面
}
cout<<"输出数据: "<<endl;
phead = head; //让phead回到链表头
while(phead!=NULL){
cout<<phead->data<<"->";
head = phead;
phead = phead->next; //phead按序往后遍历整个链表
if(!phead) cout<<"NULL"<<endl;
delete head; //释放内存空间
}
return 0;
}
运行截图
总结
现在只写了单链表的创建与遍历,后续会继续更新单链表的插入、删除、翻转。
有不足之处大家一起讨论学习,谢谢!
单链表的插入、删除请看我的下一遍文章单链表的插入、删除(c++实现)