1. 程式人生 > >【資料結構】1-1 線性表

【資料結構】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;
}

 測試結果: