数据结构之单链表 C++ 实现

来源:互联网 发布:c语言二叉树非递归遍历 编辑:程序博客网 时间:2024/06/08 06:18

/*----------head.h ----------*/

#ifndef HEAD_H
#define HEAD_H

#include <iostream>
using namespace std;

#include <cstdlib>
typedef int status;
#endif

 

/*----------node.h ----------*/
#ifndef NODE_H
#define NODE_H

template <typename T> struct Node{
 T data;
 Node<T> *next;
};

#endif

/*----------list.h ----------*/

 

#ifndef LIST_H
#define LIST_H
#include "node.h"
//首元素从 1 始
template <typename T> class List{
public:
 List()
 {
  head=new Node<T>;
  head->next=NULL;
 }
 ~List()
 {
  Clear();
  delete head;
 }
 bool Empty() //判空
 {
  if(head->next==NULL)
   return true;
  else
   return false;
 }
 void Clear() //清空
 {
  while(head->next!=NULL){
   Node<T> *p=head->next;
   head->next=p->next;
   delete p;
  }
 }
 void push_back(const T &value) //压入
 {
  Node<T> *elem=new Node<T>;
  elem->data=value;
  elem->next=NULL; //构造结点
  Node<T> *p=head;
  while(p->next!=NULL)
   p=p->next;  //p指向尾结点
  p->next=elem;
 }
 void Display() //显示
 {
  Node<T> *p=head->next;
  while(p){
   cout << p->data << " ";
   p=p->next;
  }
  cout << endl;
 }
 int length() //长度
 {
  int j(0);
  Node<T> *p=head->next;
  while(p){
   j++;
   p=p->next;
  }
  return j;
 }
 int size()
 {
  int j(0);
  Node<T> *p=head->next;
  while(p){
   j++;
   p=p->next;
  }
  return j;
 }
 status Insert(int i,const T &value) //插入
 {
  if(i<1||i>this->size()+1){
   cerr << "插入位置有误,请检查: " << endl;
   return 0;
  }
  Node<T> *t=new Node<T>;
  t->data=value;
  t->next=NULL; //构造结点
  Node<T> *p=head; //寻找插入位置
  int j(0);
  while(p->next!=NULL && j!=i-1){  //注意p->next条件 决定下标起始为1,而p决定下标起始为0
   j++;
   p=p->next;
  }
  t->next=p->next;
  p->next=t;
  return 1;   
 }
 status Delete(int i) //删除
 {
  if(head->next==NULL){
   cerr << "链表为空表,操作失败! " << endl;
   return 0;
  }
  if(i<1 || i>this->size()){
   cerr << "删除位置越界,请检查: " << endl;
   return 0;
  }
  Node<T> *p=head;
  int j(0);
  while(p->next!=NULL && j!=i-1){
   j++;
   p=p->next;
  } // 令p指向 i-1 个元素位置
  Node<T> *t=p->next;
  p->next=t->next;
  delete t;
  return 1;
 }
 T GetElem(int i) //取元素
 {
  if(head->next==NULL || i<1 || i> this->size()){
   cerr << "位置越界,请检查: " << endl;
   exit(0);
  }
  Node<T> *p=head->next;
  int j(1);
  while(p->next!=NULL && j!=i){
   j++;
   p=p->next;
  }
  return p->data;
 }
 status Replace (int i,const T &value)  //替换
 {
  if(head->next==NULL || i <1 || i >this->size()){
   cerr << "位置有误,请检查:" << endl;
   exit(0);
  }
  int j(1);
  Node<T> *p=head->next;
  while(p->next!=NULL && j!=i){
   j++;
   p=p->next;
  }
  p->data=value;
  return 1;
 }
   
 
 
private: 
 Node<T> *head;
};

#endif