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

    #include<iostream>
    using namespace std;
    struct LinkNode
    {
       int value;
       LinkNode* next;
       LinkNode* pre;
    };
    LinkNode* createDoubleLinkList()
    {
        LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode));
        head->next=NULL;
        head->pre=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的元素,也就是待插入元素的位置前一个,其实书上写的是到POS位置,但这样不能插在末尾了
        {                                
             p=p->next;
             j++;
        }
        if(p!=NULL)
        {
            LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
            newNode->value=value;
            newNode->next=p->next;
            p->next=newNode;
            newNode->pre=p;
            if(newNode->next)
                newNode->next->pre=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!=NULL && j<pos)
        {
            p=p->next;
            j++;
        }
        if(p!=NULL)//这里可以定位到pos的元素,也就是待删除元素的位置
        {
            p->pre->next=p->next;
            if(p->next)
                p->next->pre=p->pre;
            delete(p);
            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= createDoubleLinkList();
        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= createDoubleLinkList();
        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);
        insertElem(1,2,L);
        outPut(L);
        deleElem(L->value,L);
        outPut(L);
        cin>>len;
    }
  • 相关阅读:
    用ASP.Net2005和Oracle9i做模糊查询时报ORA01722错误解决方法
    ☠360与腾讯QQ的战争☠之我见
    【转】GIS原理学习
    【转】JavaScript写的Cookie类
    怀疑自己的笔记本电脑可能受到了网络攻击被人监视或操控
    “密码人”越来越多将会出现“密码危机”
    【转】确保 ASP.NET 应用程序和 Web Services 的安全
    超图软件(SuperMap)学习资料:桌面软件(Deskpro)
    用Sql Server 2000的数据库备份来还原Sql Server 2005中的数据库
    一个有用的Windows服务小程序——用来完成Server端的Socket通信
  • 原文地址:https://www.cnblogs.com/kbyd/p/3989417.html
Copyright © 2011-2022 走看看