LinkList.h
#pragma once #includeusing namespace std; template struct Node { DataType data;//数据域 Node * next;//指针域 }; template class LinkList { public: LinkList();//建立只有头结点的空链表 LinkList(DataType a[], int n);//建立n个元素的单链表 ~LinkList();//析构函数 int length();//求单链表的长度 DataType Get(int i);//按位查找,查找第i个节点的的元素值 int Locate(DataType x);//按值查找,查找值为x的元素序号 void Insert(int i, DataType x);//插入操作,第i个位置插入值为x的结点 DataType Delete(int i);//删除操作,删除第i个结点 int Empty();//判断线性表是否为空 void PrintList();//遍历操作,按序号依次输出个元素 private: Node * first;//单链表的头指针 }; template LinkList ::LinkList()//建立只有头结点的空链表 { first = new Node ;//生成头结点 first->next = NULL; } template int LinkList ::Empty()//判断线性表是否为空 { if (first->next == NULL)return false; else return true; } template void LinkList ::PrintList()//遍历操作,按序号依次输出个元素 { Node * p = first->next;//工作p指针初始化 while (p != NULL) { cout << p->data << 't'; p = p->next; } cout < int LinkList ::length()//求单链表的长度 { Node * p = first->next;//工作指针初始化 int count = 0;//累加器初始化 while (p!= NULL) { p = p->next; count++; } return count; } template DataType LinkList ::Get(int i)//按位查找,查找第i个节点的的元素值 { Node * p = first->next;//工作指针p初始化 int count = 1;//累加器count初始化 while(p != NULL && count < i) { p = p->next;//工作指针p向后移 count++; } if (p == NULL)throw"查找位置错误"; else return p->data; } template int LinkList ::Locate(DataType x)//按值查找,查找值为x的元素序号 { Node * p = first->next;//工作指针p初始化 int count = 1;//累加器count初始化 while (p != NULL) { if (p->data == x)return count; p = p->next; count++; } return 0; } template void LinkList ::Insert(int i, DataType x)//插入操作,第i个位置插入值为x的结点 { Node * p = first, * s = NULL; int count = 0; while (p != NULL && count < i - 1)//查找第i-1个结点 { p = p->next;//工作指针p向后移 count++; } if (p == NULL)throw"插入位置错误"; else { s = new Node ; s->data = x;//申请结点s,数据域为x; s->next = p->next;//将结点s插入结点p之后 p->next = s; } } template LinkList ::LinkList(DataType a[], int n)//建立n个元素的单链表 { first = new Node ;//生成头结点 Node * r = first, * s = NULL; for (int i = 0; i < n; i++) { s = new Node ; s->data = a[i]; r->next = s; r = s;//将结点s插入终端结点之后 } r->next = NULL; } template DataType LinkList ::Delete(int i)//删除操作,删除第i个结点 { DataType x; Node *p = first, * q = NULL; int count = 0; while (p != NULL && count < i - 1) { p = p->next; count++; } if (p == NULL || p->next == NULL)//结点p不存在或p的后继结点不存在 throw"删除位置错误"; else { q = p->next; x = q->data;//暂存被删结点 p->next = q->next;//摘链 delete q; return x; } } template LinkList ::~LinkList()//析构函数 { Node * p = first; while (first != NULL)//释放每一个结点的存储空间 { first = first->next;//first指向被释放结点的下一个结点 delete p; p = first;//工作指针后移 } }
main.cpp
#include "LinkList.h" #include暑期编程PK赛 得CSDN机械键盘等精美礼品!using namespace std; int main(void) { int r[5] = {1,2,3,4,5},i,x; LinkList L(r,5); cout << "当前线性表的数据为:"; L.PrintList();//输出当前链表1 2 3 4 5、 try { L.Insert(2, 8);//在第二个位置插入值为8的结点 cout << "执行插入操作后数据为:"; L.PrintList();//输出插入后链表1 8 2 3 4 5 } catch (char *str) { cout << str << endl; } cout << "当前链表的长度为:" << L.length() << endl;//输出链表长度 cout << "请输入查找的元素值:"; cin >> x; i = L.Locate(x); if (i > 0)cout << "元素" << x << "的位置为:" << i << endl; else cout << "单链表中没有元素" << x << endl; try { cout << "请输入要删除第几个元素:"; cin >> i; x = L.Delete(i);//删除第i个元素 cout << "删除的元素值为:" << x << ",执行删除操作后的数据为:"; L.PrintList();//输出删除后的单链表 } catch (char* str) { cout << str << endl; } return 0; }



