【数据结构】1-1 线性表

//单链表.cpp
#include"LinkList.h"
#include<iostream>
template<class T>
LinkList<T>::LinkList()
{
    head = new Node<T>;
    head->link = NULL;
}
template<class T>
void LinkList<T>::Clear()
{
    if (head != NULL)
    {
        Node<T> *p;
        p = head->link;
        while (p != NULL)
        {
            Node<T> *del = p;
            p = p->link;
            delete del;
        }
        head=NULL;
    }
}
template<class T>
LinkList<T>::LinkList(T data[], int  mSize)
{
    head = new Node<T>;
    head->data = data[0];
    head->link = NULL;
    Node<T> *end = head;
    //头结点创建并初始化完毕
    for (int i = 1; i < mSize; i++)
    {
        Node<T> *p = new Node<T>;
        p->data = data[i];
        p->link = NULL;
        end->link = p;
        end = p;
    }

}
template<class T>
bool LinkList<T>::Insert(int pos, const T&x)
{
    int cont = 1;
    Node<T> *p = head;
    bool flag = false;
    while (p != NULL&&cont<=pos-1)
    {
        if (cont == pos - 1)
        {
            Node<T> *add = new Node<T>;
            add->data = x;
            add->link = p->link;
            p->link = add;
            flag = true;
            break;
        }
        else
        {
            cont++;
            p = p->link;
        }

    }
    return flag;
}
template<class T>
bool LinkList<T>::Remove(int pos, T&x)
{
    int cont = 1;
    Node<T> *p = head;
    bool flag = false;
    while (p != NULL && cont <= pos - 1)
    {
        if (cont == pos - 1)
        {
            Node<T> *del = p->link;
            p->link = p->link->link;
            x=del->data;
            delete del;
            flag = true;
            break;
        }
        else
        {
            cont++;
            p = p->link;
        }

    }
    return flag;
}
template<class T>
bool LinkList<T>::Replace(int pos, const T&x)
{
    int cont = 1;
    Node<T> *p = head;
    bool flag = false;
    while (p != NULL && cont <= pos)
    {
        if (cont == pos)
        {
            p->data = x;
            flag = true;
            break;
        }
        else
        {
            cont++;
            p = p->link;
        }

    }
    return flag;
}
template<class T>
int LinkList<T>::Length()const
{
    int cont = 0;
    Node<T> *p = head;
    while (p != NULL)
    {
        cont++;
        p = p->link;
    }
    return cont;
}
template<class T>
bool LinkList<T>::IsEmpty() const
{
    return head == NULL;
}
template<class T>
void LinkList<T>::Output() const
{
    Node<T> *p = head;
    int cont = 0;
    while (p != NULL)
    {
        cout << p->data << "    ";
        p = p->link;
        cont++;
        if (cont % 10 == 0)
            cout << endl;
    }
    cout << endl;
}
template<class T>
bool LinkList<T>::search(const T&x) const
{
    bool flag = false;
    Node<T> *p = head;
    while (p != NULL)
    {
        if (p->data == x)
        {
            flag = true;
            break;
        }
        p = p->link;
    }
    return flag;
}

头文件:

//LinkList.h
#include<iostream>
using namespace std;
template<class T>
struct Node   //结点结构
{
    T data;   //结点数据
    Node*link;
    Node() { link = NULL; }
    Node(T e, Node *next = NULL)
    {
        data = e;
        link = next;
    }
};
template<class T>
class LinkList     //带表头结点的单链表类
{
private:
    Node<T> *head;              //链表指针
public:
    LinkList();    //构造带表头结点的空单链表
    LinkList(T data[], int  mSize);//构造有mSize个元素的单链表
    ~LinkList() { Clear(); }            //析构函数
    bool Insert(int pos, const T&x);   //在单链表第pos个元素前插入元素x
    bool Remove(int pos, T&x);    //删除单链表第pos个元素
    bool Replace(int pos, const T&x);  //将修改单链表第pos个元素为x
    int Length()const;      //求表长
    bool IsEmpty() const;  //判空操作
    void Clear();        //清空操作
    void Output() const;    //输出链表
    bool search(const T&x) const;//查找元素x在表中是否存在
}; 

测试代码:

//测试.cpp
#include"单链表.cpp"
#include<ctime>
void menu()//模拟菜单选项
{
    cout << "********************************************************" << endl;
    cout << "*            1 ------------输出链表                                                                      *" << endl;
    cout << "*            2 ------------插入元素                                                                      *" << endl;
    cout << "*            3 ------------删除元素                                                                      *" << endl;
    cout << "*            4 ------------销毁链表                                                                      *" << endl;
    cout << "*            5 ------------查找                                                                               *" << endl;
    cout << "*            0 ------------退出系统                                                                      *" << endl;
    cout << "********************************************************" << endl;
}
const int N = 20;
int main()
{
    srand((unsigned)time(NULL));//以系统当前时间初始化随机数发生器
    int data[N];
    for (int i = 0; i < N; i++)
        data[i]=rand()%100;//用随机数发生器产生100以内的整数
    LinkList<int> L(data, N);//创建N个元素的单链表
    menu();
    while (1)  //模拟菜单工作方式
    {
        int select;
        cout << "请输入您的选择:";    
        cin >> select;
        switch (select)
        {
        case 1:        //输出单链表
            if (L.IsEmpty())
            {
                cout << "链表为空!" << endl;
            }
            else
                L.Output();
            break;
        case 2:       //插入
            int pos, elem;
            cout << "请输入插入位置:";
            cin >> pos;
            cout << "插入元素:";            
            cin >> elem;
            if (L.Insert(pos, elem))     //插入成功
                cout << "在第" << pos << "个元素前成功插入" << elem << endl;
            else   //插入失败
                cout << "插入位置不合法!" << endl;
            break;
        case 3:       //删除
            cout << "请输入删除位置:";    cin >> pos;
            int x;
            if (L.Remove(pos, x))//删除单链表的第pos个元素
                cout << "单链表的第" << pos << "个元素" << x << "已被删除。" << endl;
            else
                cout << "删除位置不合法!" << endl;
            break;
        case 4:       //销毁链表
            char OK;
            cout << "确定要销毁链表吗?(y/n)" << endl;    
            cin >> OK;
            if (OK == 'y' || OK == 'Y')    L.Clear();
            break;
        case 5:       //查找
            cout << "请输入查找元素:";        
            cin >> elem;
            if (L.search(elem))
                cout << "查找成功!" << endl;
            else
                cout << "查找失败!" << endl;
            break;
        case 0:       //退出
            exit(0);
        default:
            cout << "您输入的选项有误,请重新输入:";
        }
    }
    return 0;
}

 测试结果:

 

posted @ 2018-11-18 14:56  巴塞罗那的余晖  阅读(229)  评论(0编辑  收藏  举报
//雪花飘落效果