链表入门
来源:互联网 发布:最优化导论 pdf 编辑:程序博客网 时间:2024/06/06 13:01
链表入门
今天看罢各dalao和神犇的链表解释,感觉很繁琐,心里很不愉快,于是自己立志要写一个能让略微懂得链表的人看得懂的博文。
结构体
struct data{ int num; struct data *next;};
num是指每一个元素的数值,*next就相当于与下一个节点的连线。星号相当于指针(事实上是指针声明符)。
读入优化
这里还有一个读入优化的问题,这里就不说了,这里不当重点来讲了,它就是比cin和scanf快一些,只能读入数字,有需要讲解的就在评论区里问吧,至于想要模板的诸君请随意拿走。
访问长度的方法
这里用到了一个递推的思路,先建立一个指针指向链首,然后递推将指针向后推,每向后推一次,计数器+1,一直到指针所指向的是NULL就可以停止。
int len(){ int tim=0; data *q=head; while(q!=NULL) { q=q->next; tim++; } return tim;}
添加和删除数
在链表的某一个位置添加一个数据,可以通过输入数据和位置来确定,这里需要申请一个提前自己做好的*p,里面存着数据(初始next指针可以指向NULL)。利用与访问长度相似的方法,我们可以递推相应次数来找到位置pos。
而后我们先把pos元素对应的指针next所指的位置记录下来,再把准备好的元素(灰蓝色)的next指针指向刚刚记录下来的位置。
然后把pos元素的next指针指向准备好的那个元素
void add(int numm,int posm){ data *p; p=new data; p->next=NULL; p->num=numm; data *q=head; for(i=1;i<=posm;i++) { q=q->next; } data *m=q->next; p->next=m; q->next=p;}
删除数字就只需要把pos位置前元素的next指针指向pos后的next指针即可,这样就可以跳过pos位置的元素。
void sub(int posm){ data *q=head; for(i=1;i<posm;i++) { q=q->next; } data *m=q->next->next; q->next=m;}
代码
(C++)
#include<iostream>using namespace std;int i,j,m,n;struct data{ int num; struct data *next;};struct data a[1001],*head,*p;int readd(){ int aans=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { aans*=10; aans+=ch-'0'; ch=getchar(); } return aans*f;}int len(){ int tim=0; data *q=head; while(q!=NULL) { q=q->next; tim++; } return tim;}void add(int numm,int posm){ data *p; p=new data; p->next=NULL; p->num=numm; data *q=head; for(i=1;i<=posm;i++) { q=q->next; } data *m=q->next; p->next=m; q->next=p;}void sub(int posm){ data *q=head; for(i=1;i<posm;i++) { q=q->next; } data *m=q->next->next; q->next=m;}int main(){ n=readd(); a[1].num=readd(); head=&a[1]; for(i=2;i<=n;i++) { a[i].num=readd(); a[i-1].next=&a[i]; } a[n].next=NULL; p=head; while(1) { int ord,numx,posx; cin>>ord; if(ord==4) { do{ cout<<p->num<<endl; p=p->next; } while(p!=NULL); p=head; } else if(ord==1) { cin>>numx>>posx; add(numx,posx-1); } else if(ord==2) { cin>>posx; sub(posx-1); } else if(ord==3) cout<<len()<<endl; }}
2 0
- 【C++】链表入门
- 链表入门
- 入门链表的世界
- 链表简易原理入门
- 数据结构入门小结之链表
- 【学习笔记】【链表】链表入门
- F# 入门(十一):链表与数组
- 入门:链表的基本操作
- LintCode【入门】删除链表中的元素
- lintcode-入门-删除链表中的元素
- C语言入门:删除链表节点
- 链栈入门
- 区块链 入门 基础知识
- 样式表入门手册
- Oacle 表分区入门
- CSS样式表入门
- 表函数入门
- oracle表分区入门
- c++远征之多态篇(运行时类型识别)
- 拉格朗日对偶和KKT条件(Karush-Kuhn-Tucker)
- Android studio 导入eclipse项目 运行时报错
- Android必知必会--NinePatch图片制作
- PyCharm激活和汉化
- 链表入门
- ascii码排序
- 请教懂得切图的大神回答我个问题
- Linux系统结构和文件管理
- mybatis框架的配置
- Android下怎么把多张图片拼成一个gif啊,有没有现成的库?
- The connection to adb is down, and a severe error has occured
- word中插入带有语法高亮的源代码
- bzoj3533: [Sdoi2014]向量集