链表
来源:互联网 发布:詹姆斯生涯场均数据 编辑:程序博客网 时间:2024/05/29 03:02
链表(linked list)
1.通过指针把它的一串存储结点链成一个链
2.存储节点由两部分组成:
- 数据域 + 指针域(后继地址)
3.分类(根据链接方式和指针多寡)
单链表(singly linked list)
1.简单的单链表
- 整个单链表:head
- 第一个结点:head
- 空表判断: head == NULL
- 当前结点a1 :curr
2.带头结点的单链表
- 整个单链表:head
- 第一个结点:head->next,head != NULL
- 空表判断: head->next == NULL
当前结点a1:fence->next(curr隐含)
单链表的定义
class lnklist::public List<T> {private: Link<T> *head,*tail; //单链表的头,尾指针 Link<T> *setPos(const int p); //第p个元素指针public: lnkList(int s); //构造函数 ~lnkList(); bool isEmpty(); //判断链表是否为空 void clear(); //将链表存储的内容清除,成为空表 int length(); //返回当前实际长度 bool append(const T value); //在表尾添加元素value,表的长度增1 bool insert(const int p,const T value); //位置p上插入一个元素 bool delete(const int p); //删除位置上的元素 bool getValue(const int p,T& value); //返回位置p的元素 bool getPos(int &p,const T value); //查找值为value的元素};
查找单链表中第i个结点
//函数返回值是找到的结点指针template<class T> //元素类型为TLink<T>*lnkList<T>::setPos(int i){ int count=0; if(i==-1) //i为-1则定位到头结点 return head; //循环定位,若i为0则定位到第一个结点 Link<T>*p=head->next; while(p!=NULL&&count<i) { p=p->next; count++; } //当链表中结点数小于i时返回NULL return p;}
单链表的插入
//插入数据内容为value的新结点作为第i个结点template<class T>bool lnkList<T>::insert(const int i,const T value){ Link<T>*P,*q; if((p=setPos(i-1))==NULL) //p是第i个结点前驱 { cout<<"非法插入点"<<endl; return false; } q=new link<T>(value,p->next); p->next=q; if(p==tail) //插入点在链尾,插入结点成为新的链尾 tail=q; return true;}
单链表的删除
1.从链表中删除结点x
- 用p指向元素x的结点的前驱结点
- 删除元素为x的结点
- 释放x占据的空间
template<class T>bool lnkList<T>::delete((const int i)){ Link<T>*P,*q; //待当前结点不存在,即给定的i大于当前链中元素的个数 if((p=setPos(i-1))==NULL||p==tail) { cout<<"非法删除点"<<endl; return false; } q=p->next; //q是待删结点 if(q==tail) //待删结点为尾结点,则修改尾指针 { tail=p; p->next=NULL; } else //删除结点q并修改链指针 p->next=q->next; delete q; return true;}
阅读全文