实验二之静态链表

来源:互联网 发布:985 211文件失效 知乎 编辑:程序博客网 时间:2024/05/17 09:09

《数据结构》实验二:

                线性表综合实验

一.实验目的

     巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。

 

二.实验时间

   准备时间为第3周到第4周,具体集中实验时间为第4周第2次课。2个学时。

 

三..实验内容

1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。

要求如下:

1)用顺序表来实现。

2)用单链表来实现。

3)用双链表实现。

4)用静态链表实现。

5)用间接寻址实现。

分开写程序,可以一个方法分别写一博客文章上交作业。

 

2.实现两个集合的相等判定、并、交和差运算。要求:

  1)自定义数据结构

  2)自先存储结构,并设计算法。在VC中实现。

以上三题,第1题必须完成。第2和第3题可以作为选做题。


四.实验报告

1.在博客中先写上实习目的和内容,画出主要操作运算算法图,然后分别上传程序代码。插入调试关键结果截图。

2.单独写一个博文,比较总结线性表的几种主要存储结果。


五、实验心得:

在经过了一番努力之下,终于做到了静态链表了,而且静态链表的表达跟之前的顺序表,单链表和双链表的表达大致上都有着不一样,而且可能是静态链表听得比较认真吧,然后这次做起来比之前的要好一点,虽然有着一些小错,通过调试都基本上能够找出来,只是可能放了国庆这个长假,所以就好多都忘了,就一直在狂翻书,看来以后不可以太长时间不看书了。


源代码:

#include <iostream>

using namespace std;

const int MaxSize=100;

 

struct SNode

{

   int data;

   int next;

   

};//建立静态链表

 

 

class SLList{

public:

SLList();

SLList(int a[],int n);

int Length();

int Get(int i);

int Locate(int x);

void Insert(int i,int x);

int Delete(int i);

void PrintList();

private:

SNode  SList[MaxSize];

    int first,avail;

};

 

 

void SLList::PrintList()

{

int p;

int i=0;

p=SList[first].next;  //使其指向第一个元素

while(p!=-1)

{

i=i+1;

cout<<endl<<""<<i<<"个学生成绩"<<SList[p].data<<" ";

p=SList[p].next;   //指针后移

}

cout<<endl;

}

 

int SLList::Length()   //求长度

{

int p,count=0;

p=SList[first].next;  //使其指向第一个元素

while(p!=-1)

{

p=SList[p].next;   //指针后移

count++;

}

return count;

}

 

int SLList::Get(int i)  //按位查找

{

int p,count=1;

p=SList[first].next;

while(p!=-1&&count<i)

{

p=SList[p].next;

count++;

}

if(p==-1) throw"位置";

else return SList[p].data;

}

 

int SLList::Locate(int x) //按值查找

{

int p,count=1;

p=SList[first].next;

while(p!=-1)

{

if(SList[p].data==x) return count;

p=SList[p].next;

count++;

}

return 0;

}

 

void SLList::Insert(int i,int x)      //插入操作

{

int p,q,count=0;

p=first;

while(SList[p].next!=-1&&count<i-1)

{

p=SList[p].next;

count++;

}

if(SList[p].next==-1) throw"位置";

else

{

q=avail;

avail=SList[avail].next;      //空闲链的头指针后移

SList[q].data=x;             //x填入下标为S的节点

SList[q].next=SList[p].next; //x插到p后面

SList[p].next=q;

}

}

 

int SLList::Delete(int i)       //删除操作

{

int x;

int p,q,count=0;

p=first;

while(SList[p].next!=-1&&count<i-1)

{

p=SList[p].next;

count++;

}

if(SList[p].next==-1) throw"位置";

else

{

q=SList[p].next;  

x=SList[q].data;

SList[p].next=SList[q].next;

SList[q].next=avail;

avail=q;

return x;

}

}

 

SLList::SLList()   //无参构造函数

{

first=0;avail=1;

SList[0].next=-1;   

for(int i=0;i<MaxSize;i++)

{

SList[i].next=i+1;

SList[MaxSize-1].next=-1;

}

}

 

SLList::SLList(int a[],int n)     //有参构造函数

{

int p;

if(n>MaxSize||a<=0)  throw"错误";

SList[0].next=avail;

first=0;avail=1;

for(int i=0;i<MaxSize-1;i++)

{

SList[i].next=i+1;

SList[MaxSize-1].next=-1;

}

for(int j=0;j<n;j++)

{

p=avail;

SList[p].data=a[j];

avail=SList[avail].next;

}

SList[p].next=-1;

}

 

int main()

{

int arr[5]={75,80,85,90,95};

int flag=0,loc,x,tab,len;

  SLList SLL(arr,5);

    

    

while (1)

  {

cout<<"       静态链表的实现          "<<endl;

  cout<<"       1输出学生成绩        "<<endl;

  cout<<"       2输出表长            "<<endl;

cout<<"       3按位查找            "<<endl;

  cout<<"       4按值查找            "<<endl;

  cout<<"       5插入                "<<endl;

  cout<<"       6删除                "<<endl;

  cout<<"       0退出                "<<endl;

 

   cout<<"请输入编号(0-6):";

   cin>>tab;

   switch(tab)

   {

   case 1:

    {

cout<<"1.输出学生成绩 :";

     SLL.PrintList();

cout<<endl;

     break;

    }

   case 2:

    {

cout<<"2.输出表长"<<endl;

      len=SLL.Length();

      cout<<"表的长度为:"<<len<<endl;

cout<<endl;

     break;

    }

   case 3:

    {

cout<<"3.按位查找"<<endl;

     cout<<"输入查找成绩的位置:";

     cin>>loc;

     x=SLL.Get(loc);

cout <<"要查找的成绩是:"<<x<<endl;

cout<<endl;

     break;

    }

   case 4:

    {

cout<<"4.按值查找"<<endl;

cout<<"输入要查找成绩:";

     cin>>x;

     loc=SLL.Locate(x);

      cout<<"输入要查找成绩的位置是:"<<loc<<endl;

cout<<endl;

     break;

    }

   case 5:

    {

cout<<"5.插入"<<endl;

     cout<<"输入要插入成绩的位置:";

     cin>>loc;

     cout<<"输入要插入的成绩:";

     cin>>x;

     SLL.Insert(loc,x);

cout<<endl;

     break;

    }

   case 6:

    {

cout<<"6.删除"<<endl;

     cout<<"输入要删除的成绩位置:";

     cin>>loc;

x=SLL.Delete(loc);

cout<<"成绩"<<x<<"已被删除"<<endl;

     break;

    }

   default:

    {

     cout<<"请输入数字0-6"<<endl;

     break;

    }

   }

  }

return 0;

}


实验结果如图所示:

      

原创粉丝点击