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;
    } 

     运算结果

  • 相关阅读:
    解决VS2005打开js,css等文件,中文都是乱码的问题
    PHP代码优化43条方法实战列表
    php长文章分页
    ASP通用分页类
    用Asp隐藏文件路径,实现防盗链
    用 PHP5 打造简易的 MVC 架构
    一男赶集卖猪,天黑遇雨发生的4个故事,有启发意义的哦!
    西湖雾湖夜湖雪湖
    php生成静态html分页实现方法
    将网络上的图片下载到本地ASP代码
  • 原文地址:https://www.cnblogs.com/ygsworld/p/10023710.html
Copyright © 2011-2022 走看看