数据结构实验二:线性表的实验


《数据结构》实验二:      线性表实验

一..实验目的

     巩固线性表的数据结构,学会线性表的应用。

1.回顾线性表的逻辑结构,线性表的物理存储结构和常见操作。

2.学习运用线性表的知识来解决实际问题。

3.进一步巩固程序调试方法。

4.进一步巩固模板程序设计。

二.实验时间

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

三..实验内容

1.建立一个N个学生成绩的顺序表,对表进行插入、删除、查找等操作。分别输出结果。

要求如下:

1)用顺序表来实现。

2)用单链表来实现。

2.解决约瑟夫问题

    设有编号为1,2,3,n的n(n>0)个人围在一起,每人持有一个密码m,从第一个人开始报数,报到m时停止报数,报m的人出圈,再从下一个人开始重新报数,报到m时停止报数,报m的人出圈,……直到的所有人出圈为止。当给定n和m后,输出出圈的次序。

要求如下:自定义数据结构,确定存储方法,并设计算法。在主程序中输入n和m后,输出结果。

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

  1)自定义数据结构

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

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


首先是头文件:

  1. #define Seqlist_H  
  2. const int MaxSize=60;  
  3. class Seqlist  
  4. {  
  5. public:  
  6.     Seqlist(){length=0;}  
  7. Seqlist(int a[],int n);  
  8. ~Seqlist(){}  
  9. void Insert(int i,int x);  
  10. int Delete(int i);  
  11. int Locate(int x);  
  12. int Get(int x);  
  13. void PrintList();  
  14. private:  
  15.     int data[MaxSize];  
  16.     int length;  
  17. };  
#define Seqlist_H
const int MaxSize=60;
class Seqlist
{
public:
	Seqlist(){length=0;}
Seqlist(int a[],int n);
~Seqlist(){}
void Insert(int i,int x);
int Delete(int i);
int Locate(int x);
int Get(int x);
void PrintList();
private:
	int data[MaxSize];
	int length;
};
显然说书本上有,,不过哥已经弄通了。。 得意
接着是程序代码-->>

  1. #include<iostream>  
  2. #include<iomanip>  
  3. using namespace std;  
  4. #include "Seqlist.H"  
  5. Seqlist::Seqlist(int a[],int n)  
  6. {  
  7.     if(n>MaxSize)throw"参数非法";  
  8.     for(int i=0;i<n;i++)  
  9.         data[i]=a[i];  
  10.     length=n;  
  11. }  
  12. void Seqlist::Insert(int i,int x)  
  13. {  
  14.     if(length>MaxSize)throw"上溢";  
  15.     if(i<1||i>length+1)throw"未知非法";  
  16.     for(int j=length;j>=i;j--)  
  17.         data[j]=data[j-1];  
  18.     data[i-1]=x;  
  19.     length++;  
  20. }  
  21. int Seqlist::Delete(int i)  
  22. {  
  23.     if(length==0)throw"下溢";  
  24.     if(i<1||i>length)throw"位置非法";  
  25.     int x=data[i-1];  
  26.     for (int j=i;j<length;j++)  
  27.         data[j-1]=data[j];  
  28.     length--;  
  29.     return x;  
  30. }  
  31. int Seqlist ::Locate(int x)  
  32. {  
  33.     for(int i=0;i<length;i++)  
  34.         if(data[i]==x)return i+1;  
  35.     return 0;  
  36. }  
  37. int Seqlist::Get(int x)  
  38. {  
  39.     if(x<1&&x>length)throw"位置非法";  
  40.     else return data[x-1];  
  41. }  
  42. void Seqlist ::PrintList()  
  43. {  
  44.     for(int i=0;i<length;i++)  
  45.         cout<<setw(5)<<data[i]<<"";  
  46.     cout<<endl;  
  47. }  
#include<iostream>
#include<iomanip>
using namespace std;
#include "Seqlist.H"
Seqlist::Seqlist(int a[],int n)
{
	if(n>MaxSize)throw"参数非法";
	for(int i=0;i<n;i++)
		data[i]=a[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];
	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];
	length--;
	return x;
}
int Seqlist ::Locate(int x)
{
	for(int i=0;i<length;i++)
		if(data[i]==x)return i+1;
	return 0;
}
int Seqlist::Get(int x)
{
	if(x<1&&x>length)throw"位置非法";
	else return data[x-1];
}
void Seqlist ::PrintList()
{
	for(int i=0;i<length;i++)
		cout<<setw(5)<<data[i]<<"";
	cout<<endl;
}
主函数-->>

  1. #include<iostream>  
  2. using namespace std;  
  3. #include "Seqlist.H"  
  4. void main()  
  5. {  
  6.     int r[5]={12,23,38,49,57};  
  7.     Seqlist L(r,5);  
  8.     cout<<"执行插入学生成绩前数据为:"<<endl;  
  9.     L.PrintList();  
  10.     try  
  11.     {  
  12.         L.Insert(2,89);  
  13.     }  
  14.     catch (char *s)  
  15.     {  
  16.         cout<<s<<endl;  
  17.     }  
  18.     cout<<"执行插入后学生成绩的数据为:"<<endl;  
  19.     L.PrintList();  
  20.     try  
  21.     {  
  22.         L.Delete(1);  
  23.     }  
  24.     catch (char *s)  
  25.     {  
  26.         cout<<s<<endl;  
  27.     }  
  28.       
  29.     cout<<"成绩为38的元素位置为:";  
  30.     cout<<L.Locate(38)<<endl;  
  31.     cout<<"位置为4的成绩位置为:";  
  32.     cout<<L.Get(4)<<endl;  
  33.     cout<<"删除后成绩为:"<<endl;  
  34.     L.PrintList();  
  35.     system("pause");  
  36. }  
#include<iostream>
using namespace std;
#include "Seqlist.H"
void main()
{
	int r[5]={12,23,38,49,57};
	Seqlist L(r,5);
	cout<<"执行插入学生成绩前数据为:"<<endl;
	L.PrintList();
	try
	{
		L.Insert(2,89);
	}
	catch (char *s)
	{
		cout<<s<<endl;
	}
	cout<<"执行插入后学生成绩的数据为:"<<endl;
	L.PrintList();
	try
	{
		L.Delete(1);
	}
	catch (char *s)
	{
		cout<<s<<endl;
	}
	
	cout<<"成绩为38的元素位置为:";
	cout<<L.Locate(38)<<endl;
	cout<<"位置为4的成绩位置为:";
	cout<<L.Get(4)<<endl;
	cout<<"删除后成绩为:"<<endl;
	L.PrintList();
	system("pause");
}
执行结果=_=


以上是用顺序表,接下来使用单链表-->>

头文件-->>

  1. #ifndef LinkList_H  
  2. #define LinkList_H  
  3. template<class DataType>  
  4. struct Node  
  5. {  
  6.     DataType data;  
  7.     Node<DataType>*next;  
  8. };  
  9. template<class DataType>  
  10. class LinkList  
  11. {  
  12. public:  
  13.     LinkList();  
  14.     LinkList(DataType a[],int n);  
  15.     ~LinkList();  
  16.     int Locate(DataType x);  
  17.     int Get(DataType x);  
  18.     void Insert (int i,DataType x);  
  19.     DataType Delete(int i);  
  20.     void PrintList();  
  21. private:  
  22.     Node<DataType>*first;  
  23. };  
  24. #end  
#ifndef LinkList_H
#define LinkList_H
template<class DataType>
struct Node
{
	DataType data;
	Node<DataType>*next;
};
template<class DataType>
class LinkList
{
public:
	LinkList();
	LinkList(DataType a[],int n);
	~LinkList();
	int Locate(DataType x);
	int Get(DataType x);
	void Insert (int i,DataType x);
	DataType Delete(int i);
	void PrintList();
private:
	Node<DataType>*first;
};
#end
程序文件-->>

  1. #include<iostream>  
  2. #include<iomanip>  
  3. #include"LinkList.H"  
  4. using namespace std;  
  5. template<class DataType>  
  6. LinkList<DataType>::LinkList()  
  7. {  
  8.     first=new Node<DataType>;  
  9.     first->next=NULL;  
  10. }  
  11. template<class DataType>  
  12. LinkList<DataType>::LinkList(DataType a[],int n)  
  13. {  
  14.     Node <DataType>*r,*s;  
  15.     first=new Node<DataType>;  
  16.     r=first;  
  17.     for (int i=0;i<n;i++)  
  18.     {  
  19.         s=new Node<DataType>;  
  20.         s->data=a[i];  
  21.         r->next=s;r=s;  
  22.     }  
  23.     r->next=NULL;  
  24. }  
  25. template<class DataType>  
  26. LinkList<DataType>::~LinkList()  
  27. {  
  28.     Node<DataType>*q=NULL;  
  29.     while(first!=NULL)  
  30.     {  
  31.         q=first;  
  32.         first=first->next;  
  33.         delete q;  
  34.     }  
  35. }  
  36. template<class DataType>  
  37. void LinkList<DataType>::Insert(int i,DataType x)  
  38. {  
  39.     Node<DataType>*p=first,*s=NULL;  
  40.     int count=0;  
  41.     while(p!=NULL&&count<i-1)  
  42.     {  
  43.   
  44.         p=p->next;  
  45.   
  46.         count++;  
  47.     }  
  48.     if(p==NULL)throw"位置";  
  49.     else  
  50.     {  
  51.   
  52.         s=new Node<DataType>;  
  53.   
  54.         s->data=x;  
  55.   
  56.         s->next=p->next;  
  57.   
  58.         p->next=s;  
  59.     }  
  60. }  
  61. template<class DataType>  
  62. DataType LinkList<DataType>::Delete(int i)  
  63. {  
  64.     Node<DataType>*p=first,*q=NULL;  
  65.     DataType x;  
  66.     int count=0;  
  67.     while(p!=NULL&&count<i-1)  
  68.     {  
  69.         p=p->next;  
  70.         count++;  
  71.     }  
  72.     if(p==NULL||p->next==NULL)  
  73.         throw"位置";  
  74.     else  
  75.     {  
  76.         q=p->next;  
  77.         x=q->data;  
  78.         p->next=q->next;  
  79.         delete q;  
  80.         return x;  
  81.     }  
  82. }  
  83. template<class DataType>  
  84. int LinkList<DataType>::Locate(DataType x)  
  85. {  
  86.     Node<DataType>*p=first->next;  
  87.     int count=1;  
  88.     while(p!=NULL)  
  89.     {  
  90.         if(p->data==x)return count;  
  91.         p=p->next;  
  92.         count++;  
  93.     }  
  94.     return 0;  
  95. }  
  96. template<class DataType>  
  97. int LinkList<DataType>::Get(DataType x)  
  98. {  
  99.     Node<DataType>*p=first->next;  
  100.     p=first->next; int count=1;  
  101.     while(p!=NULL&&count<1)  
  102.     {  
  103.         p=p->next;  
  104.         count++;  
  105.     }  
  106.     if(p==NULL)throw"位置";  
  107.     else return p->data;  
  108. }  
  109. template<class DataType>  
  110. void LinkList<DataType>::PrintList()  
  111. {  
  112.     Node<DataType>*p=first->next;  
  113.     while(p!=NULL)  
  114.     {  
  115.         cout<<setw(5)<<p->data<<" ";  
  116.         p=p->next;  
  117.     }  
  118.     cout<<endl;  
  119. }  
#include<iostream>
#include<iomanip>
#include"LinkList.H"
using namespace std;
template<class DataType>
LinkList<DataType>::LinkList()
{
	first=new Node<DataType>;
	first->next=NULL;
}
template<class DataType>
LinkList<DataType>::LinkList(DataType a[],int n)
{
	Node <DataType>*r,*s;
	first=new Node<DataType>;
	r=first;
	for (int i=0;i<n;i++)
	{
		s=new Node<DataType>;
		s->data=a[i];
		r->next=s;r=s;
	}
	r->next=NULL;
}
template<class DataType>
LinkList<DataType>::~LinkList()
{
	Node<DataType>*q=NULL;
	while(first!=NULL)
	{
		q=first;
		first=first->next;
		delete q;
	}
}
template<class DataType>
void LinkList<DataType>::Insert(int i,DataType x)
{
	Node<DataType>*p=first,*s=NULL;
	int count=0;
	while(p!=NULL&&count<i-1)
	{

		p=p->next;

		count++;
	}
	if(p==NULL)throw"位置";
	else
	{

		s=new Node<DataType>;

		s->data=x;

		s->next=p->next;

		p->next=s;
	}
}
template<class DataType>
DataType LinkList<DataType>::Delete(int i)
{
	Node<DataType>*p=first,*q=NULL;
	DataType 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 DataType>
int LinkList<DataType>::Locate(DataType x)
{
	Node<DataType>*p=first->next;
	int count=1;
	while(p!=NULL)
	{
		if(p->data==x)return count;
		p=p->next;
		count++;
	}
	return 0;
}
template<class DataType>
int LinkList<DataType>::Get(DataType x)
{
	Node<DataType>*p=first->next;
	p=first->next; int count=1;
	while(p!=NULL&&count<1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL)throw"位置";
	else return p->data;
}
template<class DataType>
void LinkList<DataType>::PrintList()
{
	Node<DataType>*p=first->next;
	while(p!=NULL)
	{
		cout<<setw(5)<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
主函数——>>

  1. #include<iostream>  
  2. #include"LinkList.cpp"  
  3. #include"LinkList.H"  
  4. using namespace std;  
  5. void main()  
  6. {  
  7.     int r[5]={75,83,74,92,58};  
  8.     LinkList<int>L(r,5);  
  9.     cout<<"执行插入成绩操作前数据为:"<<endl;  
  10.     L.PrintList();  
  11.     try  
  12.     {  
  13.         L.Insert(2,70);  
  14.     }  
  15.     catch(char *s)  
  16.     {  
  17.         cout<<s<<endl;  
  18.     }  
  19.     cout<<"执行插入成绩操作后数据为:"<<endl;  
  20.     L.PrintList();  
  21.     try  
  22.     {  
  23.         L.Delete(3);  
  24.     }  
  25.     catch(char *s)  
  26.     {  
  27.         cout<<s<<endl;  
  28.     }  
  29.   
  30.     cout<<"输出位置为3的元素为:"<<endl;  
  31.   
  32.     cout<<L.Get(3)<<endl;  
  33.     cout<<"输出值为74的位置为:"<<endl;  
  34.     cout<<L.Locate(74)<<endl;  
  35.       
  36.     cout<<"执行删除操作成绩后数据为:"<<endl;  
  37.     L.PrintList();  
  38.     system("pause");  
  39. }  
#include<iostream>
#include"LinkList.cpp"
#include"LinkList.H"
using namespace std;
void main()
{
	int r[5]={75,83,74,92,58};
	LinkList<int>L(r,5);
	cout<<"执行插入成绩操作前数据为:"<<endl;
	L.PrintList();
	try
	{
		L.Insert(2,70);
	}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	cout<<"执行插入成绩操作后数据为:"<<endl;
	L.PrintList();
	try
	{
		L.Delete(3);
	}
	catch(char *s)
	{
		cout<<s<<endl;
	}

	cout<<"输出位置为3的元素为:"<<endl;

	cout<<L.Get(3)<<endl;
	cout<<"输出值为74的位置为:"<<endl;
	cout<<L.Locate(74)<<endl;
	
	cout<<"执行删除操作成绩后数据为:"<<endl;
	L.PrintList();
	system("pause");
}
以上是用单链表实现=_=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值