資料結構——連結串列(c++)
阿新 • • 發佈:2018-12-17
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;
}
實驗圖片