数据结构实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
Status InitList_Sq(SqList&L){
//构造一个空的线性表
L.elem=(ElemType * )malloc(LIST_INIT_SIZE*sizeof(ElemType));
fflush(stdin);
char e=getchar();
OrderListInsert_L(L,e,compare);
}
return OK;
}//GreateList_L
Status ListTraverse(LinkList L,Status(*visit)(ElemType e)){
for(LNode *p=L->next;p!=L;p=p->next)
1)创建任意整数线性表(即线性表的元素值随机在键盘上输入),长度限定在25之内;
2)打印(遍历)该线性表(依次打印出表中元素值);
3)在线性表中查找第i个元素,并返回其值;
4)在线性表中第i个元素之前插入一已知元素;
5)在线性表中删除第i个元素;
6)求线性表中所有元素值(整数)之和;
2、链表(带头结点)基本操作实验
if((i<1)||(i>L.length)) return ERROR;//删除位置不合法
ElemType *p=&(L.elem[i-1]);// p为被删除元素的位置
e=*p;//被删除元素的值赋给e
ElemType *q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)
while(p!=L&&j<i){p=p->next;j++;}//顺指针向后查找,直到p指向第i个元素或p为空
if(!newbase)exit(OVERFLOW);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMEMT;//增加存储容量
}
ElemType *q=&(L.elem[i-1]);//指示插入位置
for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p)
if(!visit(p->data)) return ERROR;
return OK;
}
Status GetElem(LinkList L,int i,ElemType &e){//L是带头结点的链表的头指针,以e返回第i个元素
LNode *p=L->next; int j=1;//初始化,p指向第一个结点,j为计数器
*(p+1)=*p;//插入位置及之后的元素右移
*q=e;//插入e
++L.length;//表长加1
return OK;
}//ListInsert_Sq
intListDelete_Sq(SqList &L,int i,ElemType &e){
//在顺序线性表L中删除第i个元素,并用返回其值。i的合法值为1<=i<=ListLength(L)
浙师大数理与信息工程学院
学生实验报告
课程名称数据结构与算法
专 业
姓 名
学 号
班 级
教 师
成 绩
实验一线性表的实现-3
实验二栈和队列的应用-14
实验三二叉树的建立与遍历-20
实验四图的建立与遍历-25
实验一线性表的实现
一、实验目的
1)掌握线性表的顺序存储结构和链式存储结构;
2)熟练掌握顺序表和链表基本算法的实现;
return OK;
}//OrderListInser_L
Status CreateList_L(LinkList &L,int n){
//if(n<=o) {printf("bad number\n"); return ERROR;
//printf("\nplease input %d\n");
for(int i=n;i>0;--i){
*(p-1)=*p;//被删除元素之后的元素左移
--L.length;//表长减1
return e;
}//ListDelete_Sq
intListSum(SqListL){
int s=0;
for(ElemType i=0;i<L.length;i++)
s=s+L.elem[i];
return s;
}
if(!L.elem)exit(OVERFLOW); //存储分配失败
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
return OK;//初始化成功
}//InitList_Sq
Status creatlist(SqList &L,int len){//通过键盘随机输入创建一个线性表(长度小于80)
printf("Please input %d int numbers:\n", len);
for(int i=0;i<len;i++)
{
fflush(stdin);
scanf("%d", L.elem+i);
}
L.length=len;
return OK;
}
Status ListTraver(SqList L){
typedef int Status;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode ,*LinkList;
Status InitList_L(LinkList &L){//构建一个空的单循环的链表
L=(LinkList)malloc(sizeo百度文库(LNode));//L指向空链表
typedef int Status;
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMEMT 10 //线性表存储空间的分配增量
typedef struct{
ElemType * elem; //存储空间基址
int length;//当前长度
printf("the numbers:\n");
for(int i=0;i<L.length;i++)
printf("%d\t",L.elem[i]);
return OK;
}
Status GetElem(SqList L,int i,ElemType &e)
{
if(i>0&&i<=L.length)
3)掌握利用线性表数据结构解决实际问题的方法和基本技巧;
4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果);
二、实验内容
1、顺序表的基本操作实现实验
要求:数据元素类型ElemType取整型int。按照顺序存储结构实现如下算法(各算法边界条件和返回结果适当给出):
if(!L) exit(OVERFLOW);
L->next=L;//构建循环链表表示:尾节点指针域指向头结点
return OK;
}//InitLinklist
int compare(ElemType a,ElemType b){
if(a>b) return 1;
if(a==b) return 0;
if(a<b) return -1;}
e=L.elem[i-1];
printf("The value of %dth elment is %d\n",i, e);
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e){
//在顺序表L的第i个元素之前插入新的元素e,。i的合法范围为1≤i≤L.length+1
//int *q,*p;
if(i<1||i>L.length+1) return ERROR;//i插入位置不合法
if(L.length>=L.listsize){//当前存储空间已满,增加分配
ElemType * newbase=(ElemType *)realloc(L.elem,
(L.listsize+LISTINCREMEMT)*sizeof(ElemType));
void main()
{
SqList L ;
InitList_Sq(L);
int len;
printf("Please input the length of the List:\n");
fflush(stdin);
scanf("%d",&len);
creatlist(L,len);
ListTraver(L);
#include<string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#include<stdlib.h>
typedef char ElemType;
Status visit(ElemType e)
{
printf("%c\t",e);
printf("\n");
return OK;
}
Status OrderListInsert_L(LinkList &L,ElemType e,
Status((*compare)(ElemType a,ElemType b))){//按递增顺序插入e
int pos;
ElemType e=0;
printf("Please input the position i to be searched:\n");
fflush(stdin);
scanf("%d", &pos);
GetElem(L,pos,e);
printf("The value of %dth elment is %d\n",pos, e);
ListTraver(L);
printf("Please input the position i to be inserted:\n");
fflush(stdin);
scanf("%d", &pos);
printf("Please input the value e to be inserted:\n");
4)在链表中查找与一已知字符相同的第一个结点,有则返回TRUE,否则,返回FALSE;
5)在链表中按照有序方式插入一已知字符元素;
6)在线性表中删除第i个结点;
7)计算链表的长度。
8) 将链表逆序。(选作)
三、实验原理
顺序表和链表的基本操作的实现算法。
四、实验方法与步骤
首先定义顺序表和链表的存储结构,根据基本操作的算法,实现各个基本操作的函数,并在主函数中调用这些操作进行验证。
ListDelete_Sq(L, pos, e);
printf("the value deleted is %d \n", e);
ListTraver(L);
int s=ListSum(L);
printf("sum: %d\n",s);
}
2.链表:
#include<stdlib.h>
#include<stdio.h>
五、程序代码:
1.线性表:
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#include<stdlib.h>
#include<stdio.h>
typedef int ElemType;
LNode *p=L;
while(p->next!=L&&compare(p->next->data,e)<0)
p=p->next;
LNode *s=(LinkList)malloc(sizeof(LNode));//给新元素分配节点
s->data=e;
s->next=p->next;
p->next=s;
fflush(stdin);
scanf("%d", &e);
ListInsert_Sq(L, pos, e);
ListTraver(L);
printf("Please input the position i to be deleted:\n");
fflush(stdin);
scanf("%d", &pos);
要求:数据元素类型ElemType取字符型char。按照动态单循环链表结构实现如下算法(各算法边界条件适当给出):
1)创建任意字符型有序(递增排序)单循环链表(即链表的字符元素随机在键盘上输入),长度限定在15之内;
2)打印(遍历)该链表(依次打印出表中元素值);
3)在链表中查找第i个元素,i合法返回元素值,否则,返回FALSE;
相关文档
最新文档