C++实现静态链表

#include<iostream>
using namespace std;

const size_t MAXSIZE =100;
typedef struct SListNode {
	int data;
	size_t cur;
	
}StaticList[MAXSIZE];


 //初始化链表函数
 void InitSList(StaticList & space )
 {
	 for(int i=0;i< MAXSIZE -1 ;i++)
  {
	  space[i].cur  = i+1;
  }

	 space[MAXSIZE -1].cur = 0;//构成循环
 }

 //分配节点(只需要返回被分配节点在数组中的下标即可)
 int Malloc_SL(StaticList & space )
 {
	 int i = space[0].cur;
	 if(i)
	 {
		 space[0].cur = space[i].cur;//把i节点从空闲链表中删除
	 }
	 return i;
 }

 //回收节点到空闲链表
 void Free_SLNode(StaticList & space,int t)
 {
	 space[t].cur = space[0].cur;
	 space[0].cur = t;
 }
 //插入
 bool insert(StaticList & space,int h,int m,int t)//在第t个元素之前插入一个下标值为m的新节点
 {
  if(t<=0)
  {
    return false;
  }
  int i = h;
  int n = 0;//计数器
  while(i)
  {
	  if(n == t-1 && space[i].cur)//找到插入节点
	{
		space[m].cur = space[i].cur;
		space[i].cur = m;
		return true;
	}
	i = space[i].cur;
	n++;
  }
  return false;
 }

 //删除第n个节点
 bool dele(StaticList & space,int h, int n)
 {
	 if(n<0) return false;
	 int i=h;
	 int m =0;
	 while(i)
	 {
	  if(m == n-1)
	  {   int t = space[i].cur;
		  space[i].cur = space[t].cur;
		  Free_SLNode(space,t);//回收被删除的节点
		  return true;
	  }
	  i = space[i].cur;
	  m++;
	 }
	 return false;
 }

 //在表尾增加一个新节点
 bool add(StaticList & space,int h,int m)//m代表新增加节点的下标值,h表示数据链表的头结点
 {
	 int i = h;
	 while(space[i].cur)
	 {
       i = space[i].cur;
	 }
	 space[i].cur = m;
	 space[m].cur = 0;
	 return true;
 }

int main()
{
	//定义一个静态链表
	StaticList MyList;
	InitSList(MyList);
	//分配一个新节点做为数据节点   空闲节点的默认头节点为0
	int h = Malloc_SL(MyList);
	MyList[h].cur = 0;
	//添加新节点
	int t = Malloc_SL(MyList);
	MyList[t].data = 1;
	add(MyList,h,t);
	t = Malloc_SL(MyList);
	MyList[t].data = 2;
	add(MyList,h,t);
	t = Malloc_SL(MyList);
	MyList[t].data = 3;
	add(MyList,h,t);
	//遍历并输出该链表上的所有数据
	cout<<"遍历并输出该链表上的所有数据:"<<endl;
	int i = MyList[h].cur;
	while (i)
	{
		cout<<MyList[i].data<<"  ";
		i = MyList[i].cur;
	}
	cout<<endl;
	//在第2个元素之前插入一个新节点
	cout<<"在第2个元素之前插入一个值为5的新节点:"<<endl;
	t = Malloc_SL(MyList);
	MyList[t].data = 5;
	insert(MyList,h,t,2);
	 i = MyList[h].cur;
	while (i)
	{
		cout<<MyList[i].data<<"  ";
		i = MyList[i].cur;
	}
	cout<<endl;

	//删除第2个节点
	cout<<"删除第2节点:"<<endl;
	dele(MyList,h,2);
	i = MyList[h].cur;
	while (i)
	{
		cout<<MyList[i].data<<"  ";
		i = MyList[i].cur;
	}
	cout<<endl;


}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值