`
敞开心怀勇敢的心
  • 浏览: 3675 次
  • 性别: Icon_minigender_2
  • 来自: 连云港
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据结构实验1

阅读更多
一.目的和要求
1. 熟练掌握顺序存储结构和链式存储结构的描述方法;
2. 熟练掌握线性表在顺序存储结构上实现基本操作:查找,插入,删除;
3. 熟练掌握在各种链表结构中实现线性表操作的基本方法,能在实际应用中选用适当的链表结构,了解静态链表;
4. 掌握栈和队列这两种抽象数据类型的特点;
5. 熟练掌握栈类型的两种实现方法,即两种存储结构表实现的基本操作,特别应注意栈满和栈空的条件以及他们的描述方法;
6. 熟练掌握循环队列和链队列的基本操作实现算法,特别队满和队空的描述方法。
二.实验题目
1. 顺序表的插入;
2. 单链表的删除并使其逆置输出;
3. 数据元素弹出栈。
三.实验步骤与源程序
1. 顺序表的插入步骤:
1)构造一个空的线性表L;
2)建立顺序表;
3)在顺序表的第i个位置之前插入一个元素
4)输出插入之后的新的顺序表L.
其源程序如下:
#include<stdio.h>  
  #include<conio.h>  
  #include<stdlib.h>  
  #define    LIST_INIT_SIZE    100
  #define   OVERFLOW  0
  #define   OK   1  
  #define   ERROR   0  
  #define   LISTINCREMENT   10    
  typedef   struct{  
      int   *elem;  
      int   length;       /*表示表中元素数目*/  
      int   listsize;     /*表示表的长度*/  
  }SqList;  
int  InitList_sq(SqList& L)/*构造一个空的线性表*/
  {  
      L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));  
      if(!L.elem)exit(OVERFLOW);  
      L.length=0;  
      L.listsize=LIST_INIT_SIZE;  
      return   OK;  
  }
  int CreateList_sq(SqList&L)/*建立顺序表*/
  {int i;
  printf("Input the datas:");
   for(i=0;i<L.length;i++)
    scanf("%d",&L.elem[i]);
   return OK;
  }
int   InsertList_sq(SqList&L,int   i,int   e){  
      int   *newbase;/*一旦表不够长,重新申请空间所用 */ 
      int   *p,*q;  
      if((i<1)||(i>L.length+1))   return   ERROR;/*插入位置不能为0或负,也不能大于表长*/ 
      if(L.length>=L.listsize){  
          newbase=(int   *)realloc(L.elem,(L.listsize+LISTINCREMENT)   *sizeof(int));    
          if(!newbase)exit(OVERFLOW);  
        L.elem=newbase;  
         L.listsize+=LISTINCREMENT;  
      }  
      q=&(L.elem[i-1]);  
      for(p=&L.elem[L.length-1];p>=q;--p)   *(p+1)=*p;  
      *q=e;  
      ++L.length;  
      return   OK;  
  } 
 
  void   main(){  
      int i,n,e;
      SqList L;
   InitList_sq(L);
   printf("\nInput the length of the list L:");
   scanf("%d",&n);
   L.length=n;
   CreateList_sq(L);
   printf("Input the insert data:");
   scanf("%d",&e);
   printf("Input the insert location:");
   scanf("%d",&i);
   InsertList_sq(L,i,e);
  printf("Output the data:");
  for(i=0;i<L.length;i++)
   printf("%d\n",L.elem[i]);
  getch();
  }
2带头结点的单链表的删除步骤:
  1)构造一个空的线性表L;
  2)建立线性表L;
  3)在带头结点的单链表中删除第i的元素;
  4)输出新的单链表.
其源程序如下:  
# include <stdlib.h>
# include <stdio.h>
# include <conio.h>
#define  OVERFLOW 0
# define INIT_LENGTH 10
# define OK 1
# define ERROR 0
typedef struct LNode
{int data;
struct LNode *next;
}LNode,*LinkList;
int  InitList_L(LinkList *L)      /*构造一个空的线性表*/
  {  
      (*L)=(LinkList)malloc(sizeof(LNode));
      if(!(*L))return(OVERFLOW);
      (*L)->next=NULL;
      return   OK;  
}
int  CreateList_L(LinkList *L,int n)  /*建立线性表*/
{ int i;
  LNode *p;
  (*L)=(LinkList)malloc(sizeof(LNode));
  (*L)->next=NULL;
  for(i=0;i<n;++i)
  {
   p=(LinkList)malloc(sizeof(LNode));
   scanf("%d",&p->data);
   p->next=(*L)->next;
   (*L)->next=p;
   }
   return OK;
   }
int TraverseList_L(LinkList L) 
{
LinkList p;
p=L->next;
while(p)
{printf("%d\n",p->data);
      p=p->next;
}
return OK;
}
  int ListDelete_L(LinkList *L,int i,int *e)
{
   LNode *p,*q;
   int j=0;
   p=*L;
   while(p->next&&j<i-1)
   { p=p->next;++j;
   }
   if(!p->next||j>i-1)  return ERROR;
   q=p->next;
   p->next=q->next;
   *e=q->data;
   free(q);
   return OK;
}
void   main(){  
  int i,n,e;
  LinkList L;
  InitList_L(&L);
  printf("\nInput the length of the list L:");
  scanf("%d",&n);
  printf("Input the numbers:");
  CreateList_L(&L,n); 
   printf("Input the delete location:");
   scanf("%d",&i);
   ListDelete_L(&L,i,&e);
  printf("Output the data:\n");
  TraverseList_L(L);
   getch();
  }
3将元素弹出顺序栈的步骤:
   1)初始化旧栈;
   2)输出旧的栈;
   3)将栈顶元素弹出,并输出栈顶元素的值;
   4)输出新栈.
其源程序如下:
# include <malloc.h>
# include <stdio.h>
# include <conio.h>
# define STACK_INIT_SIZE 100
# define STACKINCREMENT 10
# define OK 1
# define ERROR 0
typedef int SElemType;

typedef struct SqStack   /*定义结构体SqStack*/
{    SElemType *base;
     SElemType *top;
     int stacksize;
}SqStack;

int Pop(SqStack &S,SElemType &e) /* 如果栈 S 空,返回 ERROR ;如果栈 S 不空,删除 S 栈顶元素,用 e 返回其值,并返回 OK */
{    if(S.top==S.base)
     {   printf("It's a empty SqStack!");
   return (ERROR);
     }
     e=*--S.top;
     return (OK);
}

void main()    /*main function*/
{   SElemType e;
    SqStack S;
    S.stacksize=STACK_INIT_SIZE;
    S.base=S.top=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    *S.top++=1;    /*初始化旧的栈*/
    *S.top++=3;
    *S.top++=6;
    *S.top++=8;
    *S.top++=7;
    *S.top++=9;
    SElemType *p; 
   printf("The old SqStack is (base to top)\n : ");
    for(p=S.base;p!=S.top;p++)  /*输出旧栈*/
       printf("%d\n",*p);
    if(Pop(S,e))
printf("\nthe pop nuber is:\n%d",e); /*输出栈顶元素*/
   printf("\nThe new SqStack is : ");
    for(p=S.base;p!=S.top;p++)  /*输出新栈*/
     printf("%d\n",*p);   
    getch();
}
四.测试数据与实验结果
1. 顺序表的插入实验结果如图一;
2. 单链表的删除实验结果如图二;
3. 将元素弹出顺序栈的实验结果如图三;


图一  顺序表的插入

               图二    单链表的删除(逆置读入)

图三   将元素弹出顺序栈
五.结果分析与实验体会

经过这次实验发现,学习数据结构对C语言将会有很大提高。以前我觉得写好一个程序使其可以运行是那么的可望而不可及,每次写完一段小程序,不管怎样还是有错误,于是便没有耐心去调试,但是这次的作业我必须得认真完成,这样我便要求自己努力的静下心来去调试程序,当程序调试成功之后的那种喜悦的心情我都不知道怎么用言语来表达。真的好欣慰,让我更确信“世上无难事只怕有心人”。
这次实验加深了我对刚学过的数据结构的基础知识理解。更深刻的理解了线性结构的特点:在数据元素的非空有限集中存在唯一的一个被叫做“第一个”的数据元素;存在唯一的一个被称做”最后一个”的数据元素;除第一个之外,集合中的每个数据元素均只有一个前驱;除最后一个之外集合中每个元素均只有一个后继.;用顺序方法存储的线性表称为顺序表,当线性表中很少做插入和删除操作,线性表的长度变化不大,易于事先确定其大小时,可以采用顺序表作为存储结构。用链接方法存储的线性表称为线性链表,当线性表的长度变化较大,难以估计其存储规模,另外对线性表频繁进行插入和删除操作时,则采用链表作为存储结构可能会更好一些。对于线性表在顺序存储结构上实现基本操作的算法如查找,插入,删除等也理解得更透彻了,也理解了栈和队列的插入和删除原则:(1),栈,后进先出,所有操作都是在栈顶进行的.(2),队列,先进先出,插入运算只能在对尾进行,删除运算只能在对头进行! 对于栈满和栈空的条件以及他们的描述方法;掌握了循环队列和链队列的基本操作实现算法,特别队满和队空的描述方法。
我也觉得自己动手编程是那么的重要,因为编程序是个实干的活,光说不练不行。刚开始学的时候可以多练习书上的习题。对于自己不明白的地方,自己编个小程序实验一下是最好的方法,能给自己留下深刻的印象。自己动手的过程中要不断纠正自己不好的编程习惯和认识错误。
这次实验使我觉得受益匪浅,我对以后的学习有了更得大的信心,但是学习的过程将会是很艰辛的,不过我不会放弃,希望自己可以在不断完善过程中达到不断提高的效果。
0
1
分享到:
评论

相关推荐

    前18大旋转修整器企业占据全球87%的市场份额.docx

    前18大旋转修整器企业占据全球87%的市场份额

    Planet-SkySat-Imagery-Product-Specification-Jan2020.pdf

    SKYSAT IMAGERY PRODUCT SPECIFICATION PLANET.COM VIDEO Full motion videos are collected between 30 and 120 seconds by a single camera from any of the active SkySats. Videos are collected using only the Panchromatic half of the camera, hence all videos are PAN only. Videos are packaged and delivered with a video mpeg-4 file, plus all image frames with accompanying video metadata and a frame index file (reference Product Types below)

    Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg

    Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg

    2019年A~F题特等奖论文合集.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文

    雷达物位变送器安装和操作手册

    雷达物位变送器安装和操作手册

    node-v11.6.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Python3实现快速排序(源代码)

    快速排序是一种基于分治策略的排序算法,通过选择一个基准元素,将待排序的数组划分为两个子数组,一个包含所有小于基准的元素,另一个包含所有大于基准的元素,然后递归地对这两个子数组进行快速排序。快速排序在平均情况下具有O(n log n)的时间复杂度,是一种非常高效的排序算法。然而,在最坏情况下,当输入数据已经有序或接近有序时,快速排序的性能会退化为O(n^2)。此外,快速排序是不稳定的排序算法,即相等的元素可能在排序过程中改变相对位置。尽管如此,快速排序仍然因其高效的平均性能而在实际应用中广泛使用。在Python3中,可以通过递归或迭代的方式实现快速排序算法,但为了避免额外的空间开销,通常会采用原地排序的方式来实现。

    毕业课设基于51单片机的出租车计价器(昼夜)

    【作品名称】:基于51单片机的出租车计价器(昼夜) 含(程序、仿真图、流程图、原理图) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 出租车计价器: 1、不同情况具有不同的收费标准,具有白天和夜晚不同的计价能力 2、能进行手动修改单价 3、具有数据的复位功能(起步价,起步公里数,里程单价,白天晚上不一样) 4、能够在掉电的情况下存储单价等数据 5、步进电机模拟里程,一圈表示一里路

    2024年中国API 11P往复式气体压缩机行业研究报告.docx

    2024年中国API 11P往复式气体压缩机行业研究报告

    Windows 10系统上安装和配置Tomcat的步骤

    附件是Windows 10系统上安装和配置Tomcat的步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    广东工业大学《计算网络A》实验报告期末考试试题回忆版.doc

    此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。

    数据库+人大金仓+Linux系统安装

    数据库+人大金仓+Linux系统安装

    2023年美赛特等奖论文-C-2309397-解密.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文

    opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl

    opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl

    减肥管理,全球前10强生产商排名及市场份额.docx

    减肥管理,全球前10强生产商排名及市场份额

    上海大学大学生创新创业训练计划申请书(创新训练项目).doc

    内容概要:《上海大学大学生创新创业训练计划申请书(创新训练项目)》是用于申请参加上海大学的大学生创新创业训练计划的申请书,旨在帮助学生提出创新项目计划,获得培训和支持,促进学生创新创业能力的提升。 适用人群:适合上海大学的在校大学生,特别是对创新创业感兴趣、有创新想法和创业计划的学生,希望通过该计划获得指导和资源支持,实现自己的创业梦想。 使用场景及目标:申请书的使用场景是为了参加上海大学的大学生创新创业训练计划,目标是通过提交详细的创新项目计划,获得评审通过并获得培训、指导和资金支持,从而推动学生的创新创业实践和能力提升。 其他说明:申请书应包括清晰的创新项目描述、项目可行性分析、预期目标和计划、团队介绍等内容,以展现学生的创新能力和项目潜力。申请书的撰写需要认真准备,体现出学生对创新创业的热情和才华,以提高申请成功的机会。

    IEC 60364-7-716-2023 第7-716部分:特殊装置或场所要求.信息和通信技术ICT电缆基础设施上ELV直流配电

    IEC 60364-7-716-2023 低压电气装置.第7-716部分:特殊装置或场所的要求.信息和通信技术(ICT)电缆基础设施上的ELV直流配电.pdf

    IEC PAS 61851-1-1 2023 电动汽车导电充电系统.第1-1部分:使用4型车辆耦合器电动汽车导电带电系统特殊要求

    IEC PAS 61851-1-1 2023 电动汽车导电充电系统.第1-1部分:使用4型车辆耦合器的电动汽车导电带电系统的特殊要求.pdf

    前11大客运渡轮服务企业占据全球30.3%的市场份额.docx

    前11大客运渡轮服务企业占据全球30.3%的市场份额

    wsl+MCgpu安装记录

    wsl+MCgpu安装记录

Global site tag (gtag.js) - Google Analytics