《数据结构》实验三:线性表综合实验

线性表综合实验

一.实验目的

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

二.实验时间

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

三.实验内容

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

要求如下:

1)用顺序表来实现。

#ifndef SeqList_H
#define SeqList_H
const int Maxsize=10;
class SeqList
{
public:
	SeqList(){length=0;}//无参构造函数,创建一个空表
	SeqList(int id[],int n);//有参构造函数
	~SeqList(){}//析构函数
	void Insert(int i,int x);//在第i的位置插入分数x
	int Delete(int i);//删除位置i对应的元素
	int Get(int i);//按位查找,找位置i的元素;
	int Locate (int x);//按值查找,查找表中值为x的元素的序号
	void Print();//按序号依次输出各个元素
private:
	int data[Maxsize];
	int length;
};
#endif

#include<iostream>
using namespace std;
#include "SeqList.h"
SeqList::SeqList(int id[],int n)
{
	if(n>Maxsize) throw"参数非法";
	for(int i=0;i<n;i++)
		data[i]=id[i];
	length=n;
}

void SeqList::Insert(int i,int x)
{
	if(length>Maxsize) throw"上溢";
	if(i<1||i>length+1)throw"位置非法";
	for(int j=length;j>=i;j--)
    data[j]=data[j-1];   //第j个元素存放在数据下标为j-1处
	data[i-1]=x;
	length++;
}

int SeqList::Delete(int i)
{
	 if(length==0)throw"下溢";
	 if(i<1||i>length)throw"位置非法";
	 int x=data[i-1];
	 for(int j=i;j<length;j++)
		 data[j-1]=data[j];			 //此处j已经是元素所在的数组下标
	 length--;
	 return x;
}
int SeqList::Locate(int x)
{
	for(int i=0;i<length;i++)
		if(data[i]==x)
			return i+1;		//下标为i的元素其序号为i+1
		return 0;			//查找失败,退出循环

}

void SeqList::Print()
{
	  for(int i=0;i<length;i++) 
     cout<<data[i] <<" ";
	  cout<<endl;
}

#include<iostream.h>
#include"SeqList.h"

void main()
{
	int a[5]={91,92,93,94,95};
	int x,y;
	SeqList L(a,5);
	cout<<"执行插入操作前的数据为:"<<endl;
	L.Print();//输出所有元素
	try
	{
		int i,m;
		cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
			cin>>i;
		cout<<"请输入准备插入的数据:"<<endl;
		cin>>m;
		L.Insert(i,m);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}

	cout<<"执行插入操作后的数据为:"<<endl;
	L.Print();
	cout<<"请输入需要查找的数据:"<<endl;
	cin>>x;
        
	cout<<L.Locate(x)<<endl;//
	cout<<"请输入需要删除的数据的位置(1~5),删除前数据为:"<<endl;
	cin>>y;
	L.Print();
	try
	{
		L.Delete(y);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}
	cout<<"删除后的数据为:"<<endl;
	L.Print();
}



 

2)用单链表来实现。

#ifndef LinkList_H
#define LinkList_H

template <class L>
struct l
{
	L data;
	l<L> *next;
};

template <class L>
class LinkList
{
public:
	LinkList();
	LinkList(L a[],int n);
	~LinkList();
	int Locate(L x);
	void Insert(int i,L x);
	L Delete(int i);
	void Print();
private:
	l<L> *first;
};

#endif

#include <iostream>
using namespace std;
#include "LLL.h"

template <class L>
LinkList <L>::LinkList()
{
	first=new l<L>;
	first->next=NULL;
}

template <class L>
LinkList<L>::LinkList(L a[],int n)
{
	l <L>*r,*s;
	first=new l<L>;
	r=first;
	for(int i=0;i<n;i++)
	{
		s=new l<L>;
		s->data=a[i];
		r->next=s;r=s;
	}
	r->next=NULL;
}

template <class L>
LinkList<L>::~LinkList()
{
	l<L> *q=NULL;
	while(first!=NULL)
	{
		q=first;
		first=first->next;
		delete q;
	}
}

template <class L>
void LinkList<L>::Insert(int i,L x)
{
	l<L>*p=first,*s=NULL;
	int count=0;
	while(p!=NULL && count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL) throw"位置";
	else
	{
		s=new l<L>;s->data=x;
		s->next=p->next;p->next=s;
	}
}

template <class L>
L LinkList<L>::Delete(int i)
{
	l<L> *p=first,*q=NULL;
	L x;
	int count=0;
	while(p!=NULL && count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL || p->next==NULL)
		throw"位置";
	else
	{
		q=p->next;x=q->data;
		p->next=q->next;
		delete q;
		return x;
	}
}

template <class L>
int LinkList<L>::Locate(L x)
{
	l<L> *p=first->next;
	int count=1;
	while(p!=NULL)
	{
		if (p->data==x) return count;
		p=p->next;
		count++;
	}
	return 0;
}

template <class L>
void LinkList<L>::Print()
{
	l<L> *p=first->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}

#include<iostream>
using namespace std;

#include"LLL.cpp"

void main()
{
	int a[5]={91,92,93,94,95};
	int x,y;
	LinkList <int> Z(a,5);
	cout<<"执行插入操作前的数据为:"<<endl;
	Z.Print();//输出所有元素
	try
	{
		int i,m;
		cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
		cin>>i;
		cout<<"请输入准备插入的数据:"<<endl;
		cin>>m;
		Z.Insert(i,m);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}

	cout<<"执行插入操作后的数据为:"<<endl;
	Z.Print();
	cout<<"请输入需要查找的数据:"<<endl;
	cin>>x;
        cout<<"您查找的数据所在位置为:"<<endl;
	cout<<Z.Locate(x)<<endl;
	cout<<"请输入需要删除的数据的位置(1~5),删除前数据为:"<<endl;
	cin>>y;
	Z.Print();
	try
	{
		Z.Delete(y);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}
	cout<<"删除后的数据为:"<<endl;
	Z.Print();
}



3)用双链表实现。

#ifndef LinkList_H
#define LinkList_H

template <class L>
struct l
{
	L data;
	l<L> *prior,*next;
};

template <class L>
class LinkList
{
public:
	LinkList();
	LinkList(L a[],int n);
	~LinkList();
	int Locate(L x);
	void Insert(int i,L x);
	L Delete(int i);
	void Print();
private:
	l<L> *first;
};

#endif

#include <iostream>
using namespace std;
#include "LLL.h"

template <class L>
LinkList <L>::LinkList()
{
	first=new l<L>;
	first->next=NULL;
	first->prior=NULL;
}

template <class L>
LinkList<L>::LinkList(L a[],int n)
{
	l <L>*r,*s;
	first=new l<L>;
	r=first;
	for(int i=0;i<n;i++)
	{
		s=new l<L>;
		s->data=a[i];
		r->next=s;r=s;
	}
	r->next=NULL;
}

template <class L>
LinkList<L>::~LinkList()
{
	l<L> *q=NULL;
	while(first!=NULL)//释放单链表的每一个结点的存储空间
	{
		q=first; //暂存被释放结点
		first->prior->next=first->next;
		first->next->prior=first->prior;
		first=first->next;//first指向被释放结点的下一结点
		delete q;
	}
	delete first;
}

template <class L>
void LinkList<L>::Insert(int i,L x)
{
	l<L>*p=first,*s=NULL;
	int count=0;
	while(p!=NULL && count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL) throw"位置";
	else
	{
		s=new l<L>;s->data=x;
		s->next=p->next;p->next=s;
	}
}

template <class L>
L LinkList<L>::Delete(int i)
{
	l<L> *p=first,*q=NULL;
	int count=0;
	while(p!=NULL && count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL || p->next==NULL)
		throw"位置";
	else
	{
		L x=p->data;
		(p->prior)->next=p->next;
		(p->next)->prior=p->prior;
		delete q;
		return x;
	}
}

template <class L>
int LinkList<L>::Locate(L x)
{
	l<L> *p=first->next;
	int count=1;
	while(p!=NULL)
	{
		if (p->data==x) return count;
		p=p->next;
		count++;
	}
	return 0;
}

template <class L>
void LinkList<L>::Print()
{
	l<L> *p=first->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}

#include<iostream>
using namespace std;

#include"LLL.cpp"

void main()
{
	int a[5]={91,92,93,94,95};
	int x,y;
	LinkList <int> Z(a,5);
	cout<<"执行插入操作前的数据为:"<<endl;
	Z.Print();//输出所有元素
	try
	{
		int i,m;
		cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
		cin>>i;
		cout<<"请输入准备插入的数据:"<<endl;
		cin>>m;
		Z.Insert(i,m);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}

	cout<<"执行插入操作后的数据为:"<<endl;
	Z.Print();
	cout<<"请输入需要查找的数据:"<<endl;
	cin>>x;
	cout<<"您查找的数据所在位置为:"<<endl;
	cout<<Z.Locate(x)<<endl;//查找元素95,并返回其所在位置
	cout<<"请输入需要删除的数据的位置(1~5),"<<endl;
	cin>>y;
	Z.Print();
	try
	{
		Z.Delete(y);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}
	cout<<"删除后的数据为:"<<endl;
	Z.Print();
}

运行结果:

4)用静态链表实现。

#include<iostream>  
using namespace std; 
const int MaxSize=100;
 
template<class DataType> 
struct SNode 
{ 
    DataType data;  //不确定的数据类型
    int next; //指针域
}; 
  

 template<class DataType> 
 class SLinkList 
 { 
    public:
		SLinkList(); 
		SLinkList(DataType a[],int n); 
        ~SLinkList(){}; 
        void Insert(int i,int x); 
        int Locate(DataType x); 
        DataType Delete(int i); 
        void Print(); 
    private: 
       SNode<DataType>data[MaxSize]; 
        int frist,avail;  
 }; 

 

 template<class DataType> 
 SLinkList<DataType>::SLinkList() 
 { 
    frist=0; 
    avail=0; 
    data[0].next=-1; 
    for(int i;i<MaxSize-1;i++) 
    { 
        data[i].next=i+1; 
    } 

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

 } 
 
 template<class DataType> 
 SLinkList<DataType>::SLinkList(DataType a[],int n) 
 { 
    int s; 
    if(n>=MaxSize||n<=0)throw"位置";  
    frist=0; 
    data[0].next=avail=1;  
    for(int i=0;i<MaxSize-1;i++) 
    { 
        data[i].next=i+1; 
    } 
    data[MaxSize-1].next=-1; 
    for(int j=0;j<n;j++)
    { 
        s=avail; 
        data[s].data=a[j];
       avail=data[avail].next; 
    } 
    data[s].next=-1; 
 } 


template<class DataType> 
void SLinkList<DataType>::Insert(int i,int x) 
{ 
    int s; 
    s=avail; 
    avail=data[avail].next; 
    data[s].data=x; 
    for(int p=0;p<MaxSize-1;p++) 
    { 
        if(p==i) 
        { 
           data[s].next=data[p].next; 
            data[p].next=s; 
        } 
    } 
 }  
    

template<class DataType> 
DataType SLinkList<DataType>::Delete(int i) 
{ 
    if(i>0 &&i<MaxSize) 
    { 
        int q; 
        i=i-1; 
        q=data[i].next; 
       data[i].next=data[q].next; 
        data[q].next=avail; 
        avail=q; 
        return data[q].data; 
  }   
    else 
    { 
        throw"位置"; 
    } 
} 


  template<class DataType> 
  int SLinkList<DataType>::Locate(DataType x) 
  { 
    int count; 
    count=data[frist].next; 
   for(count;count!=-1;count++) 
    {if(data[count].data==x) 
    { 
        return count; 
  } 
    } 
    return 0; 
  }
  

 template<class DataType> 
 void SLinkList<DataType>::Print() 
 {
    int p; 
    p=data[frist].next; 
    while(p!=-1) 
    { 
       cout<<data[p].data<<" "; 
        p=data[p].next; 
    }
  cout<<endl;
 } 
 void main()
{
	int a[5]={91,92,93,94,95};
	int x,y;
	SLinkList <int> Z(a,5);
	cout<<"执行插入操作前的数据为:"<<endl;
	Z.Print();//输出所有元素
	try
	{
		int i,m;
		cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
		cin>>i;
		cout<<"请输入准备插入的数据:"<<endl;
		cin>>m;
		Z.Insert(i,m);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}

	cout<<"执行插入操作后的数据为:"<<endl;
	Z.Print();
	cout<<"请输入需要查找的数据:"<<endl;
	cin>>x;
	cout<<"您查找的数据所在位置为:"<<endl;
	cout<<Z.Locate(x)<<endl;//查找元素95,并返回其所在位置
	cout<<"执行删除操作前的数据为是:"<<endl;
	Z.Print();
	cout<<"请输入需要删除的数据的位置(1~5),"<<endl;
	cin>>y;
	try
	{
		Z.Delete(y);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}
	cout<<"删除后的数据为:"<<endl;
	Z.Print();
}
运行结果:

5)用间接寻址实现。

#include<iostream>
#include<string>
using namespace std;
const int MaxSize=100;
template<class DataType>
struct Node
{
   DataType data;
};

 template<class DataType>
 class IALink
 {
 public:
     IALink(DataType a[],int n);
     ~IALink(){}
     void Insert(int i,int x);
     int Locate(DataType x);
     DataType Delete(int i);
     void Print();
 private:
     Node<DataType>*address[MaxSize];
     int length;
 }; 

 template<class DataType>
 IALink<DataType>::IALink(DataType a[],int n)
 {
     for(int i=0;i<n;i++)
     {
         address[i]=new Node<DataType>;
         address[i]->data=a[i];
     }
     length=n;
 }


template<class DataType>
void IALink<DataType>::Insert(int i,int x)
{
    if(i<=length && i>0)
    {
        for(int j=length;j>=i;j--)
		{
            address[j]=address[j-1];
        }
        address[i-1]->data=x;
        length++;
    }
    else throw"位置";
} 
 
template<class DataType>
DataType IALink<DataType>::Delete(int i)
{
    if(i<=length && i>=0)
    {
        int x=address[i-1]->data;
        for(int j=i;j<length;j++)
        {
            address[j-1]=address[j];
        }
    length--;
    return x;
    }
    else throw"位置";
}

 template<class DataType>
 int IALink<DataType>::Locate(DataType x)
 {
     for(int i=0;i<length;i++)
     {
         if(address[i]->data==x)
             return i+1;
     }
     return 0;
 }

 template<class DataType>
 void IALink<DataType>::Print()
 {
     for(int i=0;i<length;i++)
    cout<<address[i]->data<<" ";
     cout<<endl;
 }

  void main()
{
	int a[5]={91,92,93,94,95};
	int x,y;
	IALink <int> Z(a,5);
	cout<<"执行插入操作前的数据为:"<<endl;
	Z.Print();//输出所有元素
	try
	{
		int i,m;
		cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
		cin>>i;
		cout<<"请输入准备插入的数据:"<<endl;
		cin>>m;
		Z.Insert(i,m);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}

	cout<<"执行插入操作后的数据为:"<<endl;
	Z.Print();
	cout<<"请输入需要查找的数据:"<<endl;
	cin>>x;
	cout<<"您查找的数据所在位置为:"<<endl;
	cout<<Z.Locate(x)<<endl;//查找元素95,并返回其所在位置
	cout<<"执行删除操作前的数据为是:"<<endl;
	Z.Print();
	cout<<"请输入需要删除的数据的位置(1~5),"<<endl;
	cin>>y;
	try
	{
		Z.Delete(y);
	}
	catch(char *r)
	{
		cout<<r<<endl;
	}
	cout<<"删除后的数据为:"<<endl;
	Z.Print();
}
运行结果:

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

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

1)自定义数据结构

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

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

四.实验报告

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

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





猜你喜欢

转载自blog.csdn.net/lum_0813/article/details/80217297