【C++数据结构学习笔记---线性表】用单链表实现线性表

来源:互联网 发布:全文期刊数据库 编辑:程序博客网 时间:2024/05/18 11:49

【C++数据结构学习笔记---线性表】用单链表实现线性表

一个简单的实现例子,只用到了插入函数以及输出函数,初始化26个英文字母,删除第三个字母,即C。

插入算法的思路:(insert)本算法为结点后插入

1、声明一结点p指向链表第一个结点,初始化i从0开始。

2、遍历链表,让指针p向后移动,直至移动到要插入元素的结点,即向后移动k-1次。

3、在系统中新建一个结点s。

4、判断k的值,如果值为0代表在第一个结点前插入元素。使用s->next=first; first=s;语句来插入。

如果值不为0,则使用s->next=p->next; p->next=s;

删除算法的思路:(erase)本算法为删除第k个结点

1、声明一结点p指向链表第一个结点,初始化i从0开始。

2、判断k的值,如果值为1代表删除第一个结点,则使用first=first->next; delete p;语句来删除。

如果值不为1,执行3。

3、遍历链表,让指针p向后移动,一直移动到要删除结点的前一个结点,即向后移动k-2次。

4、标记一个q指针,赋值为q=p->next;即q指向要删除的结点。

5、执行删除语句p->next=q->next(这里也可以理解为p->next=p->next->next,即跳过要删除的那个结点)

6、释放q结点。

#include <iostream>using namespace std;template <typename T>class List;template <typename T>class Node{friend class List<T>;private:T data;Node<T> *next;};template <typename T>class List{public:List(){first=0;}//构造函数~List();//析构函数bool empty()const{return 0==first;}//测试表是否为空int size()const;//返回表的长度bool retrieve(int k,T& x)const;//返回表位置k处的元素xint locate(const T& x)const;//返回元素x在表中的位置List<T>& insert(int k,const T& x);//在位置k处插入元素xList<T>& erase(int k);//从位置k处删除元素void print_list();//打印表private:Node<T> *first;};template <typename T>List<T>::~List(){Node<T> *p=first;while(first){p=first->next;delete first;first=p;}}template <typename T>int List<T>::size()const{Node<T> *p=first;int len=1;while(p){p=p->next;++len;}return len;}template <typename T>bool List<T>::retrieve(int k,T& x)const{Node<T> *p=first;int i=0;while(p && (i<k-1)){p=p->next;++i;}if (p){x=p->data;return true;}elsereturn false;}template <typename T>int List<T>::locate(const T& x)const{Node<T> *p=first;int i=1;while(p){if (p->data==x){return i;}p=p->next;++i;}return 0;}template <typename T>List<T>& List<T>::insert(int k,const T& x){Node<T> *p=first;int i=0;while(p && i<k-1){p=p->next;++i;}Node<T> *s=new Node<T>;s->data=x;if (k){s->next=p->next;p->next=s;}else{s->next=first;first=s;}return *this;}template <typename T>List<T>& List<T>::erase(int k){Node<T> *p=first;int i=0;if (1==k){first=first->next;delete p;}else{while(p && i<k-2){p=p->next;++i;}Node<T> *q=p->next;p->next=q->next;delete q;}return *this;}template <typename T>void List<T>::print_list(){Node<T> *p=first;while(p){cout <<p->data <<" ";p=p->next;}}int main(){int s1,s2;s1='A';s2='Z';List<char> p;for(int i=s2;i>=s1;i--){p.insert(0,i);}p.erase(3);p.print_list();return 0;}