实现带有头结点的链表

来源:互联网 发布:elsevier旗下数据库 编辑:程序博客网 时间:2024/05/21 15:39

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

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



/*建立带有头结点的链表包含函数creat,insert,getelemt,del,print*/#include<string>#include<cstdio>#include<iostream>#define null 0#define ok 1#define error 0using 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("内存开辟失败\n");    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);}/*IwillloveyouforeverUsersAdministratorDocumentslinklistHeadcreatHeadstringtmpgetEltmp*/

0 0