4、静态链表
实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
实验内容
建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
#include <iostream>
using namespace std;
#define Maxsize 20
typedef int Datatype;
typedef struct Node
{
Datatype data;
int next;
}sNode;
typedef struct Static_List
{
sNode Slist[Maxsize];
int avail;
}Sqlist;
int InitSList(Sqlist *L) //创建
{
int i;
(*L).Slist[0].next=-1;
(*L).avail=1;
for(i=(*L).avail;i<=Maxsize-2;i++)
{
(*L).Slist[i].next=i+1;
}
(*L).Slist[Maxsize-1].next=-1;
cout<<"静态链表创建成功!";
return 0;
}
int CreatSList(Sqlist *L) //创建尾插法
{
int n,i,tail=0;
cout<<"请输入静态链表的长度:";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"请输入第"<<i<<"个数据:";
cin>>(*L).Slist[(*L).avail].data;//空闲链的进口
(*L).Slist[tail].next=(*L).avail;
tail=(*L).avail;
(*L).avail=(*L).Slist[tail].next;
(*L).Slist[tail].next=-1;
}
return 0;
}
int LengthSList(Sqlist L) //长度
{
int i=0,count=0;
while(-1!=L.Slist[i].next)
{
i=L.Slist[i].next;
count++;
}
return count;
}
int isEmpty(Sqlist L)
{
if(-1!=L.Slist[0].next)
return -1;
return 0;
}
int isFull(Sqlist L)
{
if(Maxsize-1==LengthSList(L))
return 1;
return 0;
}
void PrintSList(Sqlist L)
{
int i=0,k=1;
i=L.Slist[i].next;
while(-1!=L.Slist[i].next)
{
cout<<"第"<<k++<<"个数据是:"<<L.Slist[i].data<<endl;
i=L.Slist[i].next;
}
cout<<"第"<<i<<"个数据是:"<<L.Slist[i].data<<endl;
cout<<"没有数据没有输出!!"<<endl;
}
int InsertSList(Sqlist *L)
{
int n,i=1,q,p=0;
int k=1;
cout<<"请输入要插入数据的位置:";
cin>>n;
if(n<1||n>LengthSList(*L)+1)
return -1;
for(i=1;i<n;i++)
{
p=(*L).Slist[p].next;
}
q=(*L).avail;
cout<<"请输入要插入的数据:";
cin>>(*L).Slist[q].data;
(*L).avail=(*L).Slist[q].next;
(*L).Slist[q].next=(*L).Slist[p].next;
(*L).Slist[p].next=q;
return 0;
}
int ResearchSList(Sqlist L)
{
int n,i,p=0;
cout<<"请输入要查询数据的位置:";
cin>>n;
if(n<1||n>LengthSList(L))
return -1;
else
{
for(i=1;i<=n;i++)
{
p=L.Slist[p].next;
}
cout<<"查询到的数据是:"<<L.Slist[p].data<<endl;
}
return 0;
}
int DeleteSList(Sqlist *L)
{
int i,n,p=0,q;
cout<<"请输入要删除数据的位置:";
cin>>n;
if(n<1||n>LengthSList(*L))
return -1;
for(i=1;i<n;i++)
{
p=(*L).Slist[p].next;} //找到删除位置的上一个位置
q=(*L).Slist[p].next; //找到删除的元素位置
(*L).Slist[p].next=(*L).Slist[q].next;
//将删除元素的上一个元素的next指向删除元素的下一个位置
(*L).Slist[q].next=(*L).avail;
//将删除的元素的空间加入到空闲链表的头部
(*L).avail=q; //空闲链表的起始地址改变为新加入的删除元素的位置
return 0;
}
int main()
{ Sqlist SL;
InitSList(&SL);
CreatSList(&SL);
while(-1==InsertSList(&SL))
{
cout<<"位置非法!请重新输入:";
InsertSList(&SL);
}
if(0==isEmpty(SL))
{
cout<<"当前链表为空!"<<endl;;
}
else
{
cout<<"当前链表不为空!"<<endl;
if(1==isFull(SL))
cout<<"当前链表已满!";
else
cout<<"当前链表长度为:"<<LengthSList(SL)<<endl;
}
if(-1==ResearchSList(SL))
{
cout<<"位置非法!请重新输入:"<<endl;
ResearchSList(SL);
}
if(-1==DeleteSList(&SL))
{
cout<<"位置非法!请重新输入:"<<endl;
DeleteSList(&SL);
}
PrintSList(SL);
int InitSList(Sqlist *L);
int CreatSList(Sqlist *L);
int LengthSList(Sqlist L);
int isEmpty(Sqlist L);
int isFull(Sqlist L);
int InsertSList(Sqlist *L);
int ResearchSList(Sqlist L);
int DeleteSList(Sqlist *L);
void PrintSList(Sqlist L);
return 0;
}
本文介绍了一个使用静态链表实现的学生成绩管理系统。通过尾插法创建链表,并实现了数据的插入、删除、查找等功能。该实验有助于理解线性表的数据结构及其在实际应用中的操作。
1962

被折叠的 条评论
为什么被折叠?



