#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!
原文地址:https://www.cnblogs.com/grey-qisen/p/4861966.html