数据结构 实验报告一 线性表

实验一 线性表

一、实验目的及要求

1. 实验目的
  • 掌握线性表的概念、抽象数据类型和特点,掌握线性表的顺序存储结构或者链式存储结构的存储思想及其程序实现,掌握线性表对应存储结构的基本操作。
  • 掌握单链表中创建、查找、增加、删除、修改等算法实现。
2. 实验要求
  • 熟悉线性表的线性链式储存结构。
  • 上机过程中要遵守实验室的各项规章制度,爱护实验设备,保持环境卫生。
  • 本课程的实验过程中,不得进行游戏、上网等操作。

二、实验环境

  • 硬件要求:计算机一台。
  • 软件要求:Windows操作系统,建议使用C语言,编译环境不限,如Dev-Cpp或VC++6.0等。
  • 数据结构与算法分析,实验实现的语言不限,建议使用C或者C++语言。

三、实验内容

1. 实验方案
  • 根据课本和老师课堂中讲解的内容,将编好的代码上机进行检验,看是否与预期一样。
2. 实验步骤
  • 在书上找到相关算法,在编译器中编辑修改,检验,然后纠错。
3. 设计思路
  • 先定义链表结构,对链表进行初始化,然后完成链表的查找、增加、删除、修改,并将所需函数实现,最后书写主函数中调用函数,检查结果是否正确。

四、实验结果分析

1.使用DevC++编写程序,测试链表查找,增加,删除,修改,遍历功能,效果如图:

数据结构 实验报告一 线性表_第1张图片

2. 实验分析:
  1. 实验遇到的问题:
    • 问题1:第一次写程序插入元素时元素位置为倒序,不知如何正序插入。
      • 问题2:删除链表元素时,出现删除失败的现象。
      • 问题3:定义Linklist p不知如何区分 *p和p的关系。
  2. 问题解决的方法:
    • 对问题1,创建一个新节点 *p,将元素值赋给 *p的数据域,将节点 *p插入到尾节点之后,尾节点 指向新的尾节点 *p之后即可以正序插入元素。
      • 对问题2,插入操作时,可以插入的元素位置有n+1个,而删除时只有n个,因此要避免出现引用空 指针的现象,这样才能正确删除。
      • 对问题3,Linklist p是结构体指针类型,其等价于LNode *p,*p是节点变量,表示节点的名称,p为指 向节点的指针变量,表示节点的地址,进行增,删,改,查,遍历操作时要使用p->next。

五、源程序

#include
#include 
using namespace std;

//定义节点结构体 
typedef struct LNode{
	int data;                         //节点的数据域 
	struct LNode *next;                //节点的指针域 
	
}LNode, *Linklist;                     //Linklist为指向结构体LNode的指针类型 

// 后插法创建单链表 
void Create_Linklist(Linklist &L,int n){
	L=new LNode;
	LNode *p,*r;
	L->next=NULL;
	r=L;
	for(int i=0;i>p->data;
		p->next=NULL;
		r->next=p;
		r=p;
	}
}

//线性表的遍历
void Input_Linklist(Linklist L){
	Linklist tmp;
	tmp = L->next;
	if(tmp==NULL){
		cout<<"NULL\n";
	}
	while(tmp!=NULL){
		cout<data<<" ";
		tmp=tmp->next;
	}
	cout<i-1)){
		p=p->next;
		j++;
	}
	if(!p||j>i){
		cout<<"ERRO!";
		return ;
	}
	LNode *s;
	s=new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
} 

void change_Linklist(Linklist &L,int i,int e){
	Linklist p;
	p = L;
	int j=1;
	while(p&&jnext;
		j++;
	}
	p->next->data=e;
} 

//删除元素 
void Delete_Linklist(Linklist &L,int i){
	LNode *p=L;
	int j=0;
	while(p->next&&j<(i-1)){
		p=p->next;
		j++;
	}
	if(!(p->next)||j>(i-1)){
		cout<<"ERRO!\n";
	}
	LNode *q=p->next;
	p->next=p->next->next;
	delete q;
	return ;
}

//查找线性表L中值为e的元素的位置序号
string Locat_Linklist(Linklist L,int e){
	LNode *p;
	int j=1;
	p=L->next;
	while(p&&p->data!=e){
		j++;
		p=p->next;
	}
	if(p){
		return to_string(j);
	}
	else{
		return "ERROR!";
	}
} 
//查找线性表L中的第i个数据值
int Get_Elem(Linklist L,int i){
	LNode *p;
	int j=1;
	p=L->next;
	while(p&&(jnext;
		j++;
	}
	if(!p||j>i){
		return 0;
	}
	int e=p->data;
	return e;
} 

//清空表
void Clear_Linklist(Linklist &L){
	LNode *p,*q;
	p=L->next;
	while(p){
		q=p->next;
		delete p;
		p=q;
	}
	L->next=NULL;
} 

//  求表长 
int Length_Linklist(Linklist L){
	LNode *p;
	p=L->next;
	int i=0;
	while(p){
		p=p->next;
		i++;
	}
	return i;
}

int main(){
	Linklist p;
	int n;//链表长度
	int locat,data;
	
	cout<<"请输入链表长度:";
	cin>>n; 
	
	Create_Linklist(p,n);                     //创建链表 
	cout<<"线性表为:";
	Input_Linklist(p);                        //遍历链表 
	
	int locat3,data3;
	cout<<"输入修改的位置及元素值:";
	cin>>locat3>>data3;
	change_Linklist(p,locat3,data3);
	Input_Linklist(p);
	
	cout<<"请输入插入的元素位置和值:";
	cin>>locat>>data;
	Insert_Linklist(p,locat,data);            //插入元素 
	cout<<"线性表为:";
	Input_Linklist(p); 
	
	int locat1;
	cout<<"请输入删除元素的位置:";
	cin>>locat1;
	Delete_Linklist(p,locat1);                //删除元素
	cout<<"线性表为:";
	Input_Linklist(p); 
	
	int data1;
	cout<<"请输入需要查找的元素";
	cin>>data1;
	cout<<"元素的位置为:"<>locat2;
	cout<<"元素:"<

你可能感兴趣的:(数据结构,链表,数据结构)