数据结构实验一顺序表

数据结构实验一顺序表
数据结构实验一顺序表

数据结构实验一

1、实验目的

?掌握线性表的逻辑特征

?掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算

2、实验内容:

建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;

1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:

?创建一个新的顺序表,实现动态空间分配的初始化;

?根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;

?根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);

?利用最少的空间实现顺序表元素的逆转;

?实现顺序表的各个元素的输出;

?彻底销毁顺序线性表,回收所分配的空间;

?对顺序线性表的所有元素删除,置为空表;

?返回其数据元素个数;

?按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;

?按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;

?判断顺序表中是否有元素存在,对判断结果进行返回;

.编写主程序,实现对各不同的算法调用。

2.实现要求:

?“初始化算法”的操作结果:构造一个空的顺序线性表。对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;

?“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;

操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;

?“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;

操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;

?“逆转算法”的初始条件:顺序线性表L 已存在;

操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;

?“输出算法”的初始条件:顺序线性表L 已存在;

操作结果:依次对L 的每个数据元素进行输出;

?“销毁算法”初始条件:顺序线性表L 已存在;

操作结果:销毁顺序线性表L;

?“置空表算法”初始条件:顺序线性表L 已存在;

操作结果:将L 重置为空表;

?“求表长算法”初始条件:顺序线性表L 已存在;

操作结果:返回L 中数据元素个数;

?“按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)

操作结果:返回L 中第i 个数据元素的值

?“按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;

操作结果:返回L 中数据元素值为e 的元素位置;

?“判表空算法”初始条件:顺序线性表L 已存在;

操作结果:若L 为空表,则返回TRUE,否则返回FALSE;

分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。

3、实验指导

一个简单程序通常主要由三部分构成:

1、常量定义(#define),类型重定义(typedef)及函数原型(#include)声明;还有针对每一种数据结构的类型定义。

2、算法函数,对于顺序表,每一个函数具有独立的功能,组合成为模块的形式,如ListInit_Sq、ListInsert_Sq、ListDelete_Sq、ListReverse_Sq、ListPrint_Sq 等。

3、主函数(main)。

【说明1】――顺序表的定义与操作

1.可以将这三部分组合在一个文件中,也可以按照项目的方式(多个不同的文件组合在一起,共同完成一个功能)进行组织(本课程的实验强烈推荐这种形式),如将本课程后续所有算法几乎都要使用的常量定义(#define)和系统函数原型定义(#include)声明组合成一个文件,存储为一个头文件(取名为pubuse.h),只需建立一次,以后凡涉及到相关的内容,只需在你的文件的前面加上一条#include “pubuse. h”即可,无需重复输入。

2.对于类型定义,由于每一种数据结构的定义都不一样,因此要进行专门的类型定义,也可以将数据结构的定义组合成为一个文件,存储为一个头文件(如线性表的顺序存储结构定义取名为seqlistDef. h),只需建立一次,以后凡涉及到关于顺序表操作的相关内容,一定要在你的文件的前面加上一条#include“seqlistDef. h”即可,无需重复进行顺序存储结构的定义。

3.关于实验内容要完成的操作,一般都以独立的算法出现,关于某类数据结构的各种不同算法函数组合在一个文件之中,存储为一个头文件(如取名为seqlistAlgo. h),以后凡涉及到要使用本文件中的顺序表算法,一定要在你的文件的前面加上一条#include “seqlistAlgo. h”即可,无需重复定义类似的算法,就象使用系统函数一样,只需进行函数原型的声明即可。

4.还应包含一个main 函数,作为整个程序的执行入口处,定义测试的数据,完成各种算法的调用执行,对算法的执行过程和结果进行判断和输出控制,存储为一个源文件(如取名为seqlistUse. cpp)。

5.为了对实际问题更加通用和适应,在算法中使用的数据类型为ElemType,为了与实际数据类型一致,一般要将ElemType 用typedef 重定义:如实际问题中顺序表的每个元素是整型,则使用typedef int ElemType;定义语句;如实际问题中顺序表的每个元素是单精度实数的话,使用typedef float ElemType;定义语句。

4、基本实验的参考程序

线性表的顺序存储结构的定义及其基本操作的参考程序(顺序表)

(1) 文件1:pubuse. h 是公共使用的常量定义和系统函数调用声明,以后每个实验中几乎都涉及到此文件。

#include

#include

#include /* malloc()等*/

#include /* INT_MAX 等*/

#include /* EOF(=^Z 或F6),NULL */

#include /* atoi() */

#include /* eof() */

#include /* floor(),ceil(),abs() */

#include /* exit() */

/* 函数结果状态代码*/

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

/* #define OVERFLOW -2 因为在math. h 中已定义OVERFLOW 的值为3,故去掉此行*/ typedef int Status;/* Status 是函数的类型,其值是函数结果状态代码,如OK 等*/ typedef int Boolean;/* Boolean 是布尔类型,其值是TRUE 或FALSE */

(2) 文件2:seqlistDef. h 进行线性表的动态分配顺序存储结构的表示

#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量*/

#define LISTINCREMENT 2 /* 线性表存储空间的分配增量*/

typedef struct

{

ElemType *elem;/* 存储空间基址*/

int length;/* 当前长度*/

int listsize;/* 当前分配的存储容量(以sizeof(ElemType)为单位) */

}SqList;

(3)文件3:seqlistAlgo. h 进行线性表顺序存储结构的基本实验算法定义

Status ListInit_Sq(SqList &L) /* 算法2. 3 */

{ /* 操作结果:构造一个空的顺序线性表*/

L. elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L. elem)

exit(OVERFLOW);/* 存储分配失败*/

L. length=0;/* 空表长度为0 */

L. listsize=LIST_INIT_SIZE;/* 初始存储容量*/

return OK;

Status ListInsert_Sq(SqList &L,int i,ElemType e) /* 算法2. 4 */

{ /* 初始条件:顺序线性表L 已存在,1≤i≤ListLength(L)+1 */

/* 操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1 */ ElemType *newbase,*q,*p;

if(i<1||i>L. length+1) /* i 值不合法*/

return ERROR;

if(L. length>=L. listsize) /* 当前存储空间已满,增加分配*/

{

newbase=(ElemType *)realloc(L. elem,(L. listsize+LISTINCREMENT)*sizeof(ElemType));if(!newbase)

exit(OVERFLOW);/* 存储分配失败*/

L. elem=newbase;/* 新基址*/

L. listsize+=LISTINCREMENT;/* 增加存储容量*/

}

q=L. elem+i-1;/* q 为插入位置*/

for(p=L. elem+L. length-1;p>=q;--p) /* 插入位置及之后的元素右移*/

*(p+1)=*p;

*q=e;/* 插入e */

++L. length;/* 表长增1 */

return OK;

}

Status ListDelete_Sq(SqList &L,int i,ElemType *e) /* 算法2. 5 */

{ /* 初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) */

/* 操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 */ ElemType *p,*q;

if(i<1||i>L. length) /* i 值不合法*/

return ERROR;

p=L. elem+i-1;/* p 为被删除元素的位置*/

*e=*p;/* 被删除元素的值赋给e */

q=L. elem+L. length-1;/* 表尾元素的位置*/

for(++p;p<=q;++p) /* 被删除元素之后的元素左移*/

*(p-1)=*p;

L. length--;/* 表长减1 */

return OK;

}

Status ListReverse_Sq(SqList &L)

{ /* 初始条件:顺序线性表L 已存在*/

/* 操作结果:依次对L 的数据元素成对交换*/

ElemType t;

int i;

for(i=0;i

{t=L. elem[i];L. elem[i]= L. elem[L. length-i-1];L. elem[L. length-i-1]=t;}

printf("\n");

return OK;

}

Status ListPrint_Sq(SqList L)

{ /* 初始条件:顺序线性表L 已存在*/

/* 操作结果:依次对L 的数据元素输出*/

int i;

printf("\n");

for(i=0;i

printf("%d ", L. elem[i]);

return OK;

}

/* 还有一些算法(斜体字标示算法),同学们自己补充完整*/

(4)文件4:seqlistUse. cpp 进行线性表顺序存储结构的基本算法验证

#include"pubuse. h" /* 实现通用常量的定义,常用系统函数的声明*/

typedef int ElemType;/*实现一组整数的操作,将int 型特定义为通用的ElemType 类型名*/ #include"seqlistDef. h" /* 采用线性表的动态分配顺序存储结构定义*/

#include"seqlistAlgo. h" /* 采用顺序表的基本算法定义*/

void main()

{

SqList L;

Status i;

int j;

ElemType t;

/* 首先一定要初始化顺序表*/

i=ListInit_Sq(L);

if(i==1) /* 创建空表L 成功*/

for(j=1;j<=5;j++) /* 在表L 中插入5 个元素,每个元素的值分别为2,4,6,8,10 */ i=ListInsert_Sq(L,j,2*j);

ListPrint_Sq(L);/*检验一下插入的结果,输出表L 的内容*/

ListInsert_Sq(L,2,20);/* 随机指定插入点位置,假设在第二个元素前插入新的元素,其值为20 */

ListDelete_Sq(L,4,&t);/* 随机指定删除点位置,假设对第四个元素进行删除*/

printf("\n The Deleted value is %d",t);/* 检验一下删除点元素的值*/

ListPrint_Sq(L);/* 检验一下插入和删除后的结果,输出表La 的内容*/

ListReverse_Sq(L);/* 将顺序表La 的所有元素进行逆序*/

ListPrint_Sq(L);/* 检验一下逆序的结果,输出表L 的内容*/

}

5、实验环境和实验步骤

实验环境:利用V isual C++集成开发环境进行本实验的操作。

实验步骤――顺序表的定义与操作:

1.启动VC++;

2. 新建工程/Win32 Console Application,选择输入位置:如“d:\”,输入工程的名称:如“SeqlistDemo”;按“确定”按钮,选择“An Empty Project”,再按“完成”按钮,

3.新建文件/C/C++ Header File,选中“添加到工程的复选按钮”,输入文件名“pubuse. h”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;

4. 新建文件/C/C++ Header File,选中“添加到工程的复选按钮”,输入文件名“seqlistDef. h”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;

5. 新建文件/C/C++ Header File,选中“添加到工程的复选按钮”,输入文件名“seqlistAlgo. h”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;

6. 新建文件/C++ Source File,选中“添加到工程的复选按钮”,输入文件名“seqlistUse. cpp”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;

7.按F7 键,或工具图标进行工程的建立,如有错误,根据错误显示区中的提示,改正错误,重新建立应用程序;

8.按Ctrl+F5 键,或工具图标进行工程的执行。

6、实验内容

7、实验体会

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据结构实验

实验2 查找算法的实现和应用?实验目的 1. 熟练掌握静态查找表的查找方法; 2. 熟练掌握动态查找表的查找方法; 3. 掌握hash表的技术. ?实验内容 1.用二分查找法对查找表进行查找; 2.建立二叉排序树并对该树进行查找; 3.确定hash函数及冲突处理方法,建立一个hash表并实现查找。 程序代码 #include using namespace std; int main() { int arraay[10]={1,2,3,4,5,6,7,8,9,10}; int binary_search(int a[10],int t); cout<<"Enter the target:"; int target; cin>>target; binary_search(arraay,target); return 0; } int binary_search(int a[10],int t) { int bottom=0,top=9; while(bottom

cout<<"Not present!"; } return 0; } 结果 二叉排序树 #include #include #include using namespace std; typedef int keyType; typedef struct Node { keyType key; struct Node* left; struct Node* right; struct Node* parent; }Node,*PNode; void inseart(PNode* root, keyType key) { PNode p = (PNode)malloc(sizeof(Node)); p -> key = key;

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据结构实验一 实验报告

班级::学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验容 定义一个包含学生信息(学号,,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2

typedef int Status; // 定义函数返回值类型 typedef struct { char num[10]; // 学号 char name[20]; // double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK;

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

数据结构实验报告

姓名: 学号: 班级: 2010年12月15日

实验一线性表的应用 【实验目的】 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。、; 2、以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现; 4、通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的 应用和链表的建立等各种基本操作)。 【实验内容】 约瑟夫问题的实现:n只猴子要选猴王,所有的猴子按1,2,…,n编号围坐一圈,从第一号开始按1,2…,m报数,凡报到m号的猴子退出圈外,如此次循环报数,知道圈内剩下一只猴子时,这个猴子就是猴王。编写一个程序实现上述过程,n和m由键盘输入。【实验要求】 1、要求用顺序表和链表分别实现约瑟夫问题。 2、独立完成,严禁抄袭。 3、上的实验报告有如下部分组成: ①实验名称 ②实验目的 ③实验内容:问题描述:数据描述:算法描述:程序清单:测试数据 算法: #include #include typedef struct LPeople { int num; struct LPeople *next; }peo; void Joseph(int n,int m) //用循环链表实现 { int i,j; peo *p,*q,*head; head=p=q=(peo *)malloc(sizeof(peo)); p->num=0;p->next=head; for(i=1;inum=i;q->next=p;p->next=head; } q=p;p=p->next; i=0;j=1; while(i

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

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 带头结点的单链表

2.2 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中b、代码实现: Linklist::Linklist(int a[],int n)//头插法 {front=new Node; front->next=NULL; for(int i=n-1;i>=0;i--) {Node*s=new Node; s->data=a[i]; s->next=front->next; front->next=s; } } 2、尾插法

a、伪代码实现:a.在堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)//尾插法 {front=new Node; Node*r=front; for(int i=0;idata=a[i]; r->next=s; r=s; } r->next=NULL; } 时间复杂度:O(n) 3、按位查找 a、伪代码实现: 初始化工作指针p和计数器j,p指向第一个结点,j=1 循环以下操作,直到p为空或者j等于1 b1:p指向下一个结点 b2:j加1 若p为空,说明第i个元素不存在,抛出异常 否则,说明p指向的元素就是所查找的元素,返回元素地址 b、代码实现 Node* Linklist::Get(int i)//得到指向第i个数的指针 {Node*p=front->next; int j=1; while(p&&j!=i)//p非空且j不等于i,指针后移 {p=p->next; j++;

数据结构实验

长春大学计算机学院网络工程专业 数据结构实验报告 实验名称:实验二栈和队列的操作与应用 班级:网络14406 姓名:李奎学号:041440624 实验地点:日期: 一、实验目的: 1.熟练掌握栈和队列的特点。 2.掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用。 3.掌握链队的入队和出队等基本操作。 4.加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力。 二、实验内容、要求和环境: 注:将完成的实验报告重命名为:班级+学号+姓名+(实验二),(如:041340538张三(实验二)),发邮件到:ccujsjzl@https://www.360docs.net/doc/234262739.html,。提交时限:本次实验后24小时之内。 阅读程序,完成填空,并上机运行调试。 1、顺序栈,对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 (1)文件SqStackDef. h 中实现了栈的顺序存储表示 #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack { SElemType *base; /* 在栈构造之前和销毁之后,base 的值为NULL */ SElemType *top; /* 栈顶指针*/ int stacksize; /* 当前已分配的存储空间,以元素为单位*/ }SqStack; /* 顺序栈*/ (2)文件SqStackAlgo.h 中实现顺序栈的基本操作(存储结构由SqStackDef.h 定义) Status InitStack(SqStack &S) { /* 构造一个空栈S */ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); /* 存储分配失败*/ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int StackLength(SqStack S) { // 返回S 的元素个数,即栈的长度, 编写此函数

哈工大 数据结构 实验一 线性表的实验

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:数据结构与算法 课程类型:必修 实验项目名称:线性表实验 实验题目:算术表达式求值 班级:0903201 学号:1090320110 姓名:王岳

一、实验目的 二、实验要求及实验环境 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系) 1.逻辑设计 2.物理设计 四、测试结果 五、系统不足与经验体会 六、附录:源代码(带注释) #include using namespace std; template class stack{ private: elementtype ss[512]; int top; public: stack() { this -> top =0; } void null() { this -> top =0; } bool empty() { if (this -> top ==0) return true; else return false; } elementtype pop() { if (this -> empty()) printf("error:empty!!!\n");

else { this -> top--; return this -> ss[this -> top + 1]; } } void push(elementtype x) { if (this -> top == 511) printf("error:full!!!\n"); else { this -> top++; this -> ss[this -> top] = x; } } }; void change(int &i,int &j,double *a,char *input,stack &s){//change front to back char o,p; bool fu=true; while(true){ o=cin.peek(); if((o<'('||o>'9')&&o!='\n') {o=getchar();fu=false; continue;} else if(o>='0'&&o<='9') {scanf("%lf",&a[i]); input[j]=i+'0';i++;j++; } else if(o=='(') {o=getchar();s.push(o);fu=true;continue;} else if(o==')') { o=getchar(); for(;!s.empty();){ input[j]=s.pop();j++; if(input[j-1]=='(') {j--;break;} } } else if(o=='*'||o=='/'){ o=getchar(); for(;!s.empty();){ p=s.pop(); if(p=='*'||p=='/') {input[j]=p;j++;} else {s.push(p);break;} } s.push(o); } else if(o=='+'||o=='-'){ o=getchar(); if(fu) {a[i]=0;input[j]=i+'0';i++;j++;} for(;!s.empty();){ p=s.pop(); if(p!='(') {input[j]=p;j++;} else {s.push(p);break;}

数据结构实验1

《数据结构》实验报告 实验序号:1 实验项目名称:概论

附源程序清单: 1. #include void main() { int i; int num[10]; int *p; for(i=0;i<=9;i++) num[i]=i+1; for(p=(num+9);p>=(num+0);p--) printf("%d ",*p); printf("\n"); }

2. #include void main() { void swap(int *a,int *b); int i; int a[10]; int *p,*max,*min; for(i=0;i<10;i++) scanf("%d",&a[i]); max=min=a; for(i=0;i<10;i++) { if(*maxa[i]) min=&a[i]; } p=a; swap(p,max); swap((p+9),min); for(p=a;p<=(a+9);p++) printf("%d ",*p); printf("\n"); } void swap(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } 3. #include #include #include #include typedef struct { char num[5]; char name[20]; float score1; float score2; float score3; float average;

数据结构 _实验1

《数据结构》实验报告 班级:网络1311 学号:10 姓名:曾梦成绩: 实验1:指针和结构体程序设计 1.实验目的 (1)复习C(或C++)语言的基本描述方法。 (2)熟练掌握数组的用法。 (3)提高运用C(或C++)语言解决实际问题的能力。 2.实验内容 设一个班有10个学生,每个学生有学号,以及数学、物理、英语、语文、体育5门课的成绩信息。分别写3个函数以实现以下3个要求: (1)求数学的平均成绩。 (2)对于有两门以上课程不及格的学生,输出他们的学号、各门课成绩及平均成绩。 (3)输出成绩优良的学生(平均成绩在85分以上或全部成绩在80分以上)的学号、各门课成绩和平均成绩。 3.实验要求 (1)利用C(或C++)语言完成程序设计。 (2)上机调试通过实验程序。 (3)输出10个学生的学号和数学、物理、英语、语文、体育5门课的成绩,检验程序运行的正确性。 (4)总结整个程序的组成和设计思想。 (5)撰写实验报告(把输入数据及运行结果用抓图的形式粘贴到实验报告上)。 4.实验程序 #include struct STUDENT { char id[10]; int score[5]; double ave; }stu[10]; void main() { int i,j,math=0,m=0,n=0,k,Tave,num=10; double mave;

printf("成绩输入按照数学物理英语语文体育的顺序"); for(i=0;i

《数据结构》实验一 线性表及其应用

实验一线性表及其应用 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、实现提示 1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。 在此,我们利用C语言的结构体类型定义顺序表: #define MAXSIZE 1024 typedef int elemtype; /* 线性表中存放整型元素*/ typedef struct { elemtype vec[MAXSIZE]; int len; /* 顺序表的长度*/ }sequenlist; 将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。 2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。 3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下: typedef int elemtype; typedef struct node

数据结构实验一 实验报告

班级: 姓名: 学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入与删除等。 二、实验内容 定义一个包含学生信息(学号,姓名,成绩)的顺序表与链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号与成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; // 定义函数返回值类型 typedef struct

{ char num[10]; // 学号 char name[20]; // 姓名 double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK; } Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到i位置的数据域,返回给 e { LinkList p; p=L->next;

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构实验1

天津科技大学 2015—2016学年第2学期数据结构实验任务书 课程名称:数据结构实验学时: 2 实验题目:线性表的基本操作 实验环境: Visual C++ 实验目的: 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 实验提示: 学生信息的定义: typedef struct { char no[8]; //8位学号 char name[20]; //姓名 int score; //成绩 }Student; 顺序表的定义 typedef struct { Student *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqList; 链表的定义:

typedef struct LNode{ Student data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; 实验要求: (1) 程序要添加适当的注释,程序的书写要采用缩进格式。 (2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。 (3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。 (4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表根据姓名进行查找的算法和插入算法的流程图。 (5) 以班为单位实验周周五上传源程序和实验报告。顺序表的源程序保存为SqList.cpp,链表的源程序保存为LinkList.cpp,实验报告命名为:实验报告1.doc。源程序和实验报告压缩为一个文件(如果定义了头文件则一起压缩),按以下方式命名:学号姓名.rar,如07081211薛力.rar。

数据结构实验线性表基本操作

学 《数据结构》课程 实验报告 实验名称:线性表基本操作的实现实验室(中心): 学生信息: 专业班级: 指导教师: 实验完成时间: 2016

实验一线性表基本操作的实现 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容及要求 1.顺序线性表的建立、插入、删除及合并。 2.链式线性表的建立、插入、删除及连接。 三、实验设备及软件 计算机、Microsoft Visual C++ 6.0软件 四、设计方案(算法设计) ㈠采用的数据结构 本程序顺序表的数据逻辑结构为线性结构,存储结构为顺序存储;链表的数据逻辑结构依然为线性结构,存储结构为链式结构。 ㈡设计的主要思路 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度,顺序表的长度和元素由用户输入; 2.利用前面建立的顺序表,对顺序表进行插入、删除及合并操作; 3.建立一个带头结点的单链表,结点的值域为整型数据,链表的元素由用户输入;

4.对前面建立的链表进行插入、删除及连个链表的连接操作; ㈢算法描述 1、顺序表 void Init(sqlist &);//初始化顺序表 BOOL Inse(sqlist &,int,char); //在线性表中插入元素 BOOL del(sqlist&,int,char &); //在线性表中删除元素 int Loc(sqlist,char); //在线性表中定位元素 void print(sqlist); //输出顺序表 void combine( sqlist & , sqlist & , sqlist &);//两个线性表的合并 2、链表 void CreaL(LinkList &,int); //生成一个单链表 BOOL LInsert(LinkList &,int,char); //在单链表中插入一个元素 BOOL LDele(LinkList &,int,char &); //在单链表中删除一个元素 BOOL LFind_key(LinkList,char,int &); //按关键字查找一个元素 BOOL LFind_order(LinkList,char &,int); //按序号查找一个元素 void LPrint(LinkList); //显示单链表所有元素 void LUnion(LinkList &,LinkList &,LinkList &,int); //两个链表的连接 五、程序代码 1、顺序表 #include #include

数据结构实验答案(1)

重庆文理学院软件工程学院实验报告册专业:_____软件工程__ _ 班级:_____软件工程2班__ _ 学号:_____201258014054 ___ 姓名:_____周贵宇___________ 课程名称:___ 数据结构 _ 指导教师:_____胡章平__________ 2013年 06 月 25 日

步骤#define ERROR 0 #define TRUE 1 #define FALSE 0 #define ElemType int #define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/ typedef struct { ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/ int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/ }SeqList; #include "common.h" #include "seqlist.h" void px(SeqList *A,int j); void main() { SeqList *l; int p,q,r; int i; l=(SeqList*)malloc(sizeof(SeqList)); printf("请输入线性表的长度:"); scanf("%d",&r); l->last = r-1; printf("请输入线性表的各元素值:\n");

{ scanf("%d",&l->elem[i]); } px(l,i); printf("请输入要插入的值:\n"); scanf("%d",&l->elem[i]); i++; px(l,i); l->last++; for(i=0; i<=l->last; i++) { printf("%d ",l->elem[i]); } printf("\n"); } void px(SeqList *A,int j) { int i,temp,k; for(i=0;ielem[i]elem[k]) {temp=A->elem[i]; A->elem[i]=A->elem[k]; A->elem[k]=temp; }}

《数据结构》实验1

实验1: 顺序表的操作实验 一、实验名称和性质 二、实验目的 1.掌握线性表的顺序存储结构的表示和实现方法。 2.掌握顺序表基本操作的算法实现。 3.了解顺序表的应用。 三、实验内容 1.建立顺序表。 2.在顺序表上实现插入、删除和查找操作(验证性内容)。 3.删除有序顺序表中的重复元素(设计性内容)。 4.完成一个简单学生成绩管理系统的设计(应用性设计内容)。 四、实验的软硬件环境要求 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: Windows环境下的VC++6.0 五、知识准备 前期要求熟练掌握了C语言的编程规则、方法和顺序表的基本操作算法。 六、验证性实验 1.实验要求 编程实现如下功能: (1)根据输入顺序表的长度n和各个数据元素值建立一个顺序表,并输出顺序表中各元素值,观察输入的内容与输出的内容是否一致。 (2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值。 (3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值。 (4)在顺序表中查找值为e的数据元素,如果查找成功,则显示“查找成功”和该元素在顺序表中的位置,否则显示“查找失败”。 2. 实验相关原理: 线性表的顺序存储结构称为顺序表,顺序表的存储结构描述为: #define MAXLEN 30 /*线性表的最大长度*/ typedefstruct { Elemtypeelem[MAXLEN]; /*顺序表中存放元素的数组,其中elemtype为抽象数据类型,在程序

具体实现时可以用任意类型代替*/ int length; /*顺序表的长度,即元素个数*/ }Sqlist; /*顺序表的类型*/ 【核心算法提示】 1.顺序表插入操作的基本步骤:要在顺序表中的第i个数据元素之前插入一个数据元素x,首先要判断插入位置i是否合法,假设线性表的表长为n,则i的合法值范围:1≤i≤n+1,若是合法位置,就再判断顺序表是否满,如果满,则增加空间或结束操作,如果不满,则将第i个数据元素及其之后的所有数据元素都后移一个位置,此时第i个位置已经腾空,再将待插入的数据元素x插入到该位置上,最后将线性表的表长增加1。 2.顺序表删除操作的基本步骤:要删除顺序表中的第i个数据元素,首先仍然要判断i 的合法性,i 的合法范围是1≤i≤n,若是合法位置,则将第i个数据元素之后的所有数据元素都前移一个位置,最后将线性表的表长减1。 3.顺序表查找操作的基本步骤:要在顺序表中查找一个给定值为e的数据元素,则可以采用顺序查找的方法,从顺序表中第1个数据元素开始依次将数据元素值与给定值e进行比较,若相等则查找成功,函数返回该数据元素在顺序表中的位置,若顺序表中所有元素都与给定值e不相片,则查找失败,函数返回0值。 【核心算法描述】 status Sqlist_insert(Sqlist&L,inti,Elemtypex) /*在顺序表L中第i个元素前插入新元素x*/ {if (i<1||i>L.length+1) return ERROR; /*插入位置不正确则出错*/ if (L.length>=MAXLEN) return OVERFLOW; /*顺序表L中已放满元素,再做插入操作则溢出*/ for(j=L.length-1;j>=i-1;j--) L.elem[j+1]=L.elem[j];/*将第i个元素及后续元素位置向后移一位*/ L.elem[i-1]=x; /*在第i个元素位置处插入新元素x*/ L.length++; /*顺序表L的长度加1*/ return OK; } status Sqlist_delete(Sqlist&L,inti,Elemtype&e) /*在顺序表L中删除第i个元素*/ {if (i<1||i>L.length)return ERROR; /*删除位置不正确则出错*/ for(j=i;j<=L.length-1;j++) L.elem[j-1]=L.elem[j]; /*将第i+1个元素及后继元素位置向前移一位*/ L.length--; /*顺序表L的长度减1*/ return OK; } int Sqlist_search(SqlistL,Elemtype x) /* 在顺序表中查找值为x的元素,如果找到,则函数返回该元素在顺序表中的位置,否则返回0*/

相关文档
最新文档