zoukankan      html  css  js  c++  java
  • 数据结构(1) -- 线性结构

    1、顺序存储

    //List.h
    #ifndef LIST_H_
    #define LIST_H_
    
    #define MAXSIZE 100
    typedef struct _Poly
    {
        int a;
        int n;
        bool operator == (_Poly e)
        {
            if (a == e.a && n == e.n)
                return true;
            else
                return false;
        }
    }Poly;
    
    #define ElemType Poly
    
    typedef struct _Node
    {
        ElemType data[MAXSIZE];
        int last;
    }Node;
    
    class List
    {
    private:
        Node *data;
    public:
        List();
        ~List();
        void Insert(ElemType e, int index);
        void Remove(int index);
        int Find(ElemType e);
        ElemType FindKth(int k);
        int Length();
    };
    #endif
    
    //List.cpp
    #include "List.h"
    #include <iostream>
    
    List::List()
    {
        data = new Node();
        data->last = -1;
    }
    
    List::~List()
    {
        delete data;
    }
    
    void List::Insert(ElemType e, int index)
    {
        if (data->last == MAXSIZE - 1)
        {
            std::cout << "表满了" << std::endl;
            return;
        }
        if (index < 0 || index >(data->last + 1))
        {
            std::cout << "添加位置不合法" << std::endl;
            return;
        }
        for (int i = data->last; i >= index; i--)
        {
            data->data[i + 1] = data->data[i];
        }
        data->data[index] = e;
        data->last++;
    }
    
    
    void  List::Remove(int index)
    {
        if (index < 0 || index > data->last)
        {
            std::cout << "删除位置不和法" << std::endl;
            return;
        }
    
        for (int i = index; i < data->last; i++)
        {
            data->data[i] = data->data[i + 1];
        }
        data->last--;
    }
    
    int  List::Find(ElemType e)
    {
        for (int i = 0; i < data->last; i++)
        {
            if (data->data[i] == e)
                return i;
        }
        return -1;
    }
    ElemType  List::FindKth(int k)
    {
        if (k < 0 || k > data->last)
        {
            std::cout << "查找位置不合法" << std::endl;
        }
        return data->data[k];
    }
    int  List::Length()
    {
        return (data->last + 1);
    }

    2、链式存储

    //PList.h
    #ifndef PLIST_H_
    #define PLIST_H_
    
    #define MAXSIZE 100
    typedef struct _Poly
    {
        int a;
        int n;
        bool operator == (_Poly e)
        {
            if (a == e.a && n == e.n)
                return true;
            else
                return false;
        }
    }Poly;
    
    #define ElemType Poly
    
    typedef struct _PNode
    {
        ElemType data;
        _PNode* next;
    }PNode;
    
    class PList
    {
    private:
        PNode *head;
    public:
        PList();
        ~PList();
        void Insert(ElemType e, int index);
        void Remove(int index);
        int Find(ElemType e);
        ElemType FindKth(int k);
        int Length();
    };
    #endif
    
    //PList.cpp
    #include "PList.h"
    #include <iostream>
    
    PList::PList()
    {
        head = new PNode();
        head->next = NULL;
    }
    
    PList::~PList()
    {
        delete head;
    }
    
    void PList::Insert(ElemType e, int index)
    {
        PNode *p = head;
        PNode *s = new PNode();
        s->data = e;
        s->next = NULL;
        if (index > Length())
            std::cout << "插入位置错误" << std::endl;
    
        int i = 0;
        while (p && i < index)
        {
            p = p->next;
            i++;
        }
        s->next = p->next;
        p->next = s;
    }
    
    
    void  PList::Remove(int index)
    {
        PNode *p = head;
        PNode *s = new PNode();
        if (index > Length())
            std::cout << "移除位置错误" << std::endl;
    
        int i = 0;
        while (p && i < index)
        {
            p = p->next;
            i++;
        }
        s = p->next;
        p->next = s->next;
        delete s;
    }
    
    int  PList::Find(ElemType e)
    {
        PNode *p = head;
        int i = 0;
        while (p)
        {
            if (p->data == e)
                return i;
            i++;
            p = p->next;
        }
        return -1;
    }
    ElemType  PList::FindKth(int k)
    {
        PNode *p = head;
        if (k < 0 || k > Length())
        {
            std::cout << "查找位置不合法" << std::endl;
        }
        int i = 0;
        while (p && i < k)
        {
            p = p->next;
            i++;
        }
        return p->next->data;
    }
    int  PList::Length()
    {
        PNode *p = head;
        int i = 0;
        while (p)
        {
            i++;
            p = p->next;
        }
        return i;
        
    }

    3、测试用例

    //main.cpp
    #include <iostream>
    #include <stdlib.h>
    #include "PList.h"
    using namespace std;
    
    
    int main()
    {
        PList L;
        for (int i = 0; i < 5; i++)
        {
            Poly t = { i, i };
            L.Insert(t, i);
        };
        cout << "last:" << L.Length() << endl;
        Poly e = { 2, 2 };
        cout << "Find return:" << L.Find(e) << endl;
        for (int i = 0; i < 4; i++)
        {
            cout << L.FindKth(i).a << "X" << L.FindKth(i).n  << " + ";
        }
        cout << L.FindKth(4).a << "X" << L.FindKth(4).n << endl;
        system("pause");
        return 0;
    }
  • 相关阅读:
    策略模式
    装饰模式VS代理模式
    BufferedInputSream实现原理
    从字节码角度分析重载与重写
    函数sprintf真好用
    算法时间复杂度
    二项分布(Binomial Distribution)
    numpy中的tile函数
    图像缩放算法(最临近点插值算法、双线性内插值算法、双立方插值算法)
    C++ 类中成员函数的属性
  • 原文地址:https://www.cnblogs.com/yongssu/p/4393711.html
Copyright © 2011-2022 走看看