实验三 静态链表实现学生成绩系统

#include<iostream.h>
#include<stdlib.h>
typedef int ElemType;
typedef int DataType;
const int MaxSize=100;
typedef struct
{
ElemType data;
int cur;
}SLinkList [MaxSize];
 


class SLink
{
public:
void Free_SL(SLinkList space,int k);
int Malloc_SL(SLinkList space);
void SLinkInit(SLinkList space);
int SListLength(SLinkList space);
void SlistInsert(SLinkList space,int i,ElemType e);
void SListDelete(SLinkList space,int i);
void SListTraverse(SLinkList space);
};




//将下标为K的空闲结点回收到备用链表
void SLink::Free_SL(SLinkList space,int k)
{
space[k].cur=space[0].cur;  //将备用链表链到K之后
space[0].cur=k;             //将K链到备用链表头之后
}


//分配备用链表的一个结点,返回下标
//若为0,则说明备用链表用完
int SLink::Malloc_SL(SLinkList space)  //备用链表
{
int i=space[0].cur;
if(space[0].cur)                    //判断备用链表是否非空
space[0].cur=space[i].cur;      //备用链表头指针指向第二个空结点
return i;                            //返回第一个空结点
}


void SLink::SLinkInit(SLinkList space)
{
int i;
for(i=0;i<MaxSize;i++)
space[i].cur=i+1;            //讲所有结点链入备用链表
space[0].cur=space[1].cur;       //备用链表头指针链向第二个结点
space[1].cur=0;                //第一个结点作为链表的头结点
}


//获取链表长度
int SLink::SListLength(SLinkList space)
{
int len=0;
int i=space[1].cur;  //用头指针第一个结点的下标
while(i)
{
++len;
i=space[i].cur;
}
return len;
}


//在链表的第i个位置插入元素
void SLink::SlistInsert(SLinkList space,int i,ElemType e)
{
if(i<1||i>SListLength(space)+1)  //超出范围
return;
int k=1,j;
for(j=0;j<i-1;j++)      //使K指示要插入的结点的前一个结点
k=space[k].cur;
int v=Malloc_SL(space);
if(v)   //如果有空间
{
space[v].data=e;
space[v].cur=space[k].cur;
space[k].cur=v;     //插入链表
}
}


//删除第i个位置的元素
void SLink::SListDelete(SLinkList space,int i)
{
if(i<1||i>SListLength(space))  //超出范围退出
return ;
int k=1,j;
for(j=0;j<i-1;j++)        //使K指示要删除的结点的前一个结点
k=space[k].cur;
int temp=space[k].cur;
space[k].cur=space[temp].cur;
Free_SL(space,temp);
}


void SLink::SListTraverse(SLinkList space)
{
int i=space[1].cur;
while(i)
{
cout<<space[i].data<<endl;
i=space[i].cur;
}
}


int main()
{
cout<<"***********************************"<<endl;
cout<<"        静态链表实现学生成绩"<<endl;
cout<<"***********************************"<<endl;
cout<<"@@@@@学生的数据结构成绩为:"<<endl;
SLink L;
SLinkList space;
L.SLinkInit(space);         //初始化
int i;
for(i=1;i<=5;i++)
L.SlistInsert(space,1,i);
L.SListTraverse(space);
cout<<endl<<endl<<"@@@@@删除位置3:"<<endl;
L.SListDelete(space,3);
L.SListTraverse(space);
return 0;
}

本来第一次上交的静态链表不能运行,搜索了一些别人的代码之后照着敲了下来然后大致修改了一下,但是主函数还是很欠缺,下来会继续改正。

猜你喜欢

转载自blog.csdn.net/laufen_j/article/details/80140102