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

    #include<iostream>
    using namespace std;
    #include<stdio.h>
    #include<malloc.h>
    #define ElemType int
    
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;
    }LinkNode;
    
    void CreateListF(LinkNode *&L,ElemType a[],int n)// 头插法
    {
        LinkNode *p;
        L =(LinkNode *)malloc(sizeof(LinkNode));
        L->next=NULL;
        for(int i = 0;i<n;i++)
        {
            p = (LinkNode *)malloc(sizeof(LinkNode));
            p->data = a[i];
            p->next = L->next;
            L->next = p;
        }
    }
    
    void CreateListR(LinkNode *&L,ElemType a[],int n)//尾插法
    {
        LinkNode *p ,*r;
        L = (LinkNode *)malloc(sizeof(LinkNode));
        L->next =NULL;
        r = L;
        for(int i =0 ;i<n;i++)
        {
            p = (LinkNode *) malloc(sizeof(LinkNode));
            p->data = a[i];
            r->next = p;//p插入r结点后
            r = p;
        }
        r->next = NULL;//尾结点置空
    }
    
    void InitList(LinkNode *&L)
    {
        L= (LinkNode *)malloc(sizeof(LinkNode));
        L->next = NULL;
    }
    
    void DestortyList(LinkNode *&L)
    {
        LinkNode *pre =L, *p = pre->next;
        while(p!= NULL)
        {
            free(pre);
            pre = p;
            p= p->next;//p,pre同步后移
        }
        free(pre);
    }
    
    bool ListEmpty(LinkNode *L)
    {
        return (L->next ==NULL);
    }
    
    int ListLength(LinkNode *L)
    {
        int j = 0;
        LinkNode *p = L;
        while(p->next != NULL)
        {
            j++;
            p = p->next;
        }
        return j;
    }
    
    void DispList(LinkNode *L)
    {
        LinkNode *p= L->next;
        while(p!=NULL)
        {
            cout<<" "<<p->data;
            p = p->next;
        }
        cout<<endl;
    }
    
    int GetElem(LinkNode *L,int i,ElemType &e)
    {
        int j=0;
        LinkNode *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(LinkNode *L,ElemType e)
    {
        int i =1;
        LinkNode *p = L->next;
        while(p!= NULL && p->data != e)
        {
            i++;
            p=p->next;
        }
        if( p==NULL)
        {
            return false;
        }
        else
        {
            return (i);
        }
    }
    
    bool LinktInsert(LinkNode *&L,int i ,ElemType e)
    {
        int j = 0;
        LinkNode *p = L,*r;
        if(i< 0) return false;
        while( j<i-1 && p!=NULL)
        {
            j++;
            p=p->next;
        }
        if(p == NULL) return false;
        else
        {
            r = (LinkNode *)malloc(sizeof(LinkNode));
            r->data = e;
            r->next = p->next;
            p->next =r;
            return true;   
        }
    }
    
    bool ListDelete(LinkNode *&L,int i,ElemType &e)
    {
        int j = 0;
        LinkNode *p = L,*q;
        if(i<0) return false;
        while( j<i-1 && p!=NULL)
        {
            j++;
            p = p->next;
        }
        if(p==NULL)
        {
            return false;
        }
        else//找到i-1个结点
        {
            q = p->next;//q指向第i个结点
            if(q==NULL)
                return false;
            else
            {
                e = q->data;
                p->next = q->next;//删除q结点
                free(q);//释放q结点
                return true;
            }
        }
    }
    
    void Split(LinkNode *&L,ElemType x)//将列表按按x拆分
    {
        LinkNode *p =L->next ,*q,*r;
        L->next = NULL;
        r = L;
        while(p!=NULL)
        {
            if(p->data < x)//p结点小于x,插入到开头
            {
                q = p->next;
                p->next = L->next;
                L->next = p;
                if(p->next ==NULL)//若p结点是第一个在开头的结点
                {
                    r = p;//则是尾结点
                }
                p = q;
            }
            else//若p结点大于等于x,则将其插入表尾
            {
                r->next = p;
                r = p;
                p = p->next;
            }
        }
        r->next =NULL;
    }
    
    void Merge(LinkNode *L1,LinkNode *L2,LinkNode *&L3)//将L1,L2个并产生L3
    {
        LinkNode *p =L1->next;
        LinkNode *q =L2->next;
        LinkNode *r;
        L3 = L1;
        r = L3;//r指向新建链表的头结点 
        free(L2);//释放L2的头结点
        while(p!=NULL && q !=NULL)
        {
            r->next = p;
            r =p;
            p = p->next;
            r->next =q;
            r =q;
            q = q->next;
        }
        r->next = NULL;
        if(q!=NULL)
        {
            p =q;
        }
        r->next = p;
    }
    
    void Sort(LinkNode *&L)//单链表递增排序
    {
        LinkNode *p;
        LinkNode *q;
        LinkNode *pre;
        p = L->next->next;//p 指向L的第二个结点
        L->next->next = NULL;//L中保留一个数据结点
        while(p != NULL)
        {
            q = p->next;//q 指向p下一个结点
            pre = L;//pre指向头结点
            while(pre->next != NULL && pre->next->data < p->data)//如果L中pre—>next值小于p的data
            {
                pre = pre->next;//找到pre的位置
            }
            p->next = pre->next;
            pre->next = p;
            p = q;
        }
    }
    
    void Union(LinkNode *ha,LinkNode *hb,LinkNode *&hc)
    {
        LinkNode *pa = ha->next;
        LinkNode *pb = hb->next;
        LinkNode *s;
        LinkNode *tc;
        hc = (LinkNode*)malloc(sizeof(LinkNode));//hc头结点
        tc = hc;
        while(pa != NULL && pb != NULL)
        {
            if(pa->data < pb->data)
            {
                s = (LinkNode *)malloc(sizeof(LinkNode));
                s->data = pa->data;//新结点赋值
                tc->next = s;
                tc = s;
                pa = pa->next;
            }
            else if(pa->data > pb->data)
            {
                s = (LinkNode*)malloc(sizeof(LinkNode));
                s->data = pb->data;
                tc->next = s;
                tc = s;
                pb = pb->next;
            }
            else// data == 
            {
                s = (LinkNode*)malloc(sizeof(LinkNode));
                s->data = pa->data;
                tc->next = s;
                tc = s;
                pa = pa->next;
                pb = pb->next;
            }
        }
        if(pb != NULL)//余下的结点
            pa = pb;//copy
        while(pa != NULL)
        {
            s = (LinkNode*)malloc(sizeof(LinkNode));
            s->data = pa->data;
            tc->next = s;
            tc = s;
            pa = pa->next;
        }
        tc->next = NULL;
    }
    
    void InsertSect(LinkNode * ha,LinkNode * hb,LinkNode *&hc)//两个有序表的交集
    {
        LinkNode *pa = ha->next;
        LinkNode *pb;
        LinkNode *s;
        LinkNode *tc;
        hc = (LinkNode *)malloc(sizeof(LinkNode));
        tc = hc;
        while(pa != NULL)
        {
            pb = hb ->next;
            while(pb != NULL && pb->data < pa->data)
            {
                pb = pb->next;
            }
            if(pb != NULL && pb->data == pa->data)
            {
                s = (LinkNode*)malloc(sizeof(LinkNode));
                s->data = pa->data;//copy
                tc->next = s;
                tc = s;
            }
            pa = pa->next;
        }
        tc->next = NULL;
    }
    
    void Subs(LinkNode *ha,LinkNode *hb,LinkNode *&hc)
    {
        LinkNode *pa = ha->next;
        LinkNode *pb;
        LinkNode *tc;
        LinkNode *s;
        hc = (LinkNode*)malloc(sizeof(LinkNode));
        tc = hc;
        while(pa != NULL)
        {
            pb = hb->next;
            while( pb != NULL && pb->data < pa->data)
            {
                pb = pb->next;
            }
            if(!(pb != NULL && pb->data == pa->data))//pa结点不在pb中
            {
                s = (LinkNode*)malloc(sizeof(LinkNode));
                s ->data = pa->data;
                tc ->next = s;
                tc = s;
            }
            pa = pa->next;
        }
        tc->next = NULL;
    }
    
    int main()
    {
        LinkNode *h;
        ElemType e;
        cout<<"初始化链表"<<endl;
        InitList(h);
        cout<<"依次插入97,98,99,100,101"<<endl;
        LinktInsert(h,1,97);
        LinktInsert(h,2,98); LinktInsert(h,3,99); LinktInsert(h,4,100); LinktInsert(h,5,101);
        cout<<"Print"<<endl;
        DispList(h);
        cout<<"Length is "<<ListLength(h)<<endl;
        GetElem(h,3,e);
        cout<<"第3个元素为"<<e<<endl;
        cout<<"在第4个位置上插入 60"<<endl;
        LinktInsert(h,4,60);
        cout<<"Print "<<endl;
        DispList(h);
        cout<<"删除第3 个元素"<<endl;
        ListDelete(h,3,e);
        cout<<"Print"<<endl;
        DispList(h);
        cout<<"释放单链表"<<endl;
        DestortyList(h);
        LinkNode *L;
        ElemType a[] ={105,106,101,100,103,104,105,106,101,102,107,108};
        int n = 8;
        CreateListR(L,a,n);
        cout<<"L :"<<endl;
        DispList(L);
        ElemType x =104;
        cout<<"以104划分"<<endl;
        Split(L,x);
        cout<<"L: "<<endl;
        DispList(L);
        cout<<"释放L"<<endl;
        DestortyList(L);
    //~~~~~~~~~~~~~~~~~~~~~
        LinkNode *L1;
        LinkNode *L2;
        LinkNode *L3;
        LinkNode *L4;
        LinkNode *L5;
        LinkNode *L6;
        ElemType b[] ={100,101,102,103,104,105,106,107,108};
        int m = 8;
        CreateListR(L1,b,n);
        cout<<"L1"<<endl;
        DispList(L1);
    
        ElemType c[]={1,3,4,5,6};
        ElemType d[]={2,4,5,6,7};
        int nn = 5;
        CreateListR(L2,c,nn);
        CreateListR(L4,d,nn);
        
        cout<<"L2"<<endl;
        DispList(L2);
        cout<<"L4"<<endl;
        DispList(L4);
    
        cout<<"L2 L4 Union"<<endl;
        Union(L2,L4,L5);
        DispList(L5);
    
        cout<<"L1 L2 Merage"<<endl;
        Merge(L1,L2,L3);
    
        cout<<"L3"<<endl;
        DispList(L3);
    
        cout<<"L3 Sort"<<endl;
        Sort(L3);
        DispList(L3);
        cout<<" L2 L4 Sect"<<endl;
        InsertSect(L2,L4,L6);
        DispList(L6);
        cout<<"Free";
        DestortyList(L1);
        DestortyList(L2);
        DestortyList(L3);
        DestortyList(L4);
        DestortyList(L5);
        DestortyList(L6);
        return 1;
    }
    

      运算结果

  • 相关阅读:
    springboot Quartz 定时任务工具类
    java 发邮件 代码
    spring boot 整合 shiro 权限框架
    java 读取xml
    flowable 报错 Waiting for changelog lock....
    微服务 springcloud Alibaba 阿里组件 项目源码
    Java 读取汉字拼音
    syslog how to
    c++ 字符串总结
    aptget 总结
  • 原文地址:https://www.cnblogs.com/ygsworld/p/9976247.html
Copyright © 2011-2022 走看看