数据结构线性表试验报告

时间:2026.4.7

线性表上机实习

1、实验目的

(1)熟悉将算法转换为程序代码的过程。

(2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。

(3)熟练掌握顺序表的基本运算:查找、插入、删除等,掌握顺序表的随机存取特性。

(4)了解线性表的链式存储结构,熟练掌握线性表的链式存储结构的C语言描述方法。

(5)熟练掌握线性链表(单链表)的基本运算:查找、插入、删除等,能在实际应用中灵活选择适当的链表结构。

2、实验要求

(1)熟悉顺序表的插入、删除和查找。

(2)熟悉单链表的插入、删除和查找。

3、实验内容:

① 顺序表

   (1)抽象数据类型定义

     typedef struct {

           TypeData data[maxsize];                   //容量为maxsize的静态顺手表

           int n;                                  //顺序表中的实际元素个数

        }SeqList;                              //静态顺序表的定义

   在本次实验中,首先建立一个空的静态顺序表,然后键盘输入数据存入表中,然后进入菜单选择界面,通过不同的数字输入,实现对顺序表,删除,插入,查找,显示等操作。

 (2)存储结构定义及算法思想

      在顺序表结构体的定义中,typedef  int TypeData 为整型,存储结构如下:

    for(n=0;n<m;n++){

      cout<<"请输入线性表数据"<<endl;

      cin>>L.data[n];                //顺序将数据存入顺序表

  }                               //其他存储与此类似,都是直接赋值与数组的某一位

插入版块子函数:

void insert(SeqList &L)                          //插入数据

{

  int a,b,c,k;

  cout<<"请输入插入的数及其插入的位置"<<endl;

  cin>>a>>b;

  if(b<=0||b>(L.n+1))  {cout<<"不能在该位置插入"<<endl; return;} //判断插入位置是否合法

  k=L.data[b-1];L.data[b-1]=a; c=L.n; L.n=L.n+1;     

  while(c>b){

    L.data[c]=L.data[c-1];c--;      //通过循环,实现插入位置后的数据挨个往后移动一位

         }

  L.data[b]=k;

}

顺序表的插入与删除操作类似,在插入与删除后,都要循环调整后面数组的每一位元素,同时记录数据元素的长度的标示符也要跟着改变。 显示操作是通过循环实现表中第一个元素到最后一个元素的输出,查找操作是直接取数组中的查找位输出。

(3)实验结果与分析

 


 

② 单链表  

(1)抽象数据类型定义

typedef struct node{

DataType data;           //链表的数据类型

struct node *link;         //链表的结点指针

}linknode,*linklist;        //定义了结构体linklode和结构体指针linklist

      在本次实验中,首先程序自己建立一个空的头结点,通过菜单的功能选择“添加链表数据”可自由添加链表的节点数及元素值。在菜单选择中,有“添加链数据”,“插入链表数据”,“删除链表数据”,“查找链表数据”和“显示链表数据”功能,选择不能的功能选择就能实现不同的操作。其中“添加链表数据”可反复批量输入链表数据。

(2)存储结构定义及算法思想

     在单链表中,typedef int DataType;DataType data;定义链表存储数据位整型。存储结构如下:

while(p->link!=NULL){

p=p->link;   k++;                 //首先找到单链表的最后结点(如果是只有头结点

   }                             的单链表则直接跳过),以便后面接着输入数据                     

  for(int i=0;i<a;i++)

  {

       cout<<"请输入数据"<<endl;

       q=(linklist)malloc(sizeof(linknode));    //开辟新的结点空间并转化为linklist指针型

    cin>>q->data;

    q->link=p->link;         //将前面一个结点的指向(及NULL)赋给新开辟的结点的指向

       p->link=q;              //将插入点前面一个结点指向新开辟的的结点

       p=q;         //将指明的最后一个一个结点向后移1位到最后一位,以便后面接着输入

  }

删除结点子函数:

 void delate(linklist &l){                                //删除单链表数据

   linklist p; int m,n,i=0;

   cout<<"请输入想要删除的结点位置"<<endl;

   cin>>m;

   p=l;                                               //将头结点赋给转移指针p

    while(p&&i<m-1) {            //查找删除结点的位置

    p=p->link;             //当在单链表中间已查到删除结点或p=NULL时跳出循环

       i++;

  }

       if(p==NULL) {            //当p=NULL跳出循环时,表明链表中没有该结点

   cout<<"该结点不存在,删除错误"<<endl;  return;

  }

  n=p->link->data;  //找到删除接结点将数据取出并显示出来(找结点时是找的前一个结点)

  cout<<"被删除的结点元素为: "<<n<<endl;

   p->link=p->link->link;         //将删除结点的前后结点链接起来

 }

   链表的删除,插入操作是类似的,要考虑到加入或减少一个结点后,前后结点的链接关系,以及删除或插入的是最后一个结点时,新空间的开辟与结点收尾等问题。其中删除功能的一部分就是查找功能,显示功能也是从链表的头结点遍历至最后一个,依次输出。

(4)实验结果与分析

③ 心得体会

   

本次数据结构实习我收获颇丰,以前学过c语言与c++也有经常上机,但以往都是偏向于程序整体的算法设计,没有像这次的实习这样是着重在线性表,链表结构的算法设计上面。这次上机实习,让我更加熟练了结构体及结构体指针的用法,线性表的设计等等,同时在这次实习中,引用,指针,地址这三个的用法曾一度让我混淆,在查阅书籍后才得以解决,也希望老师在课堂上有时间时给我们详细讲解一下,指针,地址,引用三者的使用。

附录:

顺序表源代码:

#include<iostream>

using namespace std;

#define maxsize 50

typedef  int TypeData;

typedef struct {

TypeData data[maxsize];

int n;

}SeqList;

void makeSeq( SeqList &L)                          // 输入线性表数据

{

  int m,n,k;

  cout<<"请输入线性表长度"<<endl;

  cin>>m;

  for(n=0;n<m;n++)

  {

   cout<<"请输入线性表数据"<<endl;

   cin>>L.data[n];

  }

  L.n=m;

  cout<<"您输入的线性表为:"<<endl;

  for(k=0;k<m;k++)

  {

    cout<<L.data[k]<<"  ";

  }

  cout<<endl;

}

void showSeq(SeqList L)                           //输出线性表数据

{

  int a=0;

  while(a<L.n)

  {

   cout<<L.data[a]<<" ";

   a++;

  }

  cout<<endl;

}

void insert(SeqList &L)                          //插入数据

{

  int a,b,c,k;

  cout<<"请输入插入的数及其插入的位置"<<endl;

  cin>>a>>b;

  if(b<=0||b>(L.n+1))  {cout<<"不能在该位置插入"<<endl; return;}

  k=L.data[b-1];L.data[b-1]=a; c=L.n; L.n=L.n+1;

  while(c>b)

  {

    L.data[c]=L.data[c-1];

c--;

  }

  L.data[b]=k;

}

void delate(SeqList &L)                     //删除数据

{

 int wei;

 cout<<"请输入想要删除数据的位置"<<endl;

 cin>>wei;

 if(wei<1||wei>L.n) { cout<<"不能在该位置删除"<<endl;return; }

 while(wei<L.n)

 {

 L.data[wei-1]=L.data[wei];

 wei++;

 }

 L.n=L.n-1;

}

void find(SeqList L)                          //查找数据

{

int a;

  cout<<"请输入您想查找数的位置"<<endl;

  cin>>a;

  if(a<=0||a>(L.n))  {cout<<"不能在该位置插入"<<endl; return;}

  cout<<"该位置的数据为:"<<" "<<L.data[a-1]<<endl;

}

void main()

{

   SeqList L;

   int xuanze;

   makeSeq(L);

   while(1)

   {

 cout<<"请选择功能"<<endl;

 cout<<"插入  1"<<endl;

 cout<<"删除  2"<<endl;

 cout<<"查找  3"<<endl;

 cout<<"显示  4"<<endl;

 cout<<endl<<"请输入"<<endl; 

 cin>>xuanze;

     switch(xuanze)

 {

 case 1:  insert(L);break;

 case 2:  delate(L);break;

 case 3:  find(L);break;

 case 4:  showSeq(L);break;

 default :break;

 }

   }

}

单链表源代码:

#include<iostream>

using namespace std;

typedef int DataType;

typedef struct node{

DataType data;

struct node *link;

}linknode,*linklist;

linklist chushihua()

{

         linklist L;

         L=(linklist )malloc(sizeof(linknode));

         L->link=NULL;

     cout<<"开辟空间成功,头结点建立"<<endl;

     return L;

}

void shuru(linklist &l)

{

  int a,k=0;

  cout<<"请输入要存入的结点个数"<<endl;

  cin>>a;

  linklist p,q;

  p=l;

   while(p->link!=NULL)

  {

    p=p->link;

k++;

  }

  for(int i=0;i<a;i++)

  {

cout<<"请输入数据"<<endl;

q=(linklist)malloc(sizeof(linknode));

    cin>>q->data;

    q->link=p->link;

p->link=q;

p=q;

  }

}

void show(linklist l)

{

cout<<"链表数据为:"<<endl;

    linklist p;

    p=l->link;

   while(p!=NULL)

   {

     cout<<p->data<<" ";

 p=p->link;

   }

   cout<<endl;

}

 void find(linklist l)

{

  int m,i=0;

  cout<<"请输入查找的结点"<<endl;

  cin>>m;

  linklist p;

  p=l->link;

  while(p&&i<m-1)

  {

    p=p->link;

i++;

  }

  if(!p) { cout<<"链表没有这么长,查找错误"<<endl;return;}

 cout<<"查找结点的数据位: "<<p->data<<endl;

}

 void insert(linklist l)

 {

   linklist p,q; int m,n,i=0;

  

   cout<<"请输入您要插入的结点位置及插入的数据"<<endl;

   cin>>m>>n;

   p=l;

  while(p&&i<m-1)

  {

    p=p->link;

i++;

  }

  if(p==NULL)

  {

   cout<<"不能在该位置插入,插入错误"<<endl;return;

  }

     

   q=(linklist)malloc(sizeof(linknode));

   q->data=n; 

   q->link=p->link;p->link=q;

 }

 void delate(linklist &l)

 {

   linklist p; int m,n,i=0;

   cout<<"请输入想要删除的结点位置"<<endl;

   cin>>m;

   p=l;

    while(p&&i<m-1)

  {

    p=p->link;

i++;

  }

if(p==NULL)

  {

   cout<<"该结点不存在,删除错误"<<endl;return;

  }

  n=p->link->data;

  cout<<"被删除的结点元素为: "<<n<<endl;

   p->link=p->link->link;

 }

void main()

{

  linklist L; int select;

  L=chushihua();

  while(1)

  {

     cout<<"请选择功能"<<endl;

 cout<<"添加链表数据 1"<<endl;

     cout<<"插入链表数据 2"<<endl;

 cout<<"删除链表数据 3"<<endl;

 cout<<"查找链表数据 4"<<endl;

 cout<<"显示链表数据 5"<<endl;

 cout<<endl<<"请输入"<<endl; 

 cin>>select;

     switch(select)

 {

 case 1:  shuru(L);break;

 case 2:  insert(L);break;

 case 3:  delate(L);break;

 case 4:  find(L);break;

     case 5:  show(L);break;

 default :break;

 }

  }

}

更多相关推荐:
数据结构 线性表操作实验报告

数据结构实验报告实验题目线性表的操作实验目的1掌握上机调试线性表的基本方法2掌握线性表的一些基本操作实验内容将两个有序链表合并为一个有序链表一需求分析1实验程序中先创建两个有序链表演示程序以用户和计算机的对话方...

数据结构线性表实验报告

《数据结构》实验报告院系应用科技学院专业电子信息工程姓名##学号10级电信班20##年10月11日1.实验目的1.掌握线性表的基本运算。2.掌握顺序村存储的概念,学会对顺序存储数据结构进行操作。3.加深对顺序存…

数据结构--实验报告 线性表的基本操作

一、实验目的二、实验内容和要求三、源代码1)顺序表的代码2)单链表的代码四、测试结果1)顺序表的测试结果2)单链表的测试结果五、心得体会实验一线性表的基本操作及其应用一、实验目的1、帮助读者复习C++语言程序设…

数据结构实验报告 线性表的顺序表示和实现

数学与计算科学学院实验报告实验项目名称线性表的顺序表示和实现所属课程名称数据结构A实验类型验证性实验日期20xx年4月5号班级信管1002班学号20xx44070218姓名张松涛成绩1234附录1源程序5678...

数据结构实验报告三线性表的链式存储

实验报告三线性表的链式存储班级20xxXXX姓名HoogLe学号20xxXXXX专业XXXX2858505197qqcom一实验目的1掌握单链表的基本操作的实现方法2掌握循环单链表的基本操作实现3掌握两有序链表...

数据结构线性表实验报告

浙江万里学院实验报告专业班级计算机111实验小组第十组实验日期20xx921

数据结构线性表实验报告

实验报告实验一线性表实验目的1理解线性表的逻辑结构特性2熟练掌握线性表的顺序存储结构的描述方法以及在该存储结构下的基本操作并能灵活运用3熟练掌握线性表的链表存储结构的描述方法以及在该存储结构下的基本操作并能灵活...

数据结构实验报告1线性表的顺序存储结构

数据结构实验报告1线性表的顺序存储结构,内容附图。

数据结构实验报告在实现线性表的基础上实现逆置功能

数据结构实验报告1实验题目在实现线性表的基础上实现逆置功能2需求分析本演示程序用TC编写完成线性表的逆置功能输入的形式和输入值的范围逆转线性表中的元素首先需要输入需要逆转的元素然后通过计算机逆转以后输出在输入和...

数据结构与算法实验报告-线性表

沈阳工程学院学生实验报告课程名称数据结构与算法实验题目线性表班级网本112班学号20xx414217姓名樊鹏鹏地点F606指导教师吕海华祝世东实验日期20xx年9月27日1234567891011121314

数据结构实验报告

专业年级学号学生姓名指导老师华中师范大学信息管理系编数据结构实验报告I实验要求1每次实验中有若干习题每个学生至少应该完成其中的两道习题2上机之前应作好充分的准备工作预先编好程序经过人工检查无误后才能上机以提高上...

川师数据结构实验报告(含截图)

数据结构实验教学大纲学时课程总64学分4实验学时24实验个数7实验学分15课程性质必做适用专业计算机科学与技术软件工程网络工程教材及参考书数据结构C语言版严蔚敏吴伟民清华大学出版社20xx年11月数据结构题集C...

数据结构线性表实验报告(35篇)