• 单链表的实现


    数据结构书上例子

    //List.h
    
    #include<iostream>
    #include <fstream>
    using namespace std;
    
    template <class T>
    struct LinkNode{
        T data;
        LinkNode<T> *link;
        LinkNode<T> (LinkNode<T> *ptr=NULL)
        {link=ptr;}
        LinkNode<T> (const T& item,LinkNode<T> *ptr=NULL)
        { data=item;link=ptr;}
    };
    
    template <class T>
    class List{
    public:
        List()      //初始化
        {first=new LinkNode<T>;}
        List(const T& x){first = new LinkNode<T>(x);}
        List(List<T> &L);
        ~List(){makeEmpty();}
        void makeEmpty();    //置空
        LinkNode<T>* getHead() const {return first;}    
        LinkNode<T> *Search(T x);          //查找x
        LinkNode<T> *Locate(int i);         //寻找第i个节点
        bool getData(int i, T & x);            //第i个节点的值赋给x
        bool Insert(int i, T& x);                //第i个位置插入i
        bool IsEmpty()const
        {return first->link==NULL?true:false;}
        bool Sort();                                //排序
        bool  input();                                //输入数据
        List<T> &operator=(List<T> &L);     //重载=
        friend ostream& operator << <T> (ostream& out,List<T> &L);   //重载<<
        friend istream&operator >> (istream&in,List<T> &L)
        {
            LinkNode<T> *p,*q;
            T a;
            L.makeEmpty();
            p=L.getHead();
            while(!in.eof())
            {
                in>>a;
                q=new LinkNode<T>(a);
                p->link=q;
                p=q;
            }
            p->link=NULL;
            return in;
        }            //重载>>
    protected:
        LinkNode<T> *first;
    };
    
    template<class T>
    ostream& operator << (ostream& out,List<T> &L)
    {
            LinkNode<T> *q=L.first->link;
            while(q!=NULL)
            {
                out<<q->data<<endl;
                q=q->link;
            }
            return out;
    };
    
    template <class T>
    List<T>::List(List<T> &L){
        T value;
        LinkNode<T> *stcptr=L.getHead();
        LinkNode<T> *destptr=first=new LinkNode<T>;
        while(stcptr->link!=NULL){
            value=stcptr->link->data;
            destptr->link=new LinkNode<T>(value);
            destptr=destptr->link;
            stcptr=stcptr->link;
        }
        destptr->link=NULL;
    };
    
    template<class T>
    void List<T>::makeEmpty(){
        LinkNode<T> *q;
        while(first->link!=NULL){
            q=first->link;
            first->link=q->link;
            delete q;
        }
    };
    
    template<class T>
    LinkNode<T>* List<T>::Search(T x){
        LinkNode<T> *current=first->link;
        while(current!=NULL){
            if(current->data==x) break;
            else
                current=current->link;
        }
        return current;
    };
    
    template<class T>
    LinkNode<T>* List<T>::Locate(int i){
        if(i<0)
            return NULL;
        LinkNode<T>* current=first;
        int k=0;
        while(current!=NULL&&k<i)
        {
            current=current->link;
            k++;
        }
        return current;
    };
    
    //取出链表第i个元素值
    template<class T>
    bool List<T>::getData(int i, T&x)
    {
        if(i<=0)
            return false;
        LinkNode<T>*current=Locate(i);
        if(current==NULL)
            return false;
        else
        {
            x=current->data;
            return true;
        }
    };
    
    template <class T>
    bool List<T>::Insert(int i,T&x)
    {
        LinkNode<T>*current=Locate(i);
        if(current==NULL)
            return false;
        LinkNode<T> *newnode=new LinkNode<T>(x);
        if (newnode==NULL)
        {
            cout<<"error"<<endl;
            return false;
        }
        newnode->link=current->link;
        current->link=newnode;
        return true;
    };
    
    template<class T>
    List<T>&  List<T>::operator=(List<T>& L){
        T value;
        LinkNode<T> *srcptr =L.getHead();
        LinkNode<T>*destptr=first=new LinkNode<T>;
        while(srcptr->link!=NULL)
        {
            value=srcptr->link->data;
            destptr->link=new LinkNode<T>(value);
            destptr=destptr->link;
            srcptr=srcptr->link;
        }
        destptr->link=NULL;
        return *this;
    };
    
    template<class T>
    bool List<T>::Sort()
    {
        LinkNode<T> *q;
        LinkNode<T> *p=first;
        T  x1,x2;
        int N=0;
        while(p->link!=NULL)
        {
            N++;
            p=p->link;
        }
        while (N==1)
        {
            cout<<"the list is kongde"<<endl;
            return false;
        }
        for(int i=1;i<N;i++)
        {
            for (int j=N;j>i;j--)
            {
                getData(j-1,x1);
                getData(j,x2);    
                if(x1>x2)
                {
                    p=Locate(j-1);
                    q=Locate(j);
                    p->data=x2;
                    q->data=x1;
                }
            }
        }
    };
    
    template<class T>
    bool List<T>::input()
    {
        T x;
        LinkNode<T >*current=getHead();
        cout<<"输入数据(以0结束)"<<endl;
        cin>>x;
        while(x!=0){
            LinkNode<T> *node=new LinkNode<T>(x);
            node->link=current->link;
            current->link=node;
            cin>>x;
        }
        return true;
    }
    
    
    //main.cpp
    
    #include<iostream>
    #include <fstream>
    #include"List.h"
    using namespace std;
    
    int main()
    {
        List<int> list;
        int x;
        int i;
        cout<<"测试输入"<<endl;
        list.input();
        cout<<"链表如下"<<endl;
        cout<<list<<endl;
        cout << "=======================
    ";
        
        cout<<"输入插入的位置和数据"<<endl;
        cin>>i;
        cin>>x;
        if(!list.Insert(i,x))
            cout<<"插入失败"<<endl;
        cout<<"链表如下:"<<endl;
        cout<<list<<endl;
        cout << "=======================
    ";
        cout<<"测试复制链表"<<endl;
        List<int> list1(list);
        cout<<"链表如下:"<<endl;
        cout<<list1;
        cout << "=======================
    ";
        cout<<"测试查找"<<endl;
        cout<<"search i"<<endl;
        cin>>i;
        LinkNode<int> *current=list.Search(i);
        if (!current)
        {
            cout<<"不存在"<<endl;
        }
        else
        {
            cout<<"输入要修改的值"<<endl;
            cin>>i;
            current->data=i;
        }
        cout<<"链表如下:"<<endl;
        cout<<list;
        cout << "=======================
    ";
        cout<<"测试从文本读取"<<endl;
        List<int>  list2;
        ifstream sin("data.txt");
    /*
        cout<<"输入文件名和路径"<<endl;
        char filename[60];
        cin.getline(filename,60);
        ifstream sin;
        inFile.open(filename);
        if(!sin.is_open())
        {
            cout<<"can not open the file"<<filename<<endl;
            return -1;
        }
    */
        sin>>list2;
        cout<<"链表如下:"<<endl;
        cout<<list2<<endl;
        sin.close();
        cout << "=======================
    ";
        list2.Sort();
        cout<<"排序后的链表如下:"<<endl;
        cout<<list2<<endl;
        cout << "=======================
    ";
        
        return 0;
    }
    
    
    //main.cpp  测试代码
    
    #include<iostream>
    #include <fstream>
    #include"List.h"
    using namespace std;
    
    int main()
    {
        cout<<"测试从文本读取"<<endl;   
        List<int>  list2;
        cout<<"输入文件名和路径"<<endl;
        char filename[60];
        cin.getline(filename,60);
        ifstream sin;
        sin.open(filename);
        if(!sin.is_open())
        {
            cout<<"文件无法打开"<<filename<<endl;
            return -1;
        }
        sin>>list2;
        cout<<"链表如下:"<<endl;
        cout<<list2<<endl;
        cout << "=======================
    ";
        list2.Sort();
        cout<<"排序后的链表如下:"<<endl;
        cout<<list2<<endl;
        cout << "=======================
    ";
        sin.close();
    
        List<int> list;
        int x;
        int i;
        cout<<"测试输入"<<endl;
        list.input();
        cout<<"链表如下"<<endl;
        cout<<list<<endl;
        cout << "=======================
    ";
        
        cout<<"输入插入的位置和数据"<<endl;
        cin>>i;
        cin>>x;
        if(!list.Insert(i,x))
            cout<<"插入失败"<<endl;
        cout<<"链表如下:"<<endl;
        cout<<list<<endl;
        cout << "=======================
    ";
        cout<<"测试复制链表"<<endl;
        List<int> list1(list);
        cout<<"链表如下:"<<endl;
        cout<<list1;
        cout << "=======================
    ";
        cout<<"测试查找"<<endl;
        cout<<"search i"<<endl;
        cin>>i;
        LinkNode<int> *current=list.Search(i);
        if (!current)
        {
            cout<<"不存在"<<endl;
        }
        else
        {
            cout<<"输入要修改的值"<<endl;
            cin>>i;
            current->data=i;
        }
        cout<<"链表如下:"<<endl;
        cout<<list;
        cout << "=======================
    ";   
    
        return 0;
    }
    View Code
  • 相关阅读:
    js初学
    普通的checkbox的回显功能
    Jquery的显示与隐藏
    jQuery 事件
    jquery选择器(1)
    页面截取字段和转码,页面截取字段时候需要进入JS
    页面中的多选框的非空判断
    jquery中清空
    java代码拼写sql
    iframe中用到的例子
  • 原文地址:https://www.cnblogs.com/tuzijs/p/3427395.html
Copyright © 2020-2023  润新知