数据结构实验报告
- 格式:pdf
- 大小:374.61 KB
- 文档页数:33
1 《数据结构》实验报告一
实验内容: 线性表链式存储结构下基本操作的实现
学号: 姓名:
一、上机实验的问题和要求(需求分析):
[ 题目 ] 线性表链式存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、
等)。
二、程序设计的基本思想,原理和算法描述:
首先基于线性链表的存储结构建一个单链表(下面的程序实现的是通过头插法逆序建表),
在此基础上实现对单链表的赋值、取值、插入、删除以及两个表的归并,需要注意的是插入
(删除)过程中指针的修改。
三、调试和运行程序过程中产生的问题及采取的措施:
1、注意scanf的格式;
2、在编写程序过程中注意链表指针的正确修改;
四、源程序及注释
[ 源程序 ] 程序名: 1.cpp
#include
#include #include
#define true 1
#define false 0
#define ok 1
#define error 0 #define overflow -2
#define initsize 100
#define increment 10
#define null 0
typedef int status; typedef int elemtype;
typedef struct lnode
{ elemtype data;
struct lnode *next;
}lnode,*linklist; void listtraverse(linklist l)
{//遍历链式表l
2 linklist p=l->next; while(p!=null)
{printf("%d\n",p->data);
p=p->next;}}
void creatlist(linklist &l,int n)
{//逆位序输入个元素的值,建立带表头节点的单链表l int i;linklist p;
l=(linklist)malloc(sizeof(lnode));
l->next=null;
for(i=n;i>0;--i)
{p=(linklist)malloc(sizeof(lnode)); p->data=i;
p->next = l->next;l->next = p;}}//creatlist
status getelem(linklist l,int i,elemtype &e)
{//取带头节点的单链表l中第i个元素,用e返回
int j;linklist p; p=l->next;j=1;
while(p&&j
p=p->next;++j;}
if(!p||j>i)return error;
e=p->data; return ok;}//getelem
status listinsert(linklist &l,int i,elemtype e){
//在带头节点的单链表l中第i个位置前插入元素e
linklist p,s;
int j=0;p=l->next; while(p&&jnext;++j;}
if(!p||j>i-1)return error;
s=(linklist)malloc(sizeof(lnode));
s->data=e;s->next=p->next;
p->next=s; return ok;
}//listinsert
void main()
{linklist l;int i,e,j,f;int n;
printf("请输入节点个数:"); scanf("%d",&n);
creatlist(l, n);
printf("建表成功!");
listtraverse(l);
printf("please input the location i:"); scanf("%d",&i);
getelem(l,i,e);
printf("the i th elem is %d\n",e);
3 printf("please input the inserted elem's num and the value: "); scanf("%d %d",&j,&f);
listinsert(l,j,f);
listtraverse( l); }
五、运行结果
如 输入结点个数 为: 5 运行结果: 1 2 3 4 5
又如 输入要查找的元素为: 3
运行结果:3
输入要插入的位置和元素值:3 8
运行结果:1 2 8 3 4 5 输入要删除元素的位置:3
运行结果:8
4 《数据结构》实验报告一
实验内容: 约瑟夫环
学号: 姓名:
一、上机实验的问题和要求(需求分析):
[ 题目 ] 设有n个人围坐一圈,现从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列,如此下去,直到所有人都出列为止。试设
计一个程序求出出列顺序。要求利用单向循环链表存储结构模拟此过程,按照出列的顺序打
印出各人的编号。
二、程序设计的基本思想,原理和算法描述:
本程序是在线性链表的基础上实现对循环链表的操作,重点考察循环链表的删除操作;
三、调试和运行程序过程中产生的问题及采取的措施:
1、注意删除元素时指针的变化;
2、注意要删除元素位置的确定;
四、源程序及注释
[ 源程序 ] 程序名: 2.cpp #include
#include
#include
#define ok 1
#define error -1 #define truth 0
typedef int status;
typedef struct Lnode
{ int data ;
struct Lnode *next; }Lnode,*Linklist;
void creatlist_L(Linklist &L,int n)
{ int i;Lnode *p;
L=(Linklist)malloc(sizeof(Lnode));
L->next=L; L->data=1;
for(i=n;i>1;--i)
{ p=(Linklist)malloc(sizeof(Lnode));
p->data=i;
5 p->next=L->next; L->next=p;
}
}
status printf_L(Linklist L)
{ Linklist p=L;int i; int n=8;
for(i=1;i<=n;i++)
{printf(" %d",p->data);
p=p->next;
} printf("\n");
return ok ;
}
void main ()
{ int i,k,n; Lnode * s;
Lnode *L;
printf("the whole number is: ");
scanf ("%d",&n);
creatlist_L(L,n); printf("the number list is:");
printf_L(L);
printf("请输入要删除元素的位置:");
scanf("%d",&k);
s=L; while(s->next!=s)
{
for(i=1;i
s=s->next;
printf("%d\n",s->next->data); s->next=s->next->next;
s=s->next;
}
printf("%d",s->data);
}
五、运行结果
输入环中元素的个数为: 8
运行结果:1 2 3 4 5 6 7 8
删除元素的位置为:3
运行结果为: 3 6 1 5 2 8 4 7
6 《数据结构》实验报告二
实验内容: 栈的基本操作
学号: 姓名:
一、上机实验的问题和要求(需求分析):
[ 题目 ] 栈的基本操作的实现(初始化、赋值、取值、插入、删除等),要求分别采用顺序和链式存储结构。
二、程序设计的基本思想,原理和算法描述:
在栈的顺序存储结构的基础上实现栈的初始化(即建栈),自此基础上实现其相关操作,包
括赋值、取栈顶元素、进栈、出栈等,重点考察栈的“先进后出”的特性
三、调试和运行程序过程中产生的问题及采取的措施:
(略)
四、源程序及注释
[ 源程序 ] 程序名: 3.cpp #include
#include #include
#define stack_int_size 8
#define stackincrement 10
#define overflow -2
#define error 0 #define ok 1
typedef int status;
typedef int selemtype;
typedef struct
{ selemtype * base; selemtype * top;
int stacksize;
}sqstack;
status initstack(sqstack &s)
{//构造一个空栈s s.base=(selemtype *)malloc(stack_int_size * sizeof(selemtype));
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=stack_int_size;