单链表定义:
/* Author : grey_qisen */ // LinkList.h -- initialization of linklist #ifndef LinkList_H #define LinkList_H #include <iostream> using namespace std; template<class DataType> struct LinkNode{ DataType data; LinkNode<DataType> *next; }; template<class DataType> class LinkList{ public: LinkList(); // 无参构造单链表 LinkList_B(DataType a[],int n); // 头插法构造单链表 LinkList_E(DataType a[],int n); // 尾插法构造单链表 ~LinkList(); // 析构函数 int length(); // 返回单链表表长 bool Insert(int p,DataType x); // 在第p个结点处插入结点 bool Delete_l(int p); // 按位删除第i个结点 bool Delete_v(DataType x); // 按值删除所有值为x的结点 DataType Find_l(int p); // 按位查找第i个结点的值 int Find_v(DataType x); // 按值查找值为x的元素位置 void PrintList(); // 顺序打印单链表 private: LinkNode<DataType> *head; // 单链表头指针 }; template<class DataType> LinkList<DataType>::LinkList(){ // 无参构造单链表 head = new LinkNode<DataType>; head->next = NULL; } template<class DataType> LinkList<DataType>::LinkList_B(DataType a[],int n){ // 头插法构造单链表 head = new LinkNode<DataType>; head->next = NULL; LinkNode<DataType> *s; for(int pos = 0;pos < n;pos++){ s = new LinkNode<DataType>; s->data = a[pos]; s->next = head->next; head->next = s; } } template<class DataType> LinkList<DataType>::LinkList_E(DataType a[],int n){ // 尾插法构造单链表 head = new LinkNode<DataType>; head->next = NULL; LinkNode<DataType> *s; LinkNode<DataType> *temp; temp = head; for(int pos = 0;pos < n;pos++){ s = new LinkNode<DataType>; s->data = a[pos]; s->next = temp->next; temp->next = s; temp = s; } temp->next = NULL; } template<class DataType> LinkList<DataType>::~LinkList(){ // 析构函数 LinkNode<DataType> *temp; while(head->next != NULL){ temp = head; head = head->next; delete temp; } } template<class DataType> int LinkList<DataType>::length(){ // 单链表求长 int length = 0; LinkNode<DataType> *temp; temp = head; while(temp->next != NULL){ temp = temp->next; length += 1; } cout << "This LinkList has " << length << " nodes." << endl; return length; } template<class DataType> bool LinkList<DataType>::Insert(int p,DataType x){ // 在第p个结点处插入结点 LinkNode<DataType> *temp; LinkNode<DataType> *s; s = new LinkNode<DataType>; int pos = 0; s->data = x; temp = head; while(temp != NULL && pos < p-1){ temp = temp->next; pos++; } if(temp == NULL){ cout << "ERROR Parameters!" << endl; return false; } else{ s->next = temp->next; temp->next = s; cout << "Insert success!" << endl; return true; } } template<class DataType> bool LinkList<DataType>::Delete_l(int p){ // 按位删除第p结点 if(p < 1){ cout << "ERROR Parameters!" << endl; return false; } int pos = 0; LinkNode<DataType> *temp; LinkNode<DataType> *s; temp = head; while(temp != NULL & pos < p-1){ temp = temp->next; pos++; } if(temp == NULL || temp->next == NULL){ cout << "ERROR Parameters!" << endl; } else{ s = temp->next; temp->next = temp->next->next; delete s; cout << "Delete Success!" << endl; return true; } } template<class DataType> bool LinkList<DataType>::Delete_v(DataType x){ // 按值删除所有值为x的结点 DataType D_temp; int num = 0; LinkNode<DataType> *N_temp; LinkNode<DataType> *s; N_temp = head; while(N_temp->next != NULL){ if(N_temp->next->data == x){ s = N_temp->next; N_temp->next = N_temp->next->next; delete s; cout << "Program has been delete " << ++num << " Node." << endl; } else{ N_temp = N_temp->next; } } return true; } template<class DataType> DataType LinkList<DataType>::Find_l(int p){ // 按位查找第p个结点的值 int pos = 0; LinkNode<DataType> *temp; temp = head; if(p < 1){ cout << "ERROR Parameters!" << endl; } else{ while(pos < p){ if(temp == NULL){ cout << "ERROR Parameters!" << endl; } else{ temp = temp->next; pos += 1; } } cout << "The " << p << "th node's data is " << temp->data << "." << endl; return temp->data; } } template<class DataType> int LinkList<DataType>::Find_v(DataType x){ // 按值查找第一个值为x的结点 int pos = 1; LinkNode<DataType> *temp; temp = head->next; while(temp != NULL){ if(temp->data == x){ cout << "The " << pos << "th node's data is " << x << "." << endl; return pos; } else{ temp = temp->next; pos += 1; } } cout << "The Node you want to find is not exit in this linklist!" << endl; return 0; } template<class DataType> void LinkList<DataType>::PrintList(){ // 顺序打印单链表 LinkNode<DataType> *temp; temp = head->next; while(temp != NULL){ cout << temp->data << " "; temp = temp->next; } cout << "#" << endl; } #endif
单链表测试
/* Author : grey_qisen */ //LinkList.cpp -- testing the LinkList #include<iostream> #include"LinkList.h" using namespace std; int main(){ char num[5] = {'a','b','c','d','e'}; // --------------- 头插法检测 ----------------------------- LinkList<char> NumList_B; NumList_B.LinkList_B(num,5); NumList_B.PrintList(); NumList_B.length(); NumList_B.Insert(6,'f'); NumList_B.PrintList(); NumList_B.length(); NumList_B.Delete_l(6); NumList_B.PrintList(); NumList_B.Delete_v('a'); NumList_B.PrintList(); NumList_B.Find_l(0); NumList_B.Find_l(3); NumList_B.Find_v('e'); NumList_B.Find_v('f'); return 0; }