静态链表--简单操作

以下是某同学的成绩,通过静态链表实现增加,删除,查询等功能


#include<iostream>
using namespace std;
#define MAX 100
typedef struct SListNode {
	int data;  //所存放的数据
	int cur;  //游标 !注意游标不同于下标
	
}StaticList[MAX];



 void Init(StaticList & space )    //初始化数组
 {
	 for(int i=0;i< MAX -1 ;i++)
	  space[i].cur  = i+1;
	 space[MAX -1].cur = 0;   //目前静态链表为空,最后一个元素的cur为0;
	 
 }


 int Malloc(StaticList & space )   //申请节点
 {
	 int i = space[0].cur;   //当前数组第一个元素的cur值
	 if(space[0].cur)
	 {
		 space[0].cur = space[i].cur;   //拿出第一个分量,所以下一个分量用来备用
	 }
	 return i;    //返回第一个备用的下标
 }


 void Free(StaticList & space,int k)   //释放节点
 {
	 space[k].cur = space[0].cur;
	 space[0].cur =k; //此时k成了第一个avail
 }
 
int insert(StaticList & space,int avail,int t,int pl)插入  在第pl个元素之前插入一个下标值为m的新节点
 {
  if(pl<=0)
  {
    return 0;
  }
  int i = avail;
  int n = 0;//计数器
  while(i)
  {
	  if(n ==pl-1 && space[i].cur)//找到插入节点
	{
		space[t].cur = space[i].cur;
		space[i].cur = t;
		
	}
	i = space[i].cur;
	n++;
  }
  return 0;
 }


int dele(StaticList & space,int avail, int pl)   //删除
 {
	 if(pl<0) return 0;
	 int i=avail;
	 int m =0;
	 while(i)
	 {
	  if(m == pl-1)
	  {   int t = space[i].cur;
		  space[i].cur = space[t].cur;
		  Free(space,t);//回收被删除的节点
		  
	  }
	  i = space[i].cur;
	  m++;
	 }
	 return 0;
 }


int add(StaticList & space,int avail,int t)//增加
 {
	 int i =avail;
	 while(space[i].cur)
	 {
       i = space[i].cur;
	 }
	 space[i].cur = t;
	 space[t].cur = 0;
	 return 0;
 }


int Get(StaticList & space ,int i,int n){
	int x;
    cout<<"请输入要查找的结点:"<<endl;
	cin>>x;
       for(i=0;i<n;i++)
     {
        if(space[i].data==x)
        return i;
      }

     cout<<"该节点的位置是:"<<i+1<<endl;
}



void Print(StaticList & space, int avail,int m ){  //打印
   cout<<"打印链表值如下:"<<endl;
	 m = space[avail].cur;
	while (m)
	{
		cout<<space[m].data<<"  ";
		m = space[m].cur;
	}
	cout<<endl;
  }

int main()
{    int t,i,n,num,pl,w;
	 
	//定义一个静态链表
	StaticList List;
	Init(List);

	int avail = Malloc(List);//avail点
	List[avail].cur = 0;


     cout<<"请输入静态链表的节点个数:"<<endl;
     cin>>n;
     cout<<"请输入静态链表的每个节点:"<<endl;
      for(i=0;i<n;i++)
	 {
       t=Malloc(List);
       cin>>List[t].data ;
       add(List,avail,t);
	 }
	Print(List,avail,i);
    
	cout<<"请输入要查找结点的位置:"<<endl;
	cin>>w;
	cout<<"该节点为: "<<List[w+1].data<<endl;

	cout<<"请输入插入结点的位置和值:"<<endl;
	cin>>pl>>num;
	t = Malloc(List);
	List[t].data = num;
    insert(List,avail,t,pl);
	Print(List,avail,i);
    
	cout<<"请输入要删除结点的位置:"<<endl;
	cin>>pl;
	dele(List,avail,pl);
	n--;
    Print(List,avail,i);
	 Get(List,i,n);

    
    
return 0;

}




实验结果如图:





实验心得:

     一:

 在c++中如果用typedef的区别:
    struct   Student   
    {   
    int   a;   
    }stu1;//stu1是一个变量  

 
    typedef   struct   Student2   
    {   
    int   a;   
    }stu2;//stu2是一个结构体类型=struct Student  

 
    使用时可以直接访问stu1.a
    但是stu2则必须先   stu2 s2;
    然后               s2.a=10;


二、比之前更懂得了框架的作用,打包函数。以及函数传参具体是怎么实现的。里面的逻辑以及实际运用


三、本实验中的创建一个新节点并赋值。在调用add 函数这一操作。让我有种似曾相识的感觉。嗯,没错就是js里的创建节点,追加到父节点上。。。总之呢,语言就像乐器一样是相通的。重要的是把基础打牢以不变应万变。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值