一、实验目的

1、掌握线性表中元素的前驱、后续的概念。

2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。

3、对线性表相应算法的时间复杂度进行分析。

4、理解顺序表、链表数据结构的特点(优缺点)。

二、实验预习

说明以下概念

1、线性表:

具有相同特性的数据元素的一个有限序列。同一线性表中的元素具有相同特征,且数据元素之间为线性关系。

非空的线性表中有且仅有一个开始节点a1和终端节点an。开始节点a1没有直接前驱,仅有一个直接后继a2;终端节点an没有直接后继,仅有一个直接前驱an-1;其余内部节点ai仅有一个直接前驱ai-1和一个直接后继ai+1。

2、顺序表:

以顺序存储结构存储的线性表,把线性表中所有数据元素按照其逻辑顺序依次存储到一组地址连续的存储单元中。逻辑上相邻的数据元素在物理次序上也相邻。

3、链表:

以链式存储结构存储的线性表,数据元素存储在一组任意的存储单元中(可连续可不连续)。

对数据元素ai来说,除了存储数据本身的信息外,还需存储一个指示其直接后继的信息,这两部分信息组成数据元素ai的存储映像,称为结点,n个节点链接成为一个链表。

根据链表结点所含指针个数、指针指向和指针连接方式,可将链表分为单链表、循环链表、双向链表、二叉链表、十字链表、邻接表、邻接多重表等。

三、实验内容和要求

1、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1#define INIT_SIZE 5     /*初始分配的顺序表长度*/
#define INCREM 5        /*溢出时,顺序表长度的增量*/typedef  int ElemType;  /*定义表元素的类型*/typedef struct Sqlist{ElemType *slist;      /*存储空间的基地址*/int length;           /*顺序表的当前长度*/int listsize;         /*当前分配的存储空间*/
}Sqlist;int InitList_sq(Sqlist *L);   /*初始化一个长度为5的顺序表L*/
int CreateList_sq(Sqlist *L,int n);   /*创建一个长度为n的顺序表L*/
int ListInsert_sq(Sqlist *L,int i,ElemType e);   /*在顺序表L中插入数据元素:在第i个元素之前插入e*/
int PrintList_sq(Sqlist *L);   /*输出顺序表的元素*/
int ListDelete_sq(Sqlist *L,int i);   /*删除第i个元素*/
int ListLocate(Sqlist *L,ElemType e);   /*查找值为e的元素*/int InitList_sq(Sqlist *L){L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(!L->slist) return ERROR;L->length=0;L->listsize=INIT_SIZE;return OK;
}/*InitList*/int CreateList_sq(Sqlist *L,int n){ElemType e;int i;for(i=0;i<n;i++){printf("input data %d:",i+1);scanf("%d",&e);if(!ListInsert_sq(L,i+1,e))return ERROR;}return OK;
}/*CreateList*//*输出顺序表中的元素*/
int PrintList_sq(Sqlist *L){int i;for(i=1;i<=L->length;i++)printf("%5d",L->slist[i-1]);return OK;
}/*PrintList*/int ListInsert_sq(Sqlist *L,int i,ElemType e){int k;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize){
L->slist=(ElemType*)realloc(L->slist,
(INIT_SIZE+INCREM)*sizeof(ElemType));if(!L->slist)
return ERROR;
L->listsize+=INCREM;
}for(k=L->length-1;k>=i-1;k--){L->slist[k+1]= L->slist[k];}L->slist[i-1]=e;L->length++;return OK;
}/*ListInsert*//*在顺序表中删除第i个元素*/
int ListDelete_sq(Sqlist *L,int i){}
/*在顺序表中查找指定值元素,返回其序号*/
int ListLocate(Sqlist *L,ElemType e){}int main(){Sqlist sl;int n,m,k;printf("please input n:");  /*输入顺序表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create Sqlist:\n");InitList_sq(&sl);CreateList_sq(&sl,n);printf("\n2-Print Sqlist:\n");PrintList_sq(&sl);printf("\nplease input insert location and data:(location,data)\n");scanf("%d,%d",&m,&k);ListInsert_sq(&sl,m,k);printf("\n3-Print Sqlist:\n");PrintList_sq(&sl);printf("\n");}elseprintf("ERROR");return 0;
}

运行结果:

2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。

删除算法代码:

int ListDelete_sq(Sqlist *L,int i){   /*删除顺序表L中第i个元素*/int p;if((i<1) || (i>L->length))return ERROR;for(p=i-1;p<L->length-1;p++){L->slist[p]=L->slist[p+1];}L->length--;return OK;
}/*ListDelete_sq*/

查找算法代码:

int ListLocate_sq(Sqlist *L,ElemType e){   /*查找顺序表L中指定值元素,返回其序号*/int i;for(i=0;i<=L->length;i++){if(L->slist[i]==e)return i+1;  }return(-1);   //查找失败,返回-1
}/*ListLocate_sq*/

主函数补充代码:

int main(){Sqlist sl;int n,m,k,i;ElemType e;printf("please input n:");   /*输入顺序表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create Sqlist:\n");InitList_sq(&sl);CreateList_sq(&sl,n);printf("\n2-Print Sqlist:\n");PrintList_sq(&sl);/*插入数据元素*/printf("\n\n3-please input insert location and data:(location,data)\n");scanf("%d,%d",&m,&k);ListInsert_sq(&sl,m,k);/*打印表中数据*/printf("\n--Print Sqlist:\n");PrintList_sq(&sl);/*删除数据*/printf("\n\n4-please input delete location:(location)\n");scanf("%d",&i);ListDelete_sq(&sl,i);printf("\n--Print Sqlist:\n");PrintList_sq(&sl);/*查找元素*/printf("\n\n5-please input element you want to search:(element)\n");scanf("%d",&e);printf("--该元素序号为:%d\n",ListLocate_sq(&sl,e));}elseprintf("ERROR");return 0;
}

运行结果:

3、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1typedef  int ElemType;   /*定义表元素的类型*/typedef struct LNode{    /*线性表的单链表存储*/ElemType data;struct LNode *next;
}LNode,*LinkList;LinkList CreateList(int n);   /*创建一个长度为n的链表*/
void PrintList(LinkList L);   /*输出带头结点单链表的所有元素*/
int GetElem(LinkList L,int i,ElemType *e);   /*获取第i个位置的元素*/LinkList CreateList(int n){LNode *p,*q,*head;int i;head=(LinkList)malloc(sizeof(LNode));        head->next=NULL;p=head;for(i=0;i<n;i++){q=(LinkList)malloc(sizeof(LNode));printf("input data %i:",i+1);scanf("%d",&q->data);            /*输入元素值*/q->next=NULL;                    /*结点指针域置空*/p->next=q;                       /*新结点连在表末尾*/p=q;}return head;
}/*CreateList*/void PrintList(LinkList L){LNode *p;p=L->next;   /*p指向单链表的第1个元素*/while(p!=NULL){printf("%5d",p->data);p=p->next;}
}/*PrintList*/int GetElem(LinkList L,int i,ElemType *e){LNode *p;int j=1;p=L->next;while(p&&j<i){p=p->next;j++;}if(!p||j>i)return ERROR;*e=p->data;return OK;
}/*GetElem*/int main(){int n,i;ElemType e;LinkList L=NULL;            /*定义指向单链表的指针*/printf("please input n:");  /*输入单链表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create LinkList:\n");L=CreateList(n);printf("\n2-Print LinkList:\n");PrintList(L);printf("\n3-GetElem from LinkList:\n");printf("input i=");scanf("%d",&i);if(GetElem(L,i,&e))printf("No%i is %d",i,e);elseprintf("not exists");}elseprintf("ERROR");return 0;
}

运行结果:

4、为第3题补充插入功能函数和删除功能函数。并在主函数中补充代码验证算法的正确性。

插入算法代码:

int LengthList(LinkList L){   /*求链表L长度*/int i = 0;LNode* p = L;while(p->next){p=p->next;i++;}return i;
}/*LengthList*/int InsertList(LinkList L,int i){   //i=0,插在表头;否则插在第i个元素后if(i<0 || i>LengthList(L))return ERROR;LNode* p;LNode* q;LNode* r;     /*r为新插入的结点*/ElemType e;r=(LinkList)malloc(sizeof(LNode));   /*为新结点分配空间*/printf("输入要插入的元素:");scanf("%d",&e);r->data = e;if(i==0){p = L;q = p->next;   //q保存第一个结点指针p->next = r;   //头指针指向r,r成为链表第一个结点(除头节点外)r->next = q;return OK;}int j = 0;for(p = L;j < i;j++){   //循环结束时p指向i位置结点p=p->next;}q = p->next;p->next = r;r->next = q;return OK;
}/*ListInsert*/

 删除算法代码:

int DeleteList(LinkList L,int i){if(i<1 || i>LengthList(L))return ERROR;LNode* p;LNode* q;LNode* r;int j = 0;for(p = L;j < i-1;j++){  //循环结束时p指向i-1位置结点p=p->next;}q=p->next;  //q指向i号结点printf("该结点数据是:%d\n",q->data);r=q->next;  //r指向i+1号结点p->next = r;  //i-1号结点后继变为i+1号结点,实现删除操作free(q);return OK;
}/*DeleteList*/

主函数补充代码:

int main(){int n,i,m;ElemType e;LinkList L=NULL;             /*定义指向单链表的指针*/printf("please input n:");   /*输入单链表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create LinkList:\n");L=CreateList(n);printf("\n2-Print LinkList:\n");PrintList(L);/*获取第i号数据*/printf("\n\n3-GetElem from LinkList:\n");printf("input i=");scanf("%d",&i);if(GetElem(L,i,&e))printf("--No%i is %d",i,e);elseprintf("not exists");/*插入数据*/printf("\n\n4-输入插入的元素位置(链表长度为:%d):",LengthList(L));scanf("%d",&i);printf("\n5-");m = InsertList(L,i);if(m==1){printf("\n6-Print LinkList:\n");PrintList(L);}/*删除结点*/printf("\n\n7-输入删除结点位置号:");scanf("%d",&i);printf("\n8-");m = DeleteList(L,i);if(m==1){printf("\n9-Print LinkList:\n");PrintList(L);}}elseprintf("ERROR");return 0;
}

运行结果:

四、顺序存储和链式存储分析比较(优缺点):

1、顺序存储:

存/读数据:时间复杂度O(1)

插入/删除:时间复杂度O(n)

优点:

①无需为表示元素间逻辑关系而开辟额外内存空间(物理上的逻辑关系已经表明元素间逻辑关系)。

②可快速存取表中任意位置数据。

缺点:

①插入/删除需移动大量元素

②若线性表长度变化较大,难以事先确定需要的存储空间容量(可能造成溢出或空间浪费)。

2、链式存储(单链表):

查找/插入/删除:时间复杂度O(n)

优点:

①插入/删除操作只需修改对应指针,无需移动大量元素(但需先找到操作对应的指针,故时间复杂度仍为O(n))。

②无需预先分配空间,只要内存空间足够,链表元素个数就不受限。

缺点:

①链表结点除存储数据本身外,还需开辟空间存储指向下一元素的指针(空间消耗增大)。

五、总结

1.频繁查找,较少插入、删除——顺序存储

2.事先知道线性表大致长度——顺序存储

3.频繁插入、删除——链式存储

4.表中元素个数变化较大——链式存储

《数据结构》实验报告二:顺序表 链表相关推荐

  1. 数据结构实验报告(二)简单计算器(中缀转后缀)

    报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...

  2. 数据结构实验报告二 栈和队列

    一.实验目的 1.掌握栈的结构特性及其入栈,出栈操作: 2.掌握队列的结构特性及其入队.出队的操作,掌握循环队列的特点及其操作. 二.实验内容和要求 1.阅读下面程序,将函数Push和函数Pop补充完 ...

  3. 北京理工大学计算机实验四报告表,北京理工大学数据结构实验报告实验四

    北京理工大学数据结构实验报告实验四 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 <数据结构与算法设计>实验报告--实 ...

  4. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  5. C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文

    数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00  浏览量:763  手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...

  6. java数据结构与算法之顺序表与链表深入分析

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...

  7. 数据结构实验报告(一)

    数据结构实验报告(一) 一.实验名称 实验一  线性表的基本操作实现及其应用 二.实验目的 1.熟练掌握线性表的结构特点,掌握顺序表的基本操作. 2.巩固 C++相关的程序设计方法与技术. 3.学会使 ...

  8. 数据结构三元组实验报告_数据结构实验报告

    实验一 约瑟夫问题 实验学时: 3 学时 实验类型:设计 实验要求:必修 一.实验目的 熟练掌握线性链表的基础知识: 能够使用 C++ 或其他程序设计语言编程实现线性链表: 能够使用线性链表构造正确而 ...

  9. 桂电七院数据结构实验报告一

    顺序表的基本操作 实验内容与步骤 实现顺序表上的插入.删除等操作.调试程序并对相应的输出作出分析:修改输入数据,预期输出并验证输出的结果.加深对有关算法的理解. 步骤: 第一步:定义顺序表的存储结构. ...

  10. 计算机数据表示实验报告,实验报告二数据的表示

    <实验报告二数据的表示>由会员分享,可在线阅读,更多相关<实验报告二数据的表示(4页珍藏版)>请在人人文库网上搜索. 1.计算机系统基础实验报告学院 信电学院 专业 计算机科学 ...

最新文章

  1. jquery改变html元素的样式,给input标签赋值,onclick中文传参问题等
  2. 基础篇-verilog-FPGA实现频率相位调制DDS信号
  3. 10. Leetcode 209. 长度最小的子数组 (数组-同向双指针-滑动窗口)
  4. java.sql.SQLException: Io 异常: Got minus one from a read call
  5. 使用sublime text 开发node.js
  6. 位地址和字节地址换算_面试常考,项目易错,长文详解C/C++中的字节对齐
  7. IOS使用Auto Layout中的VFL适配
  8. office数据集dslr_DSLR的完整形式是什么?
  9. 801. 二进制中1的个数
  10. VMware虚拟机克隆CentOS6.5后修改网卡
  11. JAVA设计模式-委派模式(Delegate)
  12. vscode设置templates_Vscode中快速创建自定义代码模板的方法
  13. px2rem-loader(Vue:移动端自适应,px自动转化)
  14. ios添加GPUImage到项目
  15. mysql 正则排序_MySQL-排序、GROUP BY、连接、NULL值处理、正则表达式、事务
  16. MagicDraw-状态机图
  17. history的使用方法
  18. 一、初识FreeRTOS之FreeRTOS简介
  19. 九连环 C语言递归代码
  20. Linux常用指令---系统负载

热门文章

  1. 万能用户名和万能密码
  2. Cesium 系列1 - 简介及源码下载发布
  3. Linux-Centos7防火墙配置
  4. STM32——串口概念及应用
  5. 极简微前端框架-京东MicroApp开源了
  6. 测试小故事74:没有计划的日子
  7. Eclipse clearcase plugin
  8. 新型网络病毒“风暴”防护解决方案
  9. 【三角形判断】测试用例设计
  10. 四十种 智能合约 支持平台