1. 程式人生 > >資料結構——連結串列(c++)

資料結構——連結串列(c++)

myList.h

template <class T>  
class List  { 
      void clear();                     // 置空線性表 
      bool isEmpty();                   // 線性表為空時,返回True 
      bool append(T value);             // 在表尾新增一個元素value,表的長度增1 
      bool insert(int p, T value);          // 在位置p上插入一個元素value,表的長度增1 
      bool del
(int p); // 刪除位置p上的元素,表的長度減 1 T getValue(int p); // 返回位置p的元素值 T setValue(int p, T value); // 用value修改位置p的元素值 };

lnkList.h


//lnkLink.h
#include <cstdlib> 
#include <iostream> 

#include "myList.h"  

using namespace std; 

template <class T>
class Link { public: T data; // 用於儲存結點元素的內容 Link * next; // 指向後繼結點的指標 Link(const T info, Link* nextValue = NULL) { // 具有兩個引數的Link建構函式 data = info; next = nextValue; } Link(Link* nextValue =
NULL) { // 具有一個引數的Link建構函式 next = nextValue; } }; // 單鏈表的型別定義 template <class T> class lnkList: public List<T> { private: Link<T>* head; // 單鏈表的頭指標 Link<T>* tail; // 單鏈表的尾指標 public: lnkList(); // 建構函式 ~lnkList(); // 解構函式 Link<T>* setPos(int i); // 返回線性表指向第i個元素的指標值 bool isEmpty(); // 判斷連結串列是否為空 void clear(); // 將連結串列儲存的內容清除,成為空表 int length(); // 返回此順序表的當前實際長度 bool append(T value); // 在表尾新增一個元素value,表的長度增1 bool insert(int p, T value); // 在位置p上插入一個元素value,表的長度增1 bool del(int p); // 刪除位置p上的元素,表的長度減 1 bool getValue(int p, T value); // 返回位置p的元素值 bool getPos(int p, const T value); // 查詢值為value的元素,並返回第1次出現的位置 void print(); }; template <class T> lnkList<T>::lnkList(){ head = tail = new Link<T>(NULL); } template <class T> lnkList<T>::~lnkList(){ Link<T> *tmp; head = head->next; while (head != NULL) { tmp = head; head = head->next; delete tmp; } } template <class T> // 假定線性表的元素型別為T Link<T>* lnkList<T> :: setPos(int i) { int count=0; if(i=-1) { return head; } Link<T> * p = new Link<T>(head->next); while(p!=NULL && count<i) { p=p->next; count++; } return p; } template <class T> // 線性表的元素型別為T bool lnkList<T> :: insert(int i, T value) { Link<T> *p, *q; if((p=setPos(i-1))==NULL) //p是第i個結點的前驅 { cout<<"Insertion point is illegal\n"<<endl; return false; } q=new Link<T>(value,p->next); p->next=q; if(p==tail) tail=q; return true; } // delete a node from singly linked list template <class T> // 線性表的元素型別為T bool lnkList<T>:: del(int i) { Link<T> *p,*q; if((p=setPos(i-1))==NULL || p==tail) { cout<<"deletion point is illegal\n"<<endl; return false; } q=p->next; //q為待刪結點 if(q==tail) { tail=p; p->next=NULL; delete q; } else if(q!=NULL) { p->next=q->next; delete q; } return true; } template <class T> // 假定順序表的元素型別為T void lnkList<T> :: print() { Link<T> *tmp = head->next; cout << "begin\n" ; while (tmp != NULL) { cout << tmp->data <<" "; tmp = tmp->next; } cout << "\n"; cout << "end\n"; }

main.cpp

//main.cpp
#include <iostream>   
#include "lnkList.h"    
using namespace std;   

int main(void)   
{   
    lnkList<int>lnk;
    lnk.insert(0,0);
    lnk.insert(0,1);
    lnk.insert(0,2);
    lnk.insert(0,3);
    lnk.insert(0,4);
    lnk.insert(0,5);
    cout<<"print elem:\n";
    lnk.print();
    cout<<"Insert a elem 15:\n";
    lnk.insert(0,15);
    cout<<"print elem:\n";
    lnk.print();
    cout<<"delete a elem:\n";
    lnk.del(0);
    cout<<"print elem:\n";
    lnk.print();
    return 0;
}   

實驗圖片

在這裡插入圖片描述