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

#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(SLinkListspace,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;
	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;
}

阅读更多

没有更多推荐了,返回首页