静态单链表

来源:互联网 发布:php开源crm统 编辑:程序博客网 时间:2024/06/06 11:42

利用数组实现的静态单链表,与严蔚敏书实现略有不同,不另设回收空间。有任何BUG或错误,希望各位朋友多多反馈~~感激不尽

/*  Author : Moyiii *  Mail:  lc09@vip.qq.com *  静态链表实现,仅作学习之用,当然如果 *  你想拿去用,随你好啦。*/#include <iostream>using namespace std;#define MAX_LIST_SIZE 100class Node{public:    int data;    int cur;};class SLinkList{public:    SLinkList();    //和普通的线性链表区别不是很大。除了两个分配    //和回收节点空间的函数,具体算法请参考课本或    //网络资料    int newNode();    bool deleteNode(int pos);    bool insertElem(int pos, int elem);    bool deleteElem(int pos);    int& getElem(int pos);    int getLength();    bool isEmpty();    void print();    void clear();private:    int head;//这个可以不要,默认等于0    int space;    int length;    Node *elems;};SLinkList :: SLinkList(){    // 0号位置为头几点,不可以更改,初始指向自己    // 从1~MAXLENGTH为可分配节点,最初由space管理    elems = new Node[MAX_LIST_SIZE];    if(!elems)    {        cout << "Malloc failed!" << endl;    }    head = space = length = 0;    for(int i = 0; i < MAX_LIST_SIZE; ++i)    {        elems[i].data = i;        elems[i].cur  = i + 1;    }    elems[MAX_LIST_SIZE - 1].cur = 0;    elems[0].cur = 0;    space  = 1;}//从space指向的备用节点链表中取下一个节点int SLinkList :: newNode(){    if(space == 0)    {        cout << "Space is full!" << endl;        return 0;    }    int pos = space;    space  = elems[space].cur;    elems[pos].cur = 0;    return pos;}//回收节点空间bool SLinkList :: deleteNode(int pos){    if(pos == 0)    {        cout << "Free space Error!" << endl;        return false;    }    elems[pos].cur = space;    space  = pos;    return true;}//插入节点,思路类似,找到被删除节点的前一个节点//然后更改指向bool SLinkList :: insertElem(int pos, int elem){    if(length == MAX_LIST_SIZE)    {        cout << "Space is Full" << endl;        return false;    }    if(pos < 1 || pos > length + 1)    {        cout << "Insert Over Bound" << endl;        return false;    }    int index = head;    for(int i = 1; i <= pos - 1; ++i)    {        index = elems[index].cur;    }    int node = newNode();    if(node == 0)    {        cout << "Space malloc failed" << endl;        return false;    }    elems[node].data = elem;    elems[node].cur = elems[index].cur;    elems[index].cur = node;    length++;    return true;}//一回事,注意把删除的节点回收给spacebool SLinkList :: deleteElem(int pos){    if(pos < 1 || pos > length)    {        cout << "Delete Node over Bound!" << endl;        return false;    }    int index = head;    for(int i = 1; i <= pos - 1; ++i)    {        index = elems[index].cur;    }    int node = elems[index].cur;    elems[index].cur = elems[node].cur;    deleteNode(node);    length--;    return true;}void SLinkList :: print(){    int index = elems[head].cur;    while(index != 0)    {        cout << elems[index].data << " ";        index = elems[index].cur;    }    cout << endl;    return;}int SLinkList :: getLength(){    return length;}bool SLinkList :: isEmpty(){    if(length == 0)    {        return true;    }    else    {        return false;    }}int& SLinkList :: getElem(int pos){    int index = head;    for(int i = 1; i <= pos; ++i)    {        index = elems[index].cur;    }    return elems[index].data;}void SLinkList :: clear(){    for(int i = 0; i < MAX_LIST_SIZE; ++i)    {        elems[i].data = i;        elems[i].cur  = i + 1;    }    elems[MAX_LIST_SIZE - 1].cur = 0;    elems[0].cur = 0;    space  = 1;}int main(){    //测试数据,测试插入删除空间是否溢出    SLinkList myList;    for(int i = 1; i <= 105; ++i)    {        myList.insertElem(1,i);    }    //myList.print();    for(int i = 1; i <= 105; ++i)    {        myList.deleteElem(1);    }    //myList.print();    //普通测试    for(int i = 1; i <= 10; ++i)    {        myList.insertElem(1,i);    }    myList.print();    cout << "Length= " << myList.getLength() <<endl;    myList.deleteElem(5);    myList.print();    cout << "Length= " << myList.getLength() <<endl;    cout << myList.isEmpty() << endl;    int &elem = myList.getElem(3);    elem = 99;    myList.print();    myList.clear();    myList.print();    return 0;}


0 0
原创粉丝点击