实验二 线性表的综合实验(c++)

本文介绍了一个使用静态链表实现的学生成绩管理系统。通过尾插法创建链表,并实现了数据的插入、删除、查找等功能。该实验有助于理解线性表的数据结构及其在实际应用中的操作。

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




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值