zoukankan      html  css  js  c++  java
  • 单链表的C语言实现和OOP实现

    单链表

    @

    1,单链表

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。

    链表中的数据是以节点来表示的,每个结点的构成:元素( 数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

    链表的结点结构:

    ┌───┬───┐

    │data │next │

    └───┴───┘

    img

    2,C语言实现单链表
    typedef struct Node
    {
    	int data;//数据域
    	struct Node*next;//节点指针(下一个)
    }Node,*List;//List===>>struct Node*
    
    void InitList(List p)
    {
        assert(p!=NULL);
        if(p->next==NULL)
        {
            return;
        }
        p->next=NULL;
    }
    static Node*GetNode(int val)        //设置新节点
    {
        Node*pGet=(Node*)malloc(sizeof(Node));
        assert(pGet!=NULL);
        pGet->data=val;
        pGet->next=NULL;
        return pGet;
    }
    bool Insert_head(List p,int val)        //头插
    {
        assert(p!=NULL);
        Node*pGet=GetNode(val);
        pGet->next=p->next;
        p->next=pGet;
        return true;
    }
    bool Insert_tail(List p, int val)     //尾插
    {
        assert(p!=NULL);
        Node*pcur=p;
        for(;pcur!=NULL;pcur=pcur->next)
        {}
        Node*pGet=GetNode(val);
        pcur->next=pGet;
        return true;
    }
    bool Insert_pos(List p, int pos, int val)  //从pos位置插入
    {
        Node*pcur=p;
        for(int i=0;i<=pos-1;i++)
        {
            pcur=pcur->next;
        }
        Ndoe*pGet=GetNode(val);
        pGet->next=pcur->next;
        pcur->next=pGet;
        return true;
    }
    int Getlength(List p)
    {
        int count=0;
        Node*pcur=p->next;
        while(pcur!=NULL)
        {
            count++;
            pcur=pcur->next;
        }
        return count;
    }
    Node *Search_pre(List p, int key)
    {
        Node*pcur=p;
        for(;pcur->next!=NULL;pcur=pcur->next)
        {
            if(pcur->next->data==key)
            {
                return pcur;
            }
        }
        return true;
    }
    bool Delete(List p, int key)
    {
        Node*p1=Search_pre(p.key);
        if(p1==NULL)
        {
            return fasle;
        }
        Node*pDel=p1->next;
        p1->next=pDel->next;
        free(pDel);
        pDel=NULL;
        return true;
    }
    bool IsEmpty(List p)
    {
        if(p->next==NULL)
        {
            return true;
        }
        return false;
    }
    void Show(List p)
    {
        Node*pcur=p->next;
        while(pcur!=NULL)
        {
            printf("%d ",pcur->data);
        }
        printf("
    ");
    }
    void Destroy(List p)
    {
        Node*pDel=NULL;
        while(p->next!=NULL)
        {
            pDel=p->next;
            p->next=pDel->next;
            free(pDel);
        }
        pDel=NULL;
    }
    void reverse(List p)         //逆置
    {
        assert(p!=NULL);
        Node*revhead=NULL;
        Node*prev=NULL;
        Node*pnode=p;
        while(pnode!=NULL)
        {
            Node*pnext=pnode->next;
            if(pnext==NULL)
            {
                revhead=pnode;
            }
            pnode->next=prev;
            prev=pnode;
            pnode=pnext;
        }
        return revhead;
    }
    
    
    3,OOP实现单链表
    class Link
    {
    public:
        Link()
        {
            phead=new Node;
        }
        ~Link()
        {
            Node*pcur=phead;
            while(pcur!=NULL)
            {
                phead=phead->pnext;
                delete phead;
                pcur=phead;
            }
        }
        void inserthead(int val)
        {
            Node*pcur=new Node(val);
            pcur->pnext=phead->pnext;
            phead->pnext=pcur;
        }
        void inserttail(int val)
        {
            Node*pcur=phead;
            while(pcur->pnext!=NULL)
            {
                pcur=pcur->pnext;
            }
            pcur->pnext=new Node(val);
        }
        void deleteNode(int val)
        {
            Node*pcur1=phead;
            Node*pcur2=phead->pnext;
            while(pcur2!=NULL)
            {
                if(pcur2->data==val)
                {
                    pcur1->pnext=pcur2->pnext;
                    delete pcur2;
                    pcur2=pcur1->pnext;
                }
                else
                {
                    pcur1=pcur2;
                    pcur2=pcur2->pnext;
                }
            }
        }
        void show()
        {
            Node*pcur=phead->next;
            while(pcur!=NULL)
            {
                cout<<pcur->data<<" ";
                pcur=pcur->pnext;
            }
        }
     private:
        class Node
        {
         public:
            Node(int data):pdata(data),pnext(NULL){}
            int pdata;
            Node*pnext;
        };
        Node*phead;
    };
    
  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/earthmolin/p/9922088.html
Copyright © 2011-2022 走看看