静态链表类模板实现(带测试代码)

#include <iostream> 
using namespace std;
const int maxSize=100;//静态链表的大小 
template <class T>
struct SLinkNode
{
    T data;
    int link;
 };//结点类定义 
 template <class T>
 class StaticList{
     int vail;//可分配空间的起始位置
     SLinkNode<T> elem[maxSize] ;
     public:
         void InitList();
         int Length();//长度 
         int Search(T x);//查询 
         int Locate(int i);//定位某个位置 
         bool Append(T x);//末尾添加 
         bool Insert(int i,T x);//插入 
         bool Remove(int i);//删除 
         bool IsEmpty();//判断是否为空 
         void output();//输出 
 };
 template <class T>
 void StaticList<T>::InitList()
 {
     elem[0].link=-1;
     vail=1;//从1开始建立带头结点的空链表 
     for(int i=1;i<maxSize-1;i++)
     {
         elem[i].link=i+1;
     }
         elem[maxSize-1].link=-1;
 };
 template <class T>
 int StaticList<T>::Length() //计算长度 
 {
     int p=elem[0].link;
     int i=0;
     while(p!=-1)
     {
         p=elem[p].link;
         i++;
     }
     return i;
 };
 template <class T>
 bool StaticList<T>::IsEmpty()
 {
     if(elem[0].link==-1)//判断是否为空 
     return true;
     else
     return false;
 };
 template <class T>
 int StaticList<T>::Search(T x)
 {
     //查找指定值
     int p=elem[0].link;
     while(p!=-1)
     {
         if(elem[p].data=x)//找到 
         {
         
             cout<<"查找成功" <<endl;
                 break;
             
         }
         
         else
         p=elem[p].link;//移动 
     }
     
         return p;
 };
 template <class T>
 int StaticList<T>::Locate(int i) //定位函数 
 {
     if(i<0) 
     {
         return -1;
     }
     if(0==i)
     {
         return 0;
     }
     int j=1;
     int p=elem[0].link;
     while(p!=-1&&j<i)//未到结尾且位置未到 
     {
         p=elem[p].link;//移动 
         j++;
     }
     return p;    
 }
 template <class T>
 bool StaticList<T>::Append(T x)//表尾添加结点 
 {
     if(-1==vail)
     return false;//没有空间 
     int q=vail;//分配结点 
     vail=elem[vail].link;
     elem[q].data=x;
     elem[q].link=-1;
     int p=0;//查找表尾
     while(elem[p].link!=-1) 
     {
         p=elem[p].link;
     }
     elem[p].link=q;
     return true;
 };
  template <class T>
  bool StaticList<T>::Insert(int i,T x){//在第i个结点后插入新的结点
  int p=Locate(i);
  if(i=-1)
  {
      return false;//找不到 
  }
  int q=vail;//分配结点
  vail=elem[vail].link;//原来的位置进行移动
  elem[q].data=x;
  elem[q].link=elem[p].link;//链入;
  elem[p].link=q;
  return true;
};
 template <class T>
 bool StaticList<T>::Remove(int i)//删除第i个位置的元素 
 {
     int p=Locate(i-1);//定位 
     if(-1==p)
     {
         return false;//出错 的情况 
     }
     int q=elem[p].link;//取 
     elem[p].link=elem[q].link;//摘下 
     elem[q].link=vail;
     vail=q;
     return true;//释放空间 
 };
  template <class T>
  void StaticList<T>::output() 
  {
   for(int i=1;i<=Length();i++)//注意这里的下标 
   {
       cout<<elem[Locate(i)].data<<" " ;
   }
   cout<<endl;
  };
  int main()
  {
      cout<<"---------静态链表-------"<<endl;
      StaticList<int> stl;
      cout<<"建立成功"<<endl;
      stl.InitList();
      cout<<"初始化成功"<<endl;
      int choice;
      bool end=false;
      while(!end)
      {
          cout<<"1:插入元素"<<endl;
          cout<<"2:删除元素" <<endl;
          cout<<"3:获取链表长度"<<endl;
          cout<<"4:输出链表元素" <<endl;
          cout<<"5:判断链表是否为空"<<endl;
          cout<<"6:查找指定元素"<<endl;
          cout<<"7:退出"<<endl;
          cout<<"请输入操作"<<endl;
          cin>>choice;
          switch(choice)
          {
              case 1:
                  cout<<"请输入要插入的元素个数"<<endl;
                  int n;
                  cin>>n;
                  cout<<"请输入要插入的元素"<<endl;
                  int a[100];//可修改 
                  for(int i=0;i<n;i++)
                  {
                      cin>>a[i];
                      stl.Append(a[i]);
                  }
                  cout<<"插入后的链表元素为"<<endl;
                  stl.output();
                  break;
                  case 2:
                      cout<<"请输入要删除的位置"<<endl;
                      int w;
                      cin>>w;
                      stl.Remove(w);
                      cout<<"删除后链表元素为"<<endl;
                      stl.output();
                      break;
                      case 3:
                          cout<<"链表长度为"<<stl.Length()<<endl;
                          break;
                          case 4:
                              stl.output();
                              break;
                              case 5:
                              if(    stl.IsEmpty())
                              {
                                  cout<<"链表为空!"<<endl;
                              }
                              else
                              cout<<"链表非空!";
                                  break;
                                  case 6:
                                      cout<<"请输入要查找的值"<<endl;
                                      int x;
                                      cin>>x;
                                      stl.Search(x);
                                      break;
                                      case 7:
                                          end=true;
                                          break;
                                          default:
                                              cout<<"输入错误请重新输入!!!"<<endl;
          }
      }
      return 0;
  }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值