實驗三 用靜態連結串列實現學生成績管理系統
阿新 • • 發佈:2018-12-03
#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; }