以下是某同学的成绩,通过静态链表实现增加,删除,查询等功能
#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里的创建节点,追加到父节点上。。。总之呢,语言就像乐器一样是相通的。重要的是把基础打牢以不变应万变。