实验二.1

一..实验目的

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

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

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

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

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

二.实验时间

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

三..实验内容

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

要求如下:

1)用顺序表来实现。

#ifndef Seq_stu_H
#define Seq_stu_H     //头文件
const int MaxSize=10;

class Seq_stu
{
public:
	Seq_stu(){length=0;}
	Seq_stu(int a[],int n);
	~Seq_stu(){}
	void Insert(int i,int x);
	int Delete(int i);
	int Locate(int i);
	void PrintList();

private:
	int score[MaxSize];
	int length;
	
};

#endif
//源文件
#include<iostream>
using namespace std;
#include "实验二头文件.h"


Seq_stu::Seq_stu(int a[],int n)
{
	if(n>MaxSize) throw "参数非法";
	for (int i=0;i<n;i++)
		score[i]=a[i];
	length=n;
}
void Seq_stu::Insert(int i,int x)
{
	if(length>=MaxSize) throw "上溢";
	if(i<1||i>length+1) throw "位置非法";
	for(int j=length;j>=i;j--)
		score[j]=score[j-1];
	score[i-1]=x;
	length++;
}
int Seq_stu::Delete(int i)
{
	if(length==0) throw "下溢";
	if(i<i||i>length) throw "位置非法";
	int x=score[i-1];
	for(int j=i;j<length;j++)
		score[j-1]=score[j];
	length--;
	return x;
}
int Seq_stu::Locate(int x)
{
	for(int i=0;i<length;i++)
		if(score[i]==x)return i+1;
	return 0;
}
void Seq_stu::PrintList()
{
	for(int i=0;i<length;i++)
		cout<<score[i]<<" ";
	cout<<endl;
}
//主函数
#include<iostream>
#include<iomanip>
using namespace std;
#include "实验二头文件.h"


void main()
{
	int m[5]={76,79,90,89,95};
	Seq_stu L(m,5);
	cout<<"插入前成绩为:"<<endl;
	L.PrintList();
	try
	{
		L.Insert(2,65);

	}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	cout<<"插入后成绩为:"<<endl;
	L.PrintList();
	cout<<"79元素位置为:";
	cout<<L.Locate(79)<<endl;
	cout<<"删除第一个元素前成绩为:"<<endl;
	L.PrintList();

	try
	{
		L.Delete(1);

	}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	cout<<"删除后成绩为:"<<endl;
	L.PrintList();
}


2)用单链表来实现。

#ifndef Seq_stu_H
#define Seq_stu_H     //头文件
template<class T>  
struct Node     
{   
    T data;
	Node<T>* next;  
};    
  
   
template<class T>   
class Link_stu   
{  
public:    
    Link_stu (); 
	Link_stu(T a[],int n);    
    ~Link_stu(); 
	void Insert (int i,T x);    
	int Locate(T x) ;  
	T Delete(int i);    
	void PrintList();    
private:
	Node<T>* first;
  
};    
#endif
//源文件
#include<iostream>
using namespace std;
#include "实验二头文件.h"


template<class T>  
Link_stu<T>::Link_stu()  
{   
	first = new Node<T>;
	first->next=NULL;
}   

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

template<class T>
Link_stu<T>::~Link_stu()
{
Node<T> *q = NULL;
while(first != NULL)
{
q = first;
first= first->next;
delete q;
}
}
template<class T>
void Link_stu<T>::Insert(int i,T x)
{
Node<T> *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<T>;
s->data =x;
s->next=p->next;
p->next= s;
}
}

template<class T>
T Link_stu<T>::Delete(int i)
{
Node<T> *p =first,*q=NULL;
T 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;
return x;
}
}

template<class T>
int Link_stu<T>::Locate(T x)
{
Node<T>*p =first->next;
int count =1;
while(p!=NULL)
{
if(p->data==x) return count;
p=p->next;
count++;

}
return 0;
}

template<class T>
void Link_stu<T>::PrintList()
{
Node<T>*p =first-> next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//主函数
#include<iostream>
#include<iomanip>
using namespace std;
#include "实验二源文件.cpp"


void main(){
	int r[5] = {76, 79, 90, 89, 95};
	Link_stu<int> L(r, 5);
	cout << "插入前成绩为:" << endl;
	L.PrintList();
	try
	{
		L.Insert(2, 65);
	}
	catch (char *s)
	{
		cout << s << endl;
	}
	cout << "插入后成绩为:" << endl;
	L.PrintList();
	cout << "79元素的位置为:";
	cout << L.Locate(79) << endl;
	cout << "删除第一个元素前成绩为:" << endl;
	L.PrintList();
	try
	{
		L.Delete(1);
	}
	catch (char *s)
	{
		cout << s << endl;
	}
	cout << "删除后成绩为:" << endl;
	L.PrintList();

}


四、总结:

        做这一个实验,首先要弄懂这个实验要做什么,再次弄懂所学的顺序表和单链表。对于这个实验,如果不是按照课本实例来做,就会出现很多错误,有好几个错误怎么改都改不过来,所以只能按照课本的实例来做。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值