当前位置:文档之家› 数据结构-顺序表-实验报告

数据结构-顺序表-实验报告

数据结构-顺序表-实验报告
数据结构-顺序表-实验报告

实验报告

实验一顺序表的建立和基本运算

一、实验目的

1、掌握顺序表存储结构的定义及C/C++语言实现

2、掌握顺序表的各种基本操作及C/C++语言实现

3、设计并实现有序表的遍历、插入、删除等常规算法

二、实验环境

PC微机,Windows,DOS,Turbo C或Visual C++

三、实验内容

1、顺序表的建立和基本运算

(1)问题描述

顺序表经常进行的运算包括:创建顺序表、销毁顺序表、求顺序表的长度、在顺序表中查找某个数据元素、在某个位置插入一个新数据元素、在顺序表中删除某个数据元素等操作。试编程实现顺序表的这些基本运算。

(2)基本要求

实现顺序表的每个运算要求用一个函数实现。

(3)算法描述

参见教材算法2.3、算法2.4、算法2.5等顺序表的常规算法。

(4)算法实现

#include // malloc()等

#include // NULL, printf()等

#include // exit()

// 函数结果状态代码

#define OVERFLOW -2

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等

typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE

//-------- 线性表的动态分配顺序存储结构-----------

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

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

typedef int ElemType;

struct SqList

{

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

int length; // 当前长度

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

};

void InitList(SqList &L) // 算法2.3

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

L.elem=new ElemType[LIST_INIT_SIZE];

if(!L.elem)

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

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

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

}

void DestroyList(SqList &L)

{ // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L

delete []L.elem;

L.elem=NULL;

L.length=0;

L.listsize=0;

}

void ClearList(SqList &L)

{ // 初始条件:顺序线性表L已存在。操作结果:将L重置为空表

L.length=0;

}

Status ListEmpty(SqList L)

{ // 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE if(L.length==0)

return TRUE;

else

return FALSE;

}

int ListLength(SqList L)

{ // 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数

return L.length;

}

Status GetElem(SqList L,int i,ElemType &e)

{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。操作结果:用e返回L中第i个数据元素的值

if(i<1||i>L.length)

return ERROR;

e=*(L.elem+i-1);

return OK;

}

//int LocateElem(SqList L,int e,Status(*compare)(int,int))

int LocateElem(SqList L,ElemType e, Status(*compare)(ElemType,ElemType))

{//初始条件:顺序线性表L已存在,compare( )是数据元素判定函数(满足为1,否则为0) // 操作结果:返回L中第1个与e满足关系compare( )的数据元素的位序。

// 若这样的数据元素不存在,则返回值为0。算法2.6

ElemType *p;

int i=1; // i的初值为第1个元素的位序

p=L.elem; // p的初值为第1个元素的存储位置

while(i<=L.length&&!compare(*p++,e))

++i;

if(i<=L.length)

return i;

else

return 0;

}

Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)

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

// 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,

// 否则操作失败,pre_e无定义

int i=2;

ElemType *p=L.elem+1;

while(i<=L.length&&*p!=cur_e){

p++;

i++;

}

if(i>L.length)

return INFEASIBLE; // 操作失败

else{

pre_e=*--p;

return OK;

}

}

Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)

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

// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,// 否则操作失败,next_e无定义

int i=1;

ElemType *p=L.elem;

while(i

i++;

p++;

}

if(i==L.length)

return INFEASIBLE; // 操作失败

else{

next_e=*++p;

return OK;

}

}

Status ListInsert(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){ // 当前存储空间已满,增加分配

if(!(newbase=(int *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(int)))) exit(OVERFLOW); // 存储分配失败

L.elem=newbase; // 新基址

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

}

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(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;

}

void ListTraverse(SqList L,void(*vi)(ElemType&))

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

// 操作结果:依次对L的每个数据元素调用函数vi()

// vi()的形参加'&',表明可通过调用vi()改变元素的值

ElemType *p;

int i;

p=L.elem;

for(i=1;i<=L.length;i++)

vi(*p++);

printf("\n");

}

Status sq(ElemType c1,ElemType c2)

{ // 数据元素判定函数(平方关系),LocateElem()调用的函数

if(c1==c2*c2)

return TRUE;

else

return FALSE;

}

void dbl(ElemType &c)

{ // ListTraverse()调用的另一函数(元素值加倍)

c*=2;

}

Status equal(ElemType c1,ElemType c2)

{ // 判断是否相等的函数

if(c1==c2)

return TRUE;

else

return FALSE;

}

void print1(ElemType &c)

{

printf("%d ",c);

}

void main()

{

SqList L;

int e,e0;

Status i;

int j,k;

InitList(L);

printf("初始化L后:L.elem=%u L.length=%d L.listsize=%d\n",L.elem,L.length,L.listsize);

for(j=1;j<=5;j++)

i=ListInsert(L,1,j);

printf("在L的表头依次插入1~5后:*L.elem=");

for(j=1;j<=5;j++)

printf("%d ",*(L.elem+j-1));

printf("\n");

printf("L.elem=%u L.length=%d L.listsize=%d ",L.elem,L.length,L.listsize);

i=ListEmpty(L);

printf("L是否空:i=%d(1:是0:否)\n",i);

ClearList(L);

printf("清空L后:L.elem=%u L.length=%d L.listsize=%d ",L.elem,L.length,L.listsize);

i=ListEmpty(L);

printf("L是否空:i=%d(1:是0:否)\n",i);

for(j=1;j<=10;j++)

ListInsert(L,j,j);

printf("在L的表尾依次插入1~10后:*L.elem=");

for(j=1;j<=10;j++)

printf("%d ",*(L.elem+j-1));

printf("\n");

printf("L.elem=%u L.length=%d L.listsize=%d\n",L.elem,L.length,L.listsize);

ListInsert(L,1,0);

printf("在L的表头插入0后:*L.elem=");

for(j=1;j<=ListLength(L);j++) // ListLength(L)为元素个数

printf("%d ",*(L.elem+j-1));

printf("\n");

printf("L.elem=%u(有可能改变) L.length=%d(改变) L.listsize=%d(改变)\n",L.elem,L.length,L.listsize);

GetElem(L,5,e);

printf("第5个元素的值为:%d\n",e);

for(j=10;j<=11;j++){

k=LocateElem(L,j,equal);

if(k) // k不为0,表明有符合条件的元素,且其位序为k

printf("第%d个元素的值为%d\n",k,j);

else

printf("没有值为%d的元素\n",j);

}

for(j=3;j<=4;j++){

k=LocateElem(L,j,sq);

if(k) // k不为0,表明有符合条件的元素,且其位序为k

printf("第%d个元素的值为%d的平方\n",k,j);

else

printf("没有值为%d的平方的元素\n",j);

}

for(j=1;j<=2;j++){// 测试头两个数据

GetElem(L,j,e0); // 把第j个数据赋给e0

i=PriorElem(L,e0,e); // 求e0的前驱

if(i==INFEASIBLE)

printf("元素%d无前驱\n",e0);

else

printf("元素%d的前驱为:%d\n",e0,e);

}

for(j=ListLength(L)-1;j<=ListLength(L);j++){ // 最后两个数据

GetElem(L,j,e0); // 把第j个数据赋给e0

i=NextElem(L,e0,e); // 求e0的后继

if(i==INFEASIBLE)

printf("元素%d无后继\n",e0);

else

printf("元素%d的后继为:%d\n",e0,e);

}

k=ListLength(L); // k为表长

for(j=k+1;j>=k;j--) {

i=ListDelete(L,j,e); // 删除第j个数据

if(i==ERROR)

printf("删除第%d个元素失败\n",j);

else

printf("删除第%d个元素成功,其值为:%d\n",j,e);

}

printf("依次输出L的元素:");

ListTraverse(L,print1); // 依次对元素调用print1(),输出元素的值

printf("L的元素值加倍后:");

ListTraverse(L,dbl); // 依次对元素调用dbl(),元素值乘2

ListTraverse(L,print1);

DestroyList(L);

printf("销毁L后:L.elem=%u L.length=%d L.listsize=%d\n",L.elem,L.length,L.listsize);

}

(5)运行截图

2、顺序表的就地逆转

(1)问题描述

顺序表的就地逆转是指在顺序表现有空间的基础上,将顺序表中的数据元素交换位置排列,排列完之后,新的顺序序列与原来的顺序序列刚好相反。如原来顺序序列“abcdef”,就地逆转之后的新顺序序列为“fedcba”。

(2)基本要求

充分理解题目的要求,在对顺序表实现逆转时,必须是在顺序表原有空间的基础上进行,不能带借助临时变量所申请的临时空间,也不能借助其他形式的临时空间。

(3)基本思想

建立空顺序表--> 建立空顺序表--> 顺序表就地逆转

利用循序表自身未利用空间作中转变量空间

(4)程序代码

#include

#include

#define SIZE 100 // 定义顺序表存储空间初始长度

#define ASIZE 10 // 定义顺序表扩展存储空间单位长度void GetemppyL(); // 建立空顺序表

int GetL(); // 建立顺序表

void ChangeL(int a); // 顺序表就地逆转

typedef struct // 定义顺序表

{

int *dz;

int length;

int listsize;

}List;

List L; // 顺序表L

int main()

{

int a;

GetemppyL();

a = GetL();

ChangeL(a);

return 0;

}//+*

void GetemppyL() // 建立空顺序表

{

L.dz = (int*)malloc(SIZE*sizeof(int));

printf("创建空表\n");

if(!L.dz)

{

exit(-1);

}

else

{

printf("成功\n");

}

L.length = 0;

L.listsize = SIZE;

}

int GetL() // 建立顺序表

{

int i,a,b;

printf("创建顺序表\n");

printf("请输入顺序表元素个数:");

scanf("%d",&a);

printf("请输入顺序表元素:");

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

{

scanf("%d",&(L.dz[i]));

}

printf("创建成功,顺序表为:");

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

{

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

}

printf("\n");

return a;

}

void ChangeL(int a) // 顺序表就地逆转{

int i;

L.dz[a] = 0;

printf("逆转顺序表\n");

for(i = 0;i < a/2;i++)

{

L.dz[a] = L.dz[i];

L.dz[i] = L.dz[a - i - 1];

L.dz[a - i - 1] = L.dz[a];

}

printf("逆转成功,逆转后为:");

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

{

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

}

}

(3)运行截图

四、实验总结

顺序表。。。。

感觉不是很难,比较容易理解。

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 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始终指向生成的单链表的最后一个节点

数据结构顺序表真题

第二章复习题 本章重点掌握:线性结构特点,顺序存储结构和链式存储结构特点。 1.在顺序表中插入或删除一个元素,需要平均移动( 一半 )元素,具体移动的元素个数与( 插入或删除的位置 )有关。插入时平均 次数(n/2 ),删除时平均次数((n-1)/2 )。 2.有一个含头结点的循环链表,头指针为 head, 则其为空的条件是:( C ) A)head==NULL B)head->next==NULL C)head->next==head 3.在长度为 n 的顺序表的第 i 个位置上插入一个元素(1≤i≤n+1),元素的移动次数为:( A ) A) n – i + 1 B) n – i C) i D) i – 1 4.对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为( C ) A)顺序表B) 用头指针表示的循环单链表 C) 用尾指针表示的循环单链表D) 单链表 5.设单链表中结点的结构为(data, link)。已知指针 q 所指结点是指针 p 所指结点的直接前驱,若在*q 与*p 之间插入结点*s,则应执行下列哪一个操作?( B ) A)s->link = p->link;p->link = s;(B) q->link = s;s->link = p; (C) p->link = s->link;s->link = p;(D) p->link = s;s->link = q; 6.设单链表中结点的结构为(data, link)。已知指针 p 所指结点不是尾结点,若在*p 之后插入结点*s,则应执行下列哪一个操作?(B)

A)s->link = p;p->link = s;(B) s->link = p->link;p->link = s; (C) s->link = p->link;p = s;(D) p->link = s;s->link = p; 7.设单链表中结点的结构为(data, link)。若想摘除结点*p 的直接后继,则应执行下列哪一个操作?(A) (A) p->link = p->link->link; (B) p = p->link;p->link = p->link->link; (C) p->link = p->link;(D) p = p->link->link; 8.设单循环链表中结点的结构为(data, link),且 rear 是指向非空的 带表头结点的单循环链表的尾结点的指针。若想删除链表第一个结点,则应执行下列哪一个操作?(D) (A)s = rear;rear = rear->link;delete s; (B)rear = rear->link;delete rear; (C)rear = rear->link->link;delete rear; (D)s = rear->link->link;rear->link->link = s->link; delete s; (rear 指向尾结点,rear->link->link 指向第一个结点,第一个结点变为原来的第二个结点) 9.设双向循环链表中结点的结构为(data, lLink, rLink),且不带表头 结点。若想在指针 p 所指结点之后插入指针 s 所指结点,则应执 行下列哪一个操作?( D )

数据结构顺序表的查找插入与删除

一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include #include /*顺序表的定义:*/ #include #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; void main() { SeqList L; int i,x; int n=10; /*欲建立的顺序表长度*/ L.length=0; void CreateList(SeqList *L,int n); void PrintList(SeqList L,int n); int LocateList(SeqList L,DataType x); void InsertList(SeqList *L,DataType x,int i); void DeleteList(SeqList *L,int i); CreateList(&L,n); /*建立顺序表*/ PrintList(L,n); /*打印顺序表*/ printf("输入要查找的值:"); scanf("%d",&x); i=LocateList(L,x); /*顺序表查找*/ printf("输入要插入的位置:"); scanf("%d",&i); printf("输入要插入的元素:"); scanf("%d",&x); InsertList(&L,x,i); /*顺序表插入*/

数据结构_实验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;

数据结构实现顺序表的各种基本运算(20210215233821)

实现顺序表的各种基本运算 一、实验目的 了解顺序表的结构特点及有关概念,掌握顺序表的各种基本操作算法思想及其实现。 二、实验内容 编写一个程序,实现顺序表的各种基本运算: 1、初始化顺序表; 2 、顺序表的插入; 3、顺序表的输出; 4 、求顺序表的长度 5 、判断顺序表是否为空; 6 、输出顺序表的第i位置的个元素; 7 、在顺序表中查找一个给定元素在表中的位置; 8、顺序表的删除; 9 、释放顺序表 三、算法思想与算法描述简图

主函数main

四、实验步骤与算法实现 #in clude #in clude #defi ne MaxSize 50 typedef char ElemType; typedef struct {ElemType data[MaxSize]; in t le ngth; void In itList(SqList*&L)〃 初始化顺序表 L {L=(SqList*)malloc(sizeof(SqList)); L->le ngth=0; for(i=0;ile ngth;i++) prin tf("%c ",L->data[i]); } void DestroyList(SqList*&L)〃 {free(L); } int ListEmpty(SqList*L)〃 {retur n( L->le ngth==O); } int Listle ngth(SqList*L)〃 {return(L->le ngth); } void DispList(SqList*L)〃 {int i; 释放顺序表 L

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

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验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++;

数据结构实验2.1顺序表

附页(实验2-1代码): 头文件“DEFINE2-1.h”: #define MaxSize 10 typedef struct { char data[MaxSize]; int length; }SqList; #include #include #include"DEFINE2-1.h" void InitList(SqList * &L) //初始化线性表 { L = (SqList*)malloc(sizeof(SqList)); //分配存放线性表的空间L->length = 0; //置空线性表长度为0 } bool ListInsert(SqList *&L, int i, char e) //插入数据元素 { int j; if (i<1 || i>L->length + 1) return false; //参数错误是返回false I--; //将顺序表逻辑序号转换为物理序号for (j = L->length; j>i; j--) //将data[i]及后面元素后移一个位置L->data[j] = L->data[j - 1]; L->data[i] = e; //插入元素e L->length++; //顺序表长度+1 return true; //成功插入返回true } void DispList(SqList *L) //输出线性表L { int i; for (i = 0; ilength; i++) //扫描顺序表输出各元素值printf("%3c", L->data[i]); printf("\n\n"); } int ListLength(SqList *L) //求线性表L的长度 { return (L->length); }

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

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:数据结构与算法 课程类型:必修 实验项目名称:线性表实验 实验题目:算术表达式求值 班级: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. 实验题目:顺序表的操作 2.实验目的和要求: 1)了解顺 序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、 删除、查找以及线性表合并 )。 2)通过在 Turbo C ( WinTc ,或 visual stdio6 )实现以上操作的 C 语言 代码。 3)提前了解实验相关的知识(尤其是 C 语 言)。 3.实验内容:(二选一) 1) 顺序表的插入算法, 删除算法, 顺序表的合并算法 2) 与线性表应用相关的实例( 自己选择具体实例) 4.部分参考实验代码: ⑴ 顺序表结构的定义: #include #define MAXLEN 255 typedef int ElemType; typedef struct { ElemType elem[MAXLEN]; int length; }sqList; ⑵ 顺序表前插(在第i 号元素前插入一个新的元素) int ListInsert(sqList *la,int i,int x) { int j; if(i<0||i>la-> length +1) { printf( “ n the value of i is wrong! ” ); return 0; } if(la-> length +1>=MAXLEN) { printf( “ n overflow! ” ); return 0; }

. for(j=la-> length;j>=i;j--) la->list[j+1]=la->list[j]; la->list[i]=x; la-> length ++; return 1; } ⑶ 顺序表删除 int ListDelete(sqList *la,int i) { if(i<0||i>la-> length ) { printf( “ return 0; n”); } for(i;i length;i++) la->list[i-1]=la->list[i]; la-> length --; return 1; } 5.附录:实验预备知识: ⑴ 复习 C 语言中数组的用法。 ⑵ 了解线性表和顺序表的概念,顺序表的定义方法; 线性表是n 个数据元素的有限序列,至于每个数据元素的具体含义,在不同的情况下各不相同。 顺序表是线性表的顺序存储表示,是用一组地址连续的存储单元依次存储线性表的数据元素。 在 C 语言中,顺序表是用数组来实现的。 ⑶ 掌握线性表在顺序存储结构上实现基本操作:查找、插入、删除和 合并的算法。 在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容: 在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出未查到提 示)。 在实现插入的时候,首先要判断该顺序表是否为满,如为满则报错 (此时要注意:顺序表是用数组来实现的,它不能随机分配空 间);如不为满,则需判断要插入的位置是否合法(例如:如果 一个线性表的元素只有10 个,而要在第0 个元素前插入或在第 11 个元素后插入就为不合法)。其次要注意是前插还是后插,两

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

实验报告:线性表的基本操作 实验1:实现顺序表各种基本运算的算法 一、实验目的 学会并运用顺序表存储结构及各种运算。 二、实验环境 VC++6.0 三、实验准备 (1) 复习课件中理论知识 (2)练习课堂所讲的例子 四、实验内容 编写一个程序实现SqList.cpp,实现顺序表基本运算,并在此基础上设计个主程序exp1.cpp,完成如下功能: (1)初始化顺序表L; (2)依次插入a、b、c、d、e元素; (3)输出顺序表L; (4)输出顺序表L长度; (5)判断顺序表L是否为空: (6)输出顺序表L的第3个元素; (7)输出元素a的位置; (8)在第4个位置上插入f元素; (9)输出顺序表L; (10)删除顺序表L的第3 个元素; (11)输出顺序表L; (12)顺序表L; 五、实验步骤 1、构造一个空的线形表并分配内存空间 Status InitList_Sql(SqList &L) {L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=LIST_INIT_SIZE; return OK; } 2、求线性表的长度 Status ListLength(SqList L) { return L.length; } 3、线性表清空 void ClearList(SqList &L){ L.length = 0; } 4、在顺序线形表 L 中第 i 个位置之前插入新的元素 e Status ListInsert_Sq(SqList &L,int i,ElemType e)

数据结构实验一 实验报告

班级::学号: 实验一线性表的基本操作 一、实验目的 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;

顺序表的应用数据结构实验报告记录

顺序表的应用数据结构实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

大学数据结构实验报告 课程名称数据结构实验第(三)次实验实验名称顺序表的应用 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期2018年9月30日一、实验目的 1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 (2)逐个显示学生表中所有学生的相关信息 (3)根据姓名进行查找,返回此学生的学号和成绩 (4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩) (5)给定一个学生信息,插入到表中指定的位置 (6)删除指定位置的学生记录 (7)统计表中学生个数 四、实验设计 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 for(count=0; count

数据结构顺序表(电话通讯录)

数据结构用顺序表实现的电话通讯录(C语言) #include #include #include #include #define FALSE 0 #define ERROR 0 #define OK 1 #define INFEASIBLE -1 #define LIST_INIT_SIZE 10 #define LIST_INCREMENT 5 #define N 5 typedefint Status; typedefstruct { char name[10]; //姓名 char num[15]; //号码 }student; typedefstruct { student *elem; //存储空间基址 int length; //当前长度 intlistsize; //当前分配的存储空间(以sizeof(student)为单位) }Sqlist; Sqlist L; //定义全局变量L 为Sqllist类型 Status ListInsert(Sqlist&L,inti,student e) { //插入学生信息到顺序表L中 int j; student *newbase; if(i<1||i>L.length+1) return ERROR; //i值不合法 if(L.length>=L.listsize) //当前存储空间已满,增加分配 { newbase=(student *)realloc(L.elem,(LIST_INIT_SIZE+LIST_INCREMENT)*(sizeof(student))); if(!newbase) //存储分配失败 exit(OVERFLOW); L.elem=newbase; //新基址 L.listsize+=LIST_INCREMENT; //增加存储容量 } for(j=L.length;j>=i;j--) L.elem[j]=L.elem[j-1]; //插入位置及之后元素的右移 L.elem[i-1]=e; L.length++; return OK;

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

实验一线性表及其应用 一、实验目的 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.以线性表的各种操作的实现为重点; 3.通过本次学习帮助学生加深C语言的使用,掌握算法分析方法并对已经设计 出的算法进行分析,给出相应的结果。 二、实验要求: 编写实验程序,上机运行本程序,保存程序的运行结果,结合程序进行分析并写出实验报告。 三、实验容及分析: 1.顺序表的建立 建立一个含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 程序如下: 头文件SqList.h的容如下: #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int ElemType; typedef int Status; typedef struct{ ElemType *elem; int length; int listsize; }SqList; Status InitList_Sq(SqList *L) { L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L->elem) return(OVERFLOW); L->length=0; L->listsize=LIST_INIT_SIZE; return OK; } Status CreatList_Sq(SqList *L,int n) { int i; printf("输入%d个整数:\n",n); for(i=0;ielem[i]); return OK; } //以下是整个源程序: #include #include"SqList.h" int main() { int i,n; SqList a; SqList *l = &a; if(InitList_Sq(l)==-2) printf("分配失败"); printf("\n输入要建立的线性表l的长度n:");//输入线性表得长度scanf("%d",&n); l->length=n; printf("线性表的长度是:%d\n",l->length); CreatList_Sq(l,n);//生成线性表 printf("输出线性表l中的元素值:");//输出线性表中的元素 for(i=0;ilength;i++) printf("%7d",l->elem[i]); getchar(); } 程序的运行结果:

数据结构实验指导书——线性表的操作

实验1 线性表的基本操作 一、实验目的 (1) 掌握线性表的逻辑特征; (2) 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算; (3) 熟练掌握线性表的链式存储结构定义及基本操作; (4) 理解循环链表和双链表的特点和基本运算; (5 )加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力; 二、实验内容 1、创建有若干个元素(可以是整型数值)的顺序表,实现对顺序表的初始化,对已建立的顺序表插入操作、删除操作、遍历输出顺序表。 要求各个操作均以函数的形式实现,在主函数中调用各个函数实现以下操作: (1)从键盘上依次输入21、18、30、75、42、56,创建顺序表,并输出顺序表中的各元素值。 (2)分别在单链表的第3个位置插入67,给出插入成功或失败的信息,并输出此时顺序表中的各元素值。 (3)删除顺序表中的第6个数据元素,给出删除成功或失败的信息,并输出此时顺序表中的各元素值。 (4)查找顺序表中是否有75这个元素,如果有返回该元素在顺序表中的位序。 2、创建有若干个元素(可以是整型数值)的单链表,实现对单链表的初始化,对已建立的顺序表插入操作、删除操作、查找操作、遍历输出单链表表。 要求各个操作均以函数的形式实现,在主函数中调用各个函数实现以下操作: (1)从键盘上依次输入21、18、30、75、42、56,创建单链表,并输出单链表中的各元素值。 (2)分别在单链表的第4个位置,给出插入成功或失败的信息,并输出单链表中的各元素值。

(3)删除单链表中的第2个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。 (4)查找顺序表中的第五个元素并输出该元素的值。 三、参考代码 (1) 顺序表的操作 #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define INIT_SIZE 100 /*初始分配空间的大小*/ #define LISTINCREMENT 10 /*分配增量*/ typedef int ElemType; typedef struct{ ElemType *elem; int length; int listsize; }SqList; /*ElemType elem[INIT_SIZE],注两者区别。存储空间的起始地址。*/ /*线性表中数据元素个数,即表长*/ /*线性表所申请的存储空间的大小*/ SqList CreateList_Sq(SqList L) /*创建一个空的线性表*/ { L.elem=(ElemType *)malloc(INIT_SIZE*sizeof(ElemType)); if (!L.elem) exit(ERROR); L.length=0; /*表长为0*/ L.listsize=INIT_SIZE; /*申请的空间为初始大小*/ return L; }

数据结构实验一 实验报告

班级: 姓名: 学号: 实验一线性表的基本操作 一、实验目的 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;

数据结构实验-顺序表的基本操作

******************************* 实验题目:顺序表的基本操作 实验者信息:班级13007102,姓名庞文正,学号1300710226实验完成的时间3:00 ****************************** 一、实验目的 实验内容阿尔 (1)掌握顺序表的基本运算,熟悉对顺序表的一些基本操作和具体函数的定义。 (2)掌握顺序存储的概念,学会定义线性表的顺序存储类型。 (3)熟悉c语言程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互关系及各自的作用。(4)熟悉c语言环境的使用及程序的输入、编辑、调试和运行的全过程。 加深对顺序存储结构的理解,逐步培养解决实际问题的编程能力。 二、实验内容 实现顺序表上的插入、删除等操作。调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对有关算法的理解。 三、算法设计与编码

1.本实验用到的理论知识 本次实验用到结构体的定义,函数定义, 具体函数的定义有: 1)insert(L,i,x)在顺序表的第i个元素之前插入一个新元素x. 2)delete (L,i) 删除顺序表的第i个元素。 3)listprint(L) 输出顺序表。 2.算法概要设计 给出实验的数据结构描述,程序模块、功能及调用关系 第一步:定义顺序表的存储结构。 第二步:编写顺序表操作的具体函数定义。 第三步:使用定义的顺序表并调用顺序表的一些操作,实现具体运算。 四、运行与测试 (1)运行成功的代码: #include"stdio.h" //包含输出输入文件 #define MAXSIZE 100 //宏定义 #define OK 1 #define OVERFLOW -2 typedef int elemtype; typedef struct //定义顺序表的结构 {

相关主题
文本预览
相关文档 最新文档