zoukankan      html  css  js  c++  java
  • 线性表之单链表

    #include<iostream>
    using namespace std;
    /*
    有一个头节点
    下标都是从0开始
    头节点的下表是0,所以元素的下标是从1开始,添加删除都是以1为下标的位置
    头节点的value代表链表长度
    */
    struct LinkNode
    {
        int value;
        LinkNode* next;
    };
    LinkNode* createLinkList()
    {
        LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode));
        head->next=NULL;
        head->value=0;
        return head;
    }
    bool insertElem(int pos,int value,LinkNode* head)
    {
        if(pos<=0)return 0;
        LinkNode* p = head;
        int j=0;
        while(p!=NULL && j<pos-1)//定位到pos-1的元素,也就是待插入元素的前一个元素
        {
            p=p->next;
            j++;
        }
        if(p!=NULL)//限制插入元素的位置是 【1,链表长度+1】这个闭区间
        {            //因此这里辅助指针的位置【0,链表长度】这个闭区间
            LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
            newNode->value=value;
            newNode->next=p->next;
            p->next=newNode;
            head->value++;
            return 1;
        }
        return 0;
    }
    bool deleElem(int pos,LinkNode* head)
    {
        if(pos<=0)return 0;
        LinkNode* p = head;
        int j=0;
        while(p->next!=NULL && j<pos-1)
        {
            p=p->next;
            j++;
        }
        if(p->next!=NULL)//限制删除元素的位置是 【1,链表长度】这个闭区间
        {                 //因此这里辅助指针的位置【0,链表长度-1】这个闭区间
            LinkNode* q = p->next;
            p->next=q->next;
            delete(q);
            head->value--;
            return 1;
        }
        return 0;
    }
    void clearLinkList(LinkNode* head)
    {
        LinkNode*p = head->next;
        while(p!=NULL)
        {
            LinkNode*q=p->next;
            deleElem(1,head);//每次删除第一个,逐个删除
            p=q;
        }
    }
    void destroyLinkList(LinkNode* head)
    {
        clearLinkList(head);
        delete head;
        head = 0;
    }
     
    void outPut(LinkNode* head)
    {
        if(head == NULL)
        {
            cout<<"link list dose not exist"<<endl;
            return;
        }
        if(head->value==0)
        {
            cout<<"link list is empty"<<endl;
            return;
        }
        LinkNode* p = head->next;
        while(p!=NULL)
        {
            cout<<p->value<<" ";
            p=p->next;
        }
        cout<<endl;
    }
    void main()
    {
        int len=12;
        LinkNode* L= createLinkList();
        int v;
        for(int i=0;i<len;i++)
        {
            v = rand() % 100;
            cout<<v<<" ";
            insertElem(1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序相反
        }
        cout<<endl;
        outPut(L);
        destroyLinkList(L);
        //outPut(L);
     
        L= createLinkList();
        for(int i=0;i<len;i++)
        {
            v = rand() % 100;
            cout<<v<<" ";
            insertElem(L->value+1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序一致
        }
        cout<<endl;
        outPut(L);
     
        insertElem(3,999,L);
        outPut(L);
     
        insertElem(100,999,L);
        outPut(L);
     
        insertElem(L->value,9999,L);
        outPut(L);
     
        insertElem(L->value+1,8888,L);
        outPut(L);
     
        insertElem(1,7777,L);
        outPut(L);
     
        deleElem(1,L);
        outPut(L);
     
        deleElem(100,L);
        outPut(L);
     
        deleElem(7,L);
        outPut(L);
     
    
        deleElem(L->value,L);
        outPut(L);
    
        deleElem(L->value+1,L);
        outPut(L);
     
        clearLinkList(L);
        outPut(L);
        cin>>len;
    }


    #include<iostream>
    using namespace std;
    /*
    有一个头节点
    下标都是从0开始
    头节点的下表是0,所以元素的下标是从1开始,添加删除都是以1为下标的位置
    头节点的value代表链表长度
    */
    struct LinkNode
    {
        int value;
        LinkNode* next;
    };
    LinkNode* createLinkList()
    {
        LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode));
        head->next=NULL;
        head->value=0;
        return head;
    }
    bool insertElem(int pos,int value,LinkNode* head)
    {
        if(pos<=0)return 0;
        LinkNode* p = head;
        int j=0;
        while(p!=NULL && j<pos-1)//定位到pos-1的元素,也就是待插入元素的前一个元素
        {
            p=p->next;
            j++;
        }
        if(p!=NULL)//限制插入元素的位置是 【1,链表长度+1】这个闭区间
        {            //因此这里辅助指针的位置【0,链表长度】这个闭区间
            LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
            newNode->value=value;
            newNode->next=p->next;
            p->next=newNode;
            head->value++;
            return 1;
        }
        return 0;
    }
    bool deleElem(int pos,LinkNode* head)
    {
        if(pos<=0)return 0;
        LinkNode* p = head;
        int j=0;
        while(p->next!=NULL && j<pos-1)
        {
            p=p->next;
            j++;
        }
        if(p->next!=NULL)//限制删除元素的位置是 【1,链表长度】这个闭区间
        {                 //因此这里辅助指针的位置【0,链表长度-1】这个闭区间
            LinkNode* q = p->next;
            p->next=q->next;
            delete(q);
            head->value--;
            return 1;
        }
        return 0;
    }
    void clearLinkList(LinkNode* head)
    {
        LinkNode*p = head->next;
        while(p!=NULL)
        {
            LinkNode*q=p->next;
            deleElem(1,head);//每次删除第一个,逐个删除
            p=q;
        }
    }
    void destroyLinkList(LinkNode* head)
    {
        clearLinkList(head);
        delete head;
        head = 0;
    }
     
    void outPut(LinkNode* head)
    {
        if(head == NULL)
        {
            cout<<"link list dose not exist"<<endl;
            return;
        }
        if(head->value==0)
        {
            cout<<"link list is empty"<<endl;
            return;
        }
        LinkNode* p = head->next;
        while(p!=NULL)
        {
            cout<<p->value<<" ";
            p=p->next;
        }
        cout<<endl;
    }
    void main()
    {
        int len=12;
        LinkNode* L= createLinkList();
        int v;
        for(int i=0;i<len;i++)
        {
            v = rand() % 100;
            cout<<v<<" ";
            insertElem(1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序相反
        }
        cout<<endl;
        outPut(L);
        destroyLinkList(L);
        //outPut(L);
     
        L= createLinkList();
        for(int i=0;i<len;i++)
        {
            v = rand() % 100;
            cout<<v<<" ";
            insertElem(L->value+1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序一致
        }
        cout<<endl;
        outPut(L);
     
        insertElem(3,999,L);
        outPut(L);
     
        insertElem(100,999,L);
        outPut(L);
     
        insertElem(L->value,9999,L);
        outPut(L);
     
        insertElem(L->value+1,8888,L);
        outPut(L);
     
        insertElem(1,7777,L);
        outPut(L);
     
        deleElem(1,L);
        outPut(L);
     
        deleElem(100,L);
        outPut(L);
     
        deleElem(7,L);
        outPut(L);
     

        deleElem(L->value,L);
        outPut(L);

        deleElem(L->value+1,L);
        outPut(L);
     
        clearLinkList(L);
        outPut(L);
        cin>>len;
    }

  • 相关阅读:
    crossvcl使用
    CSS垂直居中的方法
    IIS7 启用GZip压缩
    javascript arguments解释,实现可变长参数。
    DataTable转List<dynamic>
    Bootstrap表单
    Func<T>、Action<T> 的区别于说明
    jQuery.fn.extend() 与 jQuery.extend()
    javascript this关键字指向详解
    javascript call与apply关键字的作用
  • 原文地址:https://www.cnblogs.com/kbyd/p/3988169.html
Copyright © 2011-2022 走看看