线性表的链接存储
一、 实验目的
1. 掌握线性表的链接存储结构。
2. 能熟练地利用链接存储结构实现线性表的基本操作。 3. 能熟练地掌握链接存储结构中算法的实现。 二、 实验内容
1. 建立含有若干个元素的单链表,并将结果在屏幕上输出。
2. 对刚建立的单链表实现插入、删除、修改、查找,并将结果在屏幕上输出。
3. 解决约瑟夫问题:假设有n个人按1、2、3、…、n的顺序围成一圈,现在,从第
s个人开始按1、2、3、…、m的顺序报数,数到m的人出圈,接着从出圈的下一个人开始重复此过程,直到所有人出圈为止。试用链表解决这个问题。 三、 算法描述
1. 第1题、第2题的算法提示
定义单链表的结点结构,定义单链表的数据类型——单链表类,包括题目要求的插入、删除、查找等基本操作,为了便于查看操作结果,设计一个输出函数依次输出单链表的元素,以便后面反复使用。 此外,为操作方便,将插入、删除、修改、查找等操作都定义成单独的子函数形式。为查看这些操作的效果,可以在调用前后分别输出表的结果。 2. 第3题的算法提示
约瑟夫环问题的本身具有循环性质,考虑用循环链表。将循环链表的节点定义为结构体类型,建立约瑟夫环,建立一个循环链表并由头指针指示,其余具体算法与建立单链表类似。接着设计约瑟夫环算法实现出圈。 四、源程序及程序清单
第1、2题的源程序及其清单
#include
struct Node{ };
class Link{ public:
Link(); //无参构造函数,建立只有头结点的空链表
Link(int a[], int n); //有参构造函数,建立有n个结点的单链表 ~Link(); //析构函数
int Length(); //求单链表的长度 int data; //结点的数据域 Node *next; //结点的指针域
int Get(int i); //按位查找 int Locate( int x); //按值查找 void Insert(int i,int x); //插入操作 int Delete(int i); //删除操作 void Print(); //遍历操作
private:
Node *first; //单链表的头指针 };
Link::Link(){ }
Link::Link(int a[], int n){ }
Link::~Link(){
while(first!=NULL){
Node *p=first; first=first->next; first=new Node; first->next=NULL; for(int i=0;i Node *s; s=new Node; s->data=a[i]; s->next=first->next; first->next=s; first=new Node; first->next=NULL; } } delete p; int Link::Length(){ } int Link::Get(int i){ } int Link::Locate(int x){ Node *p=first->next; int count=1; while(p!=NULL&&count if(p==NULL) cout<<\参数非法\else cout<<\该位置的元素值为:\return 0; p=p->next; count++; Node *p=first->next; int count=0; while(p!=NULL){ } cout<<\链表的长度为:\ p=p->next; count++; return 0; } Node *p=first->next; int count=1; while(p!=NULL){ } return 0; if(p->data==x) cout<<\该元素的位置为:\p=p->next; count++; void Link::Insert(int i,int x){ } int Link::Delete(int i){ Node *p=first; int count=0; while(p!=NULL&&count if(p==NULL) cout<<\位置非法\else{ } Node *s; s=new Node; s->data=x; s->next=p->next; p->next=s; p=p->next; count++;