zoukankan      html  css  js  c++  java
  • 实现带有头结点的链表

    首次写博客,请大神不要吐槽微笑

           要实现带头结点的链表,重要的是先搞清楚头结点是什么。链表里有几个名词,头指针,头结点,首结点,概念要明白,会区别,弄懂了这一步,链表的开始就没问题了。头指针即是头结点的地址,头结点数据域为空(当然你也可以用头结点的数据域来保存链表结点的个数),指针域的指针指向首结点,首结点即是你要储存数据的第一个结点。



    /*
    建立带有头结点的链表
    包含函数creat,insert,getelemt,del,print
    */
    #include<string>
    #include<cstdio>
    #include<iostream>
    #define null 0
    #define ok 1
    #define error 0
    using namespace std;
    typedef struct Node
    {
        string s;
        struct Node *next;
    } node,*linklist;
    int n=0;
    void creat(linklist &Head)
    {
        linklist p,q;
        Head=p=q=new node();//新链表建立时先建立头结点(即为头结点开辟空间)
        string ss;//用来存输入的数据
        if(Head==null)printf("内存开辟失败
    ");
        while(cin>>ss)
        {
            p=new node();//建立一个新的结点
            p->s=ss;//将新的结点的值赋为ss
            n++;//个数加一
            q->next=p;//前个结点的指针指向新结点
            q=p;//更新结点
        }
        q->next=null;//将尾结点的next赋为null
    }
    int  getElem(linklist &Head,int i,string &e)
    {
        linklist p,q;
        p=Head->next;//先使指针指向首结点(即第一个保存信息的结点,注意不是头结点)
        int j=1;
        while(p!=null&&j<i)//寻找i结点
        {
            p=p->next;
            j++;
        }
        //此时p指向i结点,且j=i;
        if(p==null||j>i)
        {
            cout<<"run error"<<endl;
            return error;
        }
        e=p->s;//将得到的i结点的数据赋给e
    
        return ok;
    }
    int ListInsert(linklist &Head,int i,string &e)//在原链表的i-1结点与i结点之间插入新的结点
    {
        linklist p,q;
        if(i==1)//如果在第一个元素之前加入新结点
        {
            q=new node();//建立一个新的结点
            q->s=e;//新结点的数据赋为e
            q->next=Head->next; //新结点的next指向原表首结点
            Head->next=q; //头结点的next指向新结点
            n++;//个数加一
            return ok;//直接退出
        }
        p=Head->next;//先使指针指向首结点(即第一个保存信息的结点,注意不是头结点)
        int j=1;
        while(p!=null&&j<i-1)//寻找i-1结点
        {
            p=p->next;
            j++;
        }//此时p指向i-1结点,且j=i-1;
        if(p==null||j>i-1)
        {
            cout<<"run error"<<endl;
            return error;
        }
        q=new node();//建立一个新的结点
        q->s=e;//新结点的数据赋为e
        q->next=p->next;//新节点的next指向原本的i结点(因为现在不是要在原链表的i-1结点与i结点之间插入新的结点吗?使新结点成为新链表的i结点)
        p->next=q;//i-1结点的next指向新结点
        n++;//个数加一
        return ok;
    }
    int ListDel(linklist &Head,int i)//删除链表的第i个元素
    {
        linklist p,q;
        if(i==1)//如果删除首结点
        {
            Head->next=Head->next->next;//画个图就理解了
            n--;//个数减一
            return ok;//直接退出
        }
        p=Head->next;//先使指针指向首结点(即第一个保存信息的结点,注意不是头结点)
        int j=1;
        while(p!=null&&j<i-1)
        {
            p=p->next;
            j++;
        }  //此时p指向i-1结点,且j=i-1;
        if(p==null||j>i)
        {
            cout<<"run error"<<endl;
            return error;
        }
        cout<<j<<endl;
        q=p->next;//将i结点的地址给q
        p->next=q->next;//i-1结点的next指向i+1结点(现在q的next指向i+1结点)
        n--;//个数减一
        return ok;
    }
    void Print(linklist Head)//打印链表
    {
        linklist p;
        p=Head->next;//先使指针指向首结点(即第一个保存信息的结点,注意不是头结点)
        while(p)
        {
            cout<<p->s<<endl;
            p=p->next;
    
        }
        cout<<n<<endl;//打印个数
        cout<<endl;
    }
    int main()
    {
        linklist Head;
        creat(Head);
        Print(Head);
    
        string tmp;
        getElem(Head,3,tmp);
        cout<<tmp<<endl;//打印得到的数据
    
        tmp="ILOVEYOU";
        ListInsert(Head,5,tmp);
        ListDel(Head,1);
        Print(Head);
    }
    /*
    I
    will
    love
    you
    forever
    Users
    Administrator
    Documents
    linklist
    Head
    creat
    Head
    string
    tmp
    get
    Eltmp
    */
    

  • 相关阅读:
    "此页的状态信息无效,可能已损坏。”的解决办法 dodo
    C#AdServer相关操作 dodo
    E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“aptget f install”(也可以指定一个解决办法)。 dodo
    通过ASP.NET连接Oracle数据库 dodo
    System.Runtime.InteropServices.ExternalException: GDI+ 中发生一般性错误 dodo
    FAT32转NTFS无法输入正确卷标 dodo
    Virtual PC 虚拟机虚拟硬盘压缩 dodo
    Destination host unreachable 一般解决办法 dodo
    15个优秀的第三方 Web 技术集成 dodo
    asp.net 2.0关于NavigateUrl中绑定Eval()方法时出现"服务器标记的格式不正确"的解决方法 dodo
  • 原文地址:https://www.cnblogs.com/hjch0708/p/7554852.html
Copyright © 2011-2022 走看看