線性表之單鏈表 一、頭文件:LinkedList.h //單鏈表是用一組任意的存儲單元存放線性表的元素,這組單元可以是連續的也可以是不連續的,甚至可以是零散分佈在記憶體中的任意位置。//單鏈表頭文件#include<iostream>using namespace std;//定義單鏈表結點-結構體類 ...
線性表之單鏈表
一、頭文件:LinkedList.h
//單鏈表是用一組任意的存儲單元存放線性表的元素,這組單元可以是連續的也可以是不連續的,甚至可以是零散分佈在記憶體中的任意位置。
//單鏈表頭文件
#include<iostream>
using namespace std;
//定義單鏈表結點-結構體類型
template<class DataType>
struct Node
{
//數據域,存放該結點的數據
DataType data;
//指針域,指向下一個結點
Node<DataType> *next;
};
template<class DataType>
class LinkedList{
public:
//單鏈表無參構造器
LinkedList();
//單鏈表有參構造器
LinkedList(DataType array[], int n);
LinkedList(int n, DataType array[]);
//單鏈表析構函數
~LinkedList();
//獲取單鏈表的長度
int GetLength();
//查找單鏈表指定元素的序號
int GetLocal(DataType x);
//獲取單鏈表指序號的元素
DataType GetElement(int index);
//單鏈表中在指定位置插入指定的元素
void Insert(int index, DataType x);
//在單鏈表中刪除指定位置的元素
DataType Delete(int index);
//按序號輸出單鏈表中的元素
void PrintLinkedList();
private :
//聲明單鏈表的頭指針
Node<DataType> *first;
};
//實現單鏈表的無參構造函數
template<class DataType>
LinkedList<DataType>::LinkedList()
{
first = new Node<DataType>;
first->next = NULL;
}
//頭插法建立單鏈表
template<class DataType>
LinkedList<DataType>::LinkedList(int n,DataType array[])
{
//初始化一個空鏈表
first = new Node<DataType>;
first->next = NULL;
for (int i = 0; i < n; i++)
{
//為每一個數組元素都申請新結點
Node<DataType> *s = new Node<DataType>;
//數組元素賦值給結點數據域
s->data = array[i];
//將結點插入到頭結點之前
s->next = first->next;
first->next = s;
}
}
//尾插法建立單鏈表
template<class DataType>
LinkedList<DataType>::LinkedList(DataType array[], int n)
{
//生成頭結點
first = new Node<DataType>;
//定義尾結點
Node<DataType> *r = first;
for (int i = 0; i < n; i++)
{
//為每一個數組元素申請一個結點
Node<DataType> *s = new Node<DataType>;
//把數組元素賦值給結點的數據域
s->data = array[i];
//將每一個結點追加到終端結點之後
r->next = s;
r = s;
}
//尾結點尾NULL
r->next = NULL;
}
//實現單鏈表的析構函數
template<class DataType>
LinkedList<DataType>::~LinkedList()
{
//聲明工作指針
Node<DataType> *q;
while (first != NULL)
{
//暫存被釋放的結點
q = first;
//讓頭指針指向要釋放結點的下一個結點
first = first->next;
delete q;
}
}
//實現單鏈表插入:在指定的位置插入指定的元素
template<class DataType>
void LinkedList<DataType>::Insert(int index, DataType x)
{
//定義工作指針
Node<DataType> *p = first->next;
//定義計數器,初始值為0
int count = 0;
while (p != NULL &&count < index - 1)
{
//工作指針後移
p = p->next;
count ++;
}
//找到 index-1 的位置
if (p == NULL)
{
throw "插入的位置有誤";
}
else
{
//申請一個新結點
Node<DataType> *s;
s= new Node<DataType>;
//其數據域為 x
s->data = x;
//在新結點的指針域存放工作指針p的指針域
s->next = p->next;
//將結點s插入到p結點之後
p->next = s;
}
}
//實現單鏈表的按值查找,返回指定元素在單鏈表中的序號(如不存在,則返回0)
template<class DataType>
int LinkedList<DataType>::GetLocal(DataType x)
{
//定義工作指針
Node<DataType> *p = first->next;
//定義計數器,初始值是1
int count = 1;
//查找序號所對應的位置
while (p != NULL)
{
if (p->data == x)
{
return count;
}
//工作指針後移
p = p->next;
//計數器加1
count++;
}
//如果找不到該元素,則返回0
return 0;
}
//實現單鏈表按位查找,返回指定位置的元素
template<class DataType>
DataType LinkedList<DataType>::GetElement(int index)
{
//定義工作指針
Node<DataType> *p = first->next;
//定義計數器,初始值是1
int count = 1;
//查找序號所對應的位置
while (p != NULL&&count < index)
{
//工作指針後移
p = p->next;
//計數器加1
count++;
}
//如果找到單鏈表的末尾,還找不到指定的位置,則拋出異常
if (p == NULL)
{
throw "查找的位置有誤";
}
else
{
//當找到合適的位置時,返回該位置上的元素
return p->data;
}
}
//實現獲取單鏈表的長度
template<class DataType>
int LinkedList<DataType>::GetLength()
{
//定義計數器,用來計算單鏈表的長度
int count = 0;
//定義工作指針
Node<DataType> *p = first->next;
while (p != NULL)
{
p = p->next;
count++;
}
return count;
}
//實現單鏈表的按序號輸出元素
template<class DataType>
void LinkedList<DataType>::PrintLinkedList()
{
//聲明工作指針
Node<DataType> *p;
//初始化工作指針
p = first->next;
while(p != NULL)
{
cout << p->data << " ";
//工作指針向後移動
p = p->next;
}
cout << endl;
}
//實現單鏈表的刪除
template<class DataType>
DataType LinkedList<DataType>::Delete(int index)
{
Node<DataType> *p = first->next;
int count = 0;
//查找第 index-1 位置結點
while (p != NULL&&count < index - 1)
{
p = p->next;
count++;
}
//如果能找到
if (p == NULL || p->next == NULL)
{
throw "刪除的位置有誤";
}
else
{
Node<DataType> *q = p->next;
DataType x = q->data;
p->next = q->next;
delete q;
return x;
}
}
二、測試線性表之單鏈表的源文件:TestLinkedList.cpp
#include<iostream>
#include "LinkedList.h"
using namespace std;
void show()
{
cout << "---------------------------------------" << endl;
}
int main()
{
int array[] = { 1, 3, 5, 2, 7, 6, 9, 8, 10, 4};
//聲明單鏈表
LinkedList<int> linkedList = LinkedList<int>(10,array);
cout << "輸出單鏈表:" << endl;
linkedList.PrintLinkedList();
show();
cout << "單鏈表的長度:" << linkedList.GetLength() << endl;
cout << "單鏈表中第5個元素是:" << linkedList.GetElement(5) << endl;
cout << "單鏈表中元素5的位置是:" << linkedList.GetLocal(5) << endl;
show();
cout << "在單鏈表的第5個位置上插入元素22" << endl;
linkedList.Insert(5, 22);
cout << "輸出單鏈表:" << endl;
linkedList.PrintLinkedList();
cout << "單鏈表的長度:" << linkedList.GetLength() << endl;
show();
cout << "刪除第5位置的元素" << endl;
linkedList.Delete(5);
cout << "輸出單鏈表:" << endl;
linkedList.PrintLinkedList();
cout << "單鏈表的長度:" << linkedList.GetLength() << endl;
show();
return 0;
}