【数据结构】1-1 线性表
//单链表.cpp #include"LinkList.h" #include<iostream> template<class T> LinkList<T>::LinkList() { head = new Node<T>; head->link = NULL; } template<class T> void LinkList<T>::Clear() { if (head != NULL) { Node<T> *p; p = head->link; while (p != NULL) { Node<T> *del = p; p = p->link; delete del; } head=NULL; } } template<class T> LinkList<T>::LinkList(T data[], int mSize) { head = new Node<T>; head->data = data[0]; head->link = NULL; Node<T> *end = head; //头结点创建并初始化完毕 for (int i = 1; i < mSize; i++) { Node<T> *p = new Node<T>; p->data = data[i]; p->link = NULL; end->link = p; end = p; } } template<class T> bool LinkList<T>::Insert(int pos, const T&x) { int cont = 1; Node<T> *p = head; bool flag = false; while (p != NULL&&cont<=pos-1) { if (cont == pos - 1) { Node<T> *add = new Node<T>; add->data = x; add->link = p->link; p->link = add; flag = true; break; } else { cont++; p = p->link; } } return flag; } template<class T> bool LinkList<T>::Remove(int pos, T&x) { int cont = 1; Node<T> *p = head; bool flag = false; while (p != NULL && cont <= pos - 1) { if (cont == pos - 1) { Node<T> *del = p->link; p->link = p->link->link; x=del->data; delete del; flag = true; break; } else { cont++; p = p->link; } } return flag; } template<class T> bool LinkList<T>::Replace(int pos, const T&x) { int cont = 1; Node<T> *p = head; bool flag = false; while (p != NULL && cont <= pos) { if (cont == pos) { p->data = x; flag = true; break; } else { cont++; p = p->link; } } return flag; } template<class T> int LinkList<T>::Length()const { int cont = 0; Node<T> *p = head; while (p != NULL) { cont++; p = p->link; } return cont; } template<class T> bool LinkList<T>::IsEmpty() const { return head == NULL; } template<class T> void LinkList<T>::Output() const { Node<T> *p = head; int cont = 0; while (p != NULL) { cout << p->data << " "; p = p->link; cont++; if (cont % 10 == 0) cout << endl; } cout << endl; } template<class T> bool LinkList<T>::search(const T&x) const { bool flag = false; Node<T> *p = head; while (p != NULL) { if (p->data == x) { flag = true; break; } p = p->link; } return flag; }
头文件:
//LinkList.h #include<iostream> using namespace std; template<class T> struct Node //结点结构 { T data; //结点数据 Node*link; Node() { link = NULL; } Node(T e, Node *next = NULL) { data = e; link = next; } }; template<class T> class LinkList //带表头结点的单链表类 { private: Node<T> *head; //链表指针 public: LinkList(); //构造带表头结点的空单链表 LinkList(T data[], int mSize);//构造有mSize个元素的单链表 ~LinkList() { Clear(); } //析构函数 bool Insert(int pos, const T&x); //在单链表第pos个元素前插入元素x bool Remove(int pos, T&x); //删除单链表第pos个元素 bool Replace(int pos, const T&x); //将修改单链表第pos个元素为x int Length()const; //求表长 bool IsEmpty() const; //判空操作 void Clear(); //清空操作 void Output() const; //输出链表 bool search(const T&x) const;//查找元素x在表中是否存在 };
测试代码:
//测试.cpp #include"单链表.cpp" #include<ctime> void menu()//模拟菜单选项 { cout << "********************************************************" << endl; cout << "* 1 ------------输出链表 *" << endl; cout << "* 2 ------------插入元素 *" << endl; cout << "* 3 ------------删除元素 *" << endl; cout << "* 4 ------------销毁链表 *" << endl; cout << "* 5 ------------查找 *" << endl; cout << "* 0 ------------退出系统 *" << endl; cout << "********************************************************" << endl; } const int N = 20; int main() { srand((unsigned)time(NULL));//以系统当前时间初始化随机数发生器 int data[N]; for (int i = 0; i < N; i++) data[i]=rand()%100;//用随机数发生器产生100以内的整数 LinkList<int> L(data, N);//创建N个元素的单链表 menu(); while (1) //模拟菜单工作方式 { int select; cout << "请输入您的选择:"; cin >> select; switch (select) { case 1: //输出单链表 if (L.IsEmpty()) { cout << "链表为空!" << endl; } else L.Output(); break; case 2: //插入 int pos, elem; cout << "请输入插入位置:"; cin >> pos; cout << "插入元素:"; cin >> elem; if (L.Insert(pos, elem)) //插入成功 cout << "在第" << pos << "个元素前成功插入" << elem << endl; else //插入失败 cout << "插入位置不合法!" << endl; break; case 3: //删除 cout << "请输入删除位置:"; cin >> pos; int x; if (L.Remove(pos, x))//删除单链表的第pos个元素 cout << "单链表的第" << pos << "个元素" << x << "已被删除。" << endl; else cout << "删除位置不合法!" << endl; break; case 4: //销毁链表 char OK; cout << "确定要销毁链表吗?(y/n)" << endl; cin >> OK; if (OK == 'y' || OK == 'Y') L.Clear(); break; case 5: //查找 cout << "请输入查找元素:"; cin >> elem; if (L.search(elem)) cout << "查找成功!" << endl; else cout << "查找失败!" << endl; break; case 0: //退出 exit(0); default: cout << "您输入的选项有误,请重新输入:"; } } return 0; }
测试结果: