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