zoukankan      html  css  js  c++  java
  • #1 数据结构学习 ---- 单链表

    单链表定义:

    /* Author : grey_qisen */
    // LinkList.h -- initialization of linklist
    
    #ifndef LinkList_H
    #define LinkList_H
    
    #include <iostream>
    using namespace std;
    
    template<class DataType>
    struct LinkNode{
        DataType data;
        LinkNode<DataType> *next;
    };
    
    template<class DataType>
    class LinkList{
        public:
            LinkList();                                         // 无参构造单链表
            LinkList_B(DataType a[],int n);                     // 头插法构造单链表
            LinkList_E(DataType a[],int n);                     // 尾插法构造单链表
            ~LinkList();                                        // 析构函数
            int length();                                       // 返回单链表表长
            bool Insert(int p,DataType x);                      // 在第p个结点处插入结点
            bool Delete_l(int p);                               // 按位删除第i个结点
            bool Delete_v(DataType x);                          // 按值删除所有值为x的结点
            DataType Find_l(int p);                             // 按位查找第i个结点的值
            int Find_v(DataType x);                             // 按值查找值为x的元素位置
            void PrintList();                                   // 顺序打印单链表
        private:
            LinkNode<DataType> *head;                           // 单链表头指针
    };
    
    template<class DataType>
    LinkList<DataType>::LinkList(){                             // 无参构造单链表
        head = new LinkNode<DataType>;
        head->next = NULL;
    }
    
    template<class DataType>
    LinkList<DataType>::LinkList_B(DataType a[],int n){         // 头插法构造单链表
        head = new LinkNode<DataType>;
        head->next = NULL;
        
        LinkNode<DataType> *s;
        for(int pos = 0;pos < n;pos++){
            s = new LinkNode<DataType>;
            s->data = a[pos];
            s->next = head->next;
            head->next = s;
        }
    }
    
    template<class DataType>
    LinkList<DataType>::LinkList_E(DataType a[],int n){         // 尾插法构造单链表
        head = new LinkNode<DataType>;
        head->next = NULL;
        
        LinkNode<DataType> *s;  LinkNode<DataType> *temp;
        temp = head;
        for(int pos = 0;pos < n;pos++){
            s = new LinkNode<DataType>;
            s->data = a[pos];
            s->next = temp->next;
            temp->next = s;
            temp = s;
        }
        temp->next = NULL;
    }
    
    template<class DataType>
    LinkList<DataType>::~LinkList(){                            // 析构函数
        LinkNode<DataType> *temp;
        while(head->next != NULL){
            temp = head;
            head = head->next;
            delete temp;
        }
    }
    
    template<class DataType>
    int LinkList<DataType>::length(){                           // 单链表求长
        int length = 0;
        LinkNode<DataType> *temp;
        temp = head;
        while(temp->next != NULL){
            temp = temp->next;
            length += 1;
        }
        cout << "This LinkList has " << length << " nodes." << endl;
        return length;
    }
    
    template<class DataType>
    bool LinkList<DataType>::Insert(int p,DataType x){          // 在第p个结点处插入结点
        LinkNode<DataType> *temp;    LinkNode<DataType> *s;
        s = new LinkNode<DataType>;
        int pos = 0;
        s->data = x;
        temp = head;
        while(temp != NULL && pos < p-1){
            temp = temp->next;
            pos++;
        }
        if(temp == NULL){
            cout << "ERROR Parameters!" << endl;
            return false;
        } else{
            s->next = temp->next;
            temp->next = s;
            cout << "Insert success!" << endl;
            return true;
        }
        
    }
    
    template<class DataType>
    bool LinkList<DataType>::Delete_l(int p){                   // 按位删除第p结点
        if(p < 1){
            cout << "ERROR Parameters!" << endl;
            return false;
        }
        int pos = 0;
        LinkNode<DataType> *temp;   LinkNode<DataType> *s;
        temp = head;
        while(temp != NULL & pos < p-1){
            temp = temp->next;
            pos++;
        }
        if(temp == NULL || temp->next == NULL){
            cout << "ERROR Parameters!" << endl;
        } else{
            s = temp->next;
            temp->next = temp->next->next;
            delete s;
            cout << "Delete Success!" << endl;
            return true;
        }
    }
    
    template<class DataType>
    bool LinkList<DataType>::Delete_v(DataType x){              // 按值删除所有值为x的结点
        DataType D_temp;    int num = 0;
        LinkNode<DataType> *N_temp;     LinkNode<DataType> *s;
        N_temp = head;
        
        while(N_temp->next != NULL){
            if(N_temp->next->data == x){
                s = N_temp->next;
                N_temp->next = N_temp->next->next;
                delete s;
                cout << "Program has been delete " << ++num << " Node." << endl;
            } else{
                N_temp = N_temp->next;
            }
        }
        return true;
    }
    
    template<class DataType>
    DataType LinkList<DataType>::Find_l(int p){                 // 按位查找第p个结点的值
        int pos = 0;    LinkNode<DataType> *temp;
        temp = head;
        if(p < 1){
            cout << "ERROR Parameters!" << endl;
        } else{
            while(pos < p){
                if(temp == NULL){
                    cout << "ERROR Parameters!" << endl;
                } else{
                    temp = temp->next;
                    pos += 1;
                }
            }
            cout << "The " << p << "th node's data is " << temp->data << "." << endl;
            return temp->data;
        }
    }
    
    template<class DataType>
    int LinkList<DataType>::Find_v(DataType x){                 // 按值查找第一个值为x的结点
        int pos = 1;    LinkNode<DataType> *temp;
        temp = head->next;
        while(temp != NULL){
            if(temp->data == x){
                cout << "The " << pos << "th node's data is " << x << "." << endl;
                return pos;
            } else{
                temp = temp->next;
                pos += 1;
            }
        }
        cout << "The Node you want to find is not exit in this linklist!" << endl;
        return 0;
    }
    
    template<class DataType>
    void LinkList<DataType>::PrintList(){                       // 顺序打印单链表
        LinkNode<DataType> *temp;
        temp = head->next;
        while(temp != NULL){
            cout << temp->data << " ";
            temp = temp->next;
        }
        cout << "#" << endl;
    }
    
    #endif

    单链表测试

    /* Author : grey_qisen */
    //LinkList.cpp -- testing the LinkList
    #include<iostream>
    #include"LinkList.h"
    
    using namespace std;
    
    int main(){
        char num[5] = {'a','b','c','d','e'};
        
    // --------------- 头插法检测  -----------------------------
        LinkList<char> NumList_B;
        NumList_B.LinkList_B(num,5);
        NumList_B.PrintList();
        NumList_B.length();
        
         NumList_B.Insert(6,'f');
        NumList_B.PrintList();
        NumList_B.length();
        
        NumList_B.Delete_l(6);
        NumList_B.PrintList();
        
        NumList_B.Delete_v('a');
        NumList_B.PrintList();
        
        NumList_B.Find_l(0);
        NumList_B.Find_l(3);
        
        NumList_B.Find_v('e');
        NumList_B.Find_v('f');
    
        return 0;
    }
    What Greek,do put shit!
  • 相关阅读:
    Android OCR 之 tesseract
    抛砖引玉 之 谁动了我的流量(0权限上传数据)
    退伍一年了
    android 通过 Hessian 与 j2ee 服务端交互
    Arduino 入手
    抛砖引玉 之 谁动了我的隐私(android用户隐私窥探)
    如何关注那些有价值的微博
    关于培训和外包20111027
    ASP.NET实现Cookie功能的三个基本操作(写入,读取,删除)
    提高你开发效率的十五个Visual Studio 2010使用技巧
  • 原文地址:https://www.cnblogs.com/grey-qisen/p/4861966.html
Copyright © 2011-2022 走看看