1. 程式人生 > >實驗三 用靜態連結串列實現學生成績管理系統

實驗三 用靜態連結串列實現學生成績管理系統

#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;
}