zoukankan      html  css  js  c++  java
  • 双链表的基本运算

    #include<iostream>
    using namespace std;
    #include<malloc.h>
    typedef char ElemType;
    typedef struct DNode
    {
        ElemType data;
        struct DNode *prior;
        struct DNode *next;
    }DLinkNode;
    
    void CreateListF(DLinkNode *&L,ElemType a[],int n)//头插法
    {
        DLinkNode *s;
        L  = (DLinkNode*)malloc(sizeof(DLinkNode));
        L->prior = L->next = NULL;
        for(int i =0;i<n;i++)
        {
            s = (DLinkNode *)malloc(sizeof(DLinkNode));
            s->data = a[i];
            s->next = L->next;
            if(L->next != NULL)//结点s插在原开始结点之前,头结点之后
                L->next->prior = s;
            L->next = s;
            s->prior = L;
        }
    }
    
    void CreateListR(DLinkNode *&L,ElemType a[],int n)//尾插法
    {
        DLinkNode *s,*r;
        L  = (DLinkNode*)malloc(sizeof(DLinkNode));//头结点
        L ->prior = L->next = NULL;
        r = L;//r始终指向终端结点。开始为头结点
        for(int i = 0;i<n;i++)
        {
            s =(DLinkNode*)malloc(sizeof(DLinkNode));//创建新结点
            s->data  = a[i];
            r->next = s;//s插入r之后
            s->prior = r;
            r = s;
        }
        r->next = NULL;
    }
    
    void InitList(DLinkNode *&L)
    {
        L = (DLinkNode*)malloc(sizeof(DLinkNode));
        L ->prior = L->next = NULL;
    }
    
    void DestoryList(DLinkNode *&L)
    {
        DLinkNode *pre = L;
        DLinkNode *p = L->next;
        while(p != NULL)
        {
            free(pre);
            pre = p;
            p = p->next;//pre p 同时后移
        }
        free(p);
    }
    
    bool ListEmpty(DLinkNode *L)
    {
        return (L->next == NULL);
    }
    
    int ListLength(DLinkNode *L)
    {
        DLinkNode *p = L;
        int i = 0;
        while(p->next != NULL)
        {
            i++;
            p = p->next;
        }
        return (i);
    }
    
    
    void DispList(DLinkNode *L)
    {
        DLinkNode *p= L->next;
        while(p != NULL)
        {
            cout<<p->data;
            p = p->next;
        }
        cout<<endl;
    }
    bool GetElem(DLinkNode *L,int i,ElemType &e)
    {
        int j = 0;
        DLinkNode *p = L;
        if(i < 0) 
            return false;
        while(j < i && p != NULL )
        {
            j++;
            p = p->next;
        }
        if(p == NULL)
        {
            return false;
        }
        else
        {
            e = p->data;
            return true;
        }
    }
    
    int LocateElem(DLinkNode *L,ElemType e)
    {
        int  i = 1;
        DLinkNode *p = L->next;
        while(p!= NULL && p->data != e)//查找第一个值为e的
        {
            i++;
            p = p->next;
        }
        if(p == NULL)
        {
            return false;
        }
        else
        {
            return (i);
        }
    }
    
    bool ListInsert(DLinkNode *&L,int i,ElemType e)
    {
        int j = 0;
        DLinkNode *p = L;
        DLinkNode *s;
        if(i < 0)
            return false;
        while(p!=NULL && j < i -1)//查找待插入的前一个 
        {
            j++;
            p = p->next;
        }
        if(p == NULL)
            return  false;
        else
        {
            s = (DLinkNode*)malloc(sizeof(DLinkNode));//找到前一个
            s->data = e;
            s->next = p->next;
            if(p->next != NULL)
            {
                p->next->prior = s;//s插入p之后
            }
            s->prior = p;
            p->next = s; 
        }
    }
    
    bool ListDelete(DLinkNode *&L,int i,ElemType &e)
    {
        int j = 0;
        DLinkNode *p = L;
        DLinkNode *q;
        if(i<=0) return false;
        while(j < i-1 && p != NULL)//查找第i-1个
        {
            j++;
            p = p->next;
        }
        if(p == NULL)
        {
            return false;
        }  
        else
        {
            q = p->next;//找到 q指向第i-1个
            if(q == NULL )
            {
                return false;
            }
            else
            {
                e = q->data;
                p->next = q->next;//删除
                if(p->next != NULL)
                {
                    p->next->prior = p;
                }
                free(q);//释放q
                return true;
            }
        }
    }
    
    int main()
    {
        DLinkNode *d;
        ElemType e;
        cout<<"双链表操作"<<endl;
        InitList(d);
        ListInsert(d,1,'a');
        ListInsert(d,2,'b');
        ListInsert(d,3,'c');
        ListInsert(d,4,'d');
        ListInsert(d,5,'e');
        cout<<"D-> ";
        DispList(d);
        cout<<"The Length is "<<ListLength(d)<<endl;
        cout<<"The third Elem is:";
        GetElem(d,3,e);
        cout<<e<<endl;
        cout<<"Delete fourth Elem->";
        ListDelete(d,4,e);
        DispList(d);
        return 1;
    } 

     运算结果

  • 相关阅读:
    删数问题
    八中公司_二分图带权最大匹配模板题
    完美子图(这道题太难了,得写下来要不回头又忘了)
    最近集训的图论(思路+实现)题目汇总(内容包含tarjan、分层图、拓扑、差分、奇怪的最短路):
    方格取数(简单版)+小烈送菜(不知道哪来的题)-----------奇怪的dp增加了!
    单调队列优化题:最大数(P1198)
    单调队列+线性dp题Watching Fireworks is Fun (CF372C)
    关于看了几道洛谷灰题(暂无评定)的感想
    洛谷的奇妙今日运势
    互不侵犯(洛谷P1896)
  • 原文地址:https://www.cnblogs.com/ygsworld/p/10023710.html
Copyright © 2011-2022 走看看