链表入门

来源:互联网 发布:最优化导论 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
原创粉丝点击