《数据结构》实验二: 线性表实验--------------第一题

前端之家收集整理的这篇文章主要介绍了《数据结构》实验二: 线性表实验--------------第一题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

要求如下:

1)用顺序表来实现。

2)用单链表来实现。


1)顺序表

N-S图(只是部分操作的N-S图):


//linklist.h

#ifndef LINK_LIST_H
#define LINK_LIST_H
#include <iostream>
using namespace std;
const int MaxSize=20;
template <class T>
class SeqList
{
public:
	SeqList(){length=0;}
	SeqList(T a[],int n);
	int Length(){return length;}
	T Get(int i);
	int Locate(T x);
	void Insert(T x,int i);
	T Delete(int i);
	void Print();
private:
	T data[MaxSize];
	int length;
};
#endif

//linklist.cpp

#include "linklist.h"
template <class T>
void SeqList<T>::Print()
{
	for(int i=0;i<length;i++)
		cout<<data[i]<<" ";
	cout<<endl;
}
template <class T>
SeqList<T>::SeqList(T a[],int n)
{
	if(n>MaxSize) throw "参数非法";
	for(int i=0;i<n;i++)
		data[i]=a[i];
	length=n;
}
template <class T>
T SeqList<T>::Get(int i)
{
	if(i<1||i>length) throw "位置";
    else return data[i-1];
}
template <class T>
int SeqList<T>::Locate(T x)
{
	for(int i=0;i<length;i++)
	    if(data[i]==x) return i+1;
    return 0;
}
template <class T>
void SeqList<T>::Insert(T x,int i)
{
	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++;
}
template <class T>
T SeqList<T>::Delete(int i)
{
	int x=data[i-1];
	if(length==0) throw "下溢";
	if(i<1||i>length) throw "位置";
	for(int j=i;j<length;j++)
		data[j-1]=data[j];
	length--;
	return x;
}

//main.cpp

#include "linklist.cpp"
void main()
{
	int m,grade;
	float a[10]={96,95,94,97,98,79,68,88,99,89};
	SeqList<float> seqlist(a,10);
	cout<<"学生成绩表如下:\n";
    seqlist.Print();
	cout<<"总共有"<<seqlist.Length()<<"个学生\n";
	try
	{
    	cout<<"你想获取第几个学生的成绩?\n请输入数字1到10:";
    	cin>>m;
    	cout<<seqlist.Get(m)<<endl;
	}
	catch(char*)
	{
		cout<<"获取有误!"<<endl;
	}
   	cout<<"你想查询怎样的成绩在成绩表中的序号?(输出0表示该成绩不存在)\n请输入具体的成绩:";
   	cin>>m;
	cout<<seqlist.Locate(m)<<endl;
	try
	{
    	cout<<"你想在成绩表中序号为几的位置上插入怎样的成绩?\n分别输入序号和成绩:";
    	cin>>m>>grade;
    	seqlist.Insert(grade,m);
    	cout<<"插入后的成绩表如下:\n";
        seqlist.Print();
     	cout<<"此时成绩表中学生个数为:"<<seqlist.Length()<<endl;
	}
	catch(char*)
	{
		cout<<"插入有误!"<<endl;
	}
	try
	{
    	cout<<"你想删除成绩表中第几个学生的成绩\n请输入序号(1到11):";
        cin>>m;
    	seqlist.Delete(m);
    	cout<<"删除后的成绩表如下\n";
     	seqlist.Print();
     	cout<<"此时成绩表中学生个数为:"<<seqlist.Length()<<endl;
	}
	catch(char*)
	{
		cout<<"删除有误!"<<endl;
	}
}

程序结果:

2)单链表

N-S图(只是部分操作的N-S图):

程序代码

//1004.cpp

#include "LinkList.cpp"	
void main()
{
	int grade[]={92,91,93,97};
	LinkList<int> linklist(grade,7);
	cout<<"每个学生的成绩分别为:";
	linklist.Print();
	cout<<"学生个数:"<<linklist.length()<<"个"<<endl;	
    cout<<"成绩表中94分位于第"<<linklist.Locate(94)<<"个位置上"<<endl;
	try
	{
		cout<<"成绩表中第三个分数为:";
		cout<<linklist.Get(3)<<endl;
	    cout<<"在成绩表中的第三个位置插入成绩92"<<endl;
	    cout<<"插入前:";
        linklist.Print();
	    cout<<"插入后:";
        linklist.Insert(3,92);
		linklist.Print();
		cout<<"把第五个成绩删除"<<endl;
        cout<<"删除前:";
	    linklist.Print();
	    cout<<"删除的成绩为:"<<linklist.Delete(5)<<endl;
		cout<<"删除后:";
	    linklist.Print();
	}
	catch(double)
	{
		cout<<"获取的位置不存在!"<<endl;
		exit(1);
	}
	catch(char*)
	{
		cout<<"删除的位置不存在!"<<endl;
		exit(1);
	}
	catch(int)
	{
		cout<<"插入位置不存在!"<<endl;
		exit(1);
	}
}

//LinkList.cpp

#include "LinkList.h"
#include<stdlib.h>
template <class T>
LinkList<T>::LinkList()
{
	first=new Node<T>;
	first->next=NULL;
}
template <class T>
LinkList<T>::LinkList(T a[],int n)
{
	first=new Node<T>;
	Node<T>*r,*s;
	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>
LinkList<T>::~LinkList()
{
	while(first!=NULL)
	{
		Node<T>*q;
		q=first;
		first=first->next;
		delete q;
	}
}
template <class T>
int LinkList<T>::length()
{
	Node<T>*p;
	p=first->next;
	int count=0;
	while(p!=NULL)
	{
		p=p->next;
		count++;
	}
	return count;
}
template <class T>
T LinkList<T>::Get(int i)
{
	Node<T>*p=first->next;
	int count=1;
	while(p!=NULL&&count<i)
	{
		p=p->next;
		count++;
	}
	if(p==NULL) throw 1.2;
	return p->data;
}
template <class T>
int LinkList<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 LinkList<T>::Insert(int i,T x)
{
	int count=0;
	Node<T>*p=first;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL) throw 1;
	else
	{
    	Node<T>*s=new Node<T>;
    	s->data=x;
    	s->next=p->next;
     	p->next=s;
	}
}

template<class T>
T LinkList<T>::Delete(int i)
{
	T x;
	Node<T>*p=first,*q;
	int count=0;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL||p->next==NULL) throw "位置";
	q=p->next;
	x=q->data;
	p->next=q->next;
	delete q;
	return x;
}
template <class T>
void LinkList<T>::Print()
{
	Node<T>*p=first->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
//LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H
#include <iostream>
using namespace std;
template <class T>
class Node
{
public:
	T data;
	Node<T>*next;
};
template <class T>
class LinkList
{
public:
	LinkList();
	LinkList(T a[],int n);
	~LinkList();
	int length();
	T Get(int i);
	int Locate(T x);
	void Insert(int i,T x);
	T Delete(int i);
	void Print();
private:
	Node<T>*first;
};
#endif

程序结果:

猜你在找的数据结构相关文章