zoukankan      html  css  js  c++  java
  • DS作业·写了一个链表

    用struct手写了个list

    有push_back,push_front,insert,erase reserve,size,setpos,rbegin 功能。

    坑:一开始想用template<class T>结果总是编译错误(漏写了<T>)

     改成int后总是地址错误,(因为没有new地址)

     然后网上学(抄)了一下class的一个程序,总是编译报错orz

     最后自己拙劣地写出了一个数据结构,100行左右注//释掉的是class版本:

    #include<iostream>
    #include <string>
    #include<list>
    #include<fstream>
    using namespace std;
    list<int> l;
    typedef long long ll, rr;
    const int H = 1e9;
    struct mlist  {
        int d;
         mlist *prior;
        mlist *next;
        mlist(int d=0, mlist* prior = NULL, mlist*  next = NULL) :d(d), prior(prior), next(next) {}//指向自己。
        mlist * setpos(int i) {
            mlist *p = next;
            int count = 1;
            if (i < 0) {
                cout << "illegal find" << endl; return NULL;
            }
            while (p != NULL&&count<i) {
                p = p->next;
                count++;
            }
            return p;
        }
        mlist* rbegin() {
            mlist *p = next;
            while (p != NULL)p = p->next;
            return  p;
        }
        void pb(int x) {//find this list's end,attach to it;
            if (next == NULL) {
                mlist *now=new mlist(x, next, NULL);
                next = now;
                return;
            } 
            mlist *p = next;
             while (p->next != NULL)p = p->next;
            mlist *now;
            now = new mlist(x, p, NULL);
            p->next = now;
            
        }
        void pf(int x) {//find this list's end,attach to it;
            if (next == NULL) {
                mlist *now = new mlist(x, next, NULL);
                next = now;
                return;
            }
            
            
            mlist *now;
            now = new mlist(x, next->prior, next);
            next = now;
    
        }
        bool insert(int i, int x) {//第i个后面插入x,i从1开始
            if (i == 0) pf(x);
            else  {
                mlist *p = next, *q;
                if ((p =setpos(i )) == NULL) {//前1个
                    cout << "illegal insertion" << endl;
                    return false;
                }
                q = new mlist(x, p->prior, p->next);
                p->next = q;
                return true;
            }
        }
        bool erase(int i) {//第i个后面插入x,i从1开始
    
            if (i == 1) {
                mlist*q = next;
                
                next = next->next;
                delete q;
            }
            else {
                mlist *p = next, *q;
                if ((p = setpos(i - 1)) == NULL) {//第i个
                    cout << "illegal deletion" << endl;
                    return false;
                }
                q = p->next;
                p->next = p->next->next;
                delete (q);
                return true;
            }
        }
        int size() {
            int cnt = 0;
            mlist* p = next;
            while (p != NULL) {
                p = p->next;
                cnt++;
            }
            return cnt;
        }
        void reverse() {
            int n = size();
            int t = n;
            for(int i=1;i<=n;i++) {
                int x = setpos(n)->d;
                erase(n);
                insert(i-1, x);
                
            }
        
                
    
            
        }
    };
    mlist init() {
        mlist x;
        x.d = H;
        x.next = x.prior = NULL;
        return x;
    }
     void homework1() {
         ifstream fin("1.txt");
         int n; fin >> n;
         for (int i = 1; i <= n; i++) { int x; fin >> x; l.push_back(x); }
         auto e = l.end();
         for (auto t = l.begin(); t != e; t++) {
             if (*t < 0)l.push_front(*t);
             else l.push_back(*t);
             t = l.erase(t);
         }
         for (auto t : l) { cout << t << ' '; }
     }
     mlist head = init();
     void print(mlist head) {
         mlist *p = &head;
         while (p != NULL) cout << p->d << ' ', p = p->next;
         cout << endl;
     }
    int main() {
        
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)head.pb(i);
        print(head);
        head.reverse();
        print(head);
        //cout << head.size();
         cin >> n;
    }
    /*p->prior->next = p->next;
    p->next->prior = p->prioir;
    free(p);*/
    
    /*template<class T> class Link {//const
    public:
        T data;
        Link<T> *next;
        Link(const T info, const Link<T>*nextValue = NULL) {
            data = info;
            next = nextValue;
        }
        Link(const Link<T>*nextValue) {
            next = nextValue;
        }
    };
    template<class T> class InkList :public List<T> {
    private:
        Link<T> *head, *tail;
        Link<T> *setPos(const int p);
    public:
        ~InkList(int s);
        //ADT 
        bool isEmpty();
        void clear();
        int length();
        bool append(const T value);
        bool insert(const int p, const T value);
        bool delete1(const int p);
        bool getValue(const int p, T& value);
        bool getPos(int &p, const T value);
    };
    //第i个的指针  
    template<class T>
    Link<T> *InkList<T>::setPos(int i) {
        int count = 0;
        if (i == -1)
            return head;
        link<T>*p = head->next;
        while (p != NULL&&count < i) {
            p = p->next;
            count++;
        }; 
        return p;
    }
    //insert  tail??new??
    template<class T>
    bool InkList<T>::insert(const int i, const T value) {
        Link<T> *p*q;
    
        if ((p = setPos(i - 1)) == NULL) {
            cout << "illegal insertion" << endl;
            return false;
        }
        q = new Link<T>(value, p->next);
        p->next = q;
        if (p == tail)
            tail = q;
        return true;
    }
    //delete
    template<class T>
    bool InkList<T>::delete1(const int i) {//delete 内置函数
        Link<T>*q, *p;
        if ((p = setPos(i - 1)) == NULL || p == tail) {
            cout << "illegal deletion" << endl;
            return false;
        }
        q = p->next;
        if (q == tail) {
            tail = p;
            p->next = NULL;
        }
        else p->next = q->next;
        delete q;
        return true;
    }
        /*p = head;//delete by x;
    while (p->next != NULL&&p->next->info != x) p = p->next;
    q = p->next;
    p->next = q->next;
    free(q);*/
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    串 --- 匹配
    串 --- 匹配
    计算几何 --- 哈希优化
    哈希 --- 线性探测法
    拓扑排序 --- 反向建图
    swift学习
    CocoaPods安装教程 pod setup很慢解决方案
    Adobe Fireworks CS6 Mac破解版
    iStat for mac
    mac环境下清理系统垃圾clearMyMac 3.9 破解版
  • 原文地址:https://www.cnblogs.com/SuuT/p/8634176.html
Copyright © 2011-2022 走看看