数据结构上机实验报告

合集下载

东华大学数据结构上机实验报告

东华大学数据结构上机实验报告

东华大学信息科学与技术学院实验报告实验名称:线性表的基本操作指导教师:学生姓名:学生学号:实验日期:2012/11一、实验目的1、熟悉C或VC++语言上机环境。

2、会定义线性表的顺序存储结构和链式存储结构。

3、熟悉顺序表和单链表的一些基本操作和应用。

4、加深对线性表的理解,逐步培养解决实际问题的编程能力。

二、实验环境运行C或VC++的微机。

三、实验内容:分别使用顺序表和单链表存储结构实现以下操作:1.建立线性表L={12,13,21,24,28,31,42,77};2.在第5个元素之前插入26;3.删除第5个元素28;4.查找28。

四、实验设计思路及算法流程(一)使用顺序表实现操作:建立顺序表,完成顺序表的基本操作:初始化、插入、删除、输出、查找元素、判线性表是否为空;问题分析:利用顺序表,设计一组输入数据,能够对顺序表进行如下操作:创建一个新的顺序表,实现动态空间分配的初始化;已给定的值插入到指定位置和删除指定位置的值,形成有序顺序表;按值查找,根据给定数据元素的值,查找该元素的位置,对查找结果进行返回;实现顺序表的各个元素的输出;“初始化算法”的操作结果:构造一个空的顺序线性表,对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;“位置插入算法”的初始条件:顺序线性表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已存在,元素值为e;其操作结果:返回L 中数据元素值为e的元素位置;线性表的顺序存储结构的定义及其基本操作的参考程序(顺序表)文件一:pubuse. h 是公共使用的常量定义和系统函数调用声明。

数据结构上机实验报告

数据结构上机实验报告
{if(i%2==0) insert(lb,i/2,la.list[i]); //奇数位次元诩插入lb
else insert(lc,i/2,la.list[i]); //偶数位次元素插入lc
}
printf("\n您输入的线性表元素为:\n\n");
print(la);
printf("线性表的奇数位次的元素为:\n\n");
print(lb);
printf("线性表的偶数位次的元素为:\n\n");
print(lc);
}
void initial(sqlist &v)
{printf(" ****本程序可以实现线性表奇偶位序的元素分别输出****\n\n\n");
int i,a;
printf("请输入一个偶数作为线性表的长度:\n\n");
void initlist(sqlist &);
void print(sqlist); //输出线性表
void main()
{printf(" *****************本程序可以实现线性表的复制******************\n");
sqlist la,lb; //声明线性表
initial(la);
【程序设计细想】:
建立三个线性表la,lb,lc,对线性表la进行输入,然后利用循环结构对la中奇数位序的元素对lb进行插入操作,对偶数位序的元素对lc进行插入操作,从而得到线性表lb和lc。
【程序代码】:
#include<stdio.h>
#include<malloc.h>

数据结构集中上机实验报告

数据结构集中上机实验报告

XX大学信息与计算科学专业2008级《数据结构》集中上机设计题目:迷宫求解(非递归求解)设计时间:2010-2011学年第一学期目录一、实验内容 (2)二、需求分析 (2)三、总体设计 (2)(一)存储结构 (2)(二)流程图 (3)四、详细设计 (3)(一)基本算法解析 (3)(二)为实现算法,需要的象的数据类型 (4)(三)函数的调用关系 (5)(四)算法时间、空间复杂度 (5)五、代码 (5)六、运行结果分析 (10)(一)迷宫路径探索成功 (10)(二)迷宫路径未找到的情况 (13)(三)程序的优缺点与改进 (13)七、参考文献 (14)八、心得体会 (14)一、实验内容任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出。

二、需求分析1、可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求使用非递归算法。

2、用户可以根据自己的需求进行输入所需的迷宫,其中1表示迷宫的墙壁,0表示迷宫的通路,从而建立迷宫。

3、可以自行输入迷宫的入口和出口坐标。

4、程序执行的命令包括:(1)构造栈函数。

其中包括了构造空栈InitStack;压入新数据元素Push;栈顶元素出栈Pop。

(2)构造求迷宫路径函数。

其中定义了二维数组maze[M][N]存取迷宫数据;输出找到的通路MazePath。

(3)建立一个迷宫initmaze。

其中包括输入迷宫行数列数以及各行各列;加一圈围墙并输出迷宫。

三、总体设计(一)存储结构:首先用二维数组存储迷宫数据,迷宫数据由用户输入。

一个以链表结构作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东南西北所用代表数字,自行定义)。

1.从入口出发,顺着某一个方向进行探索,若能走通,继续往前走,否则沿原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

数据结构上机报告

数据结构上机报告

数据结构上机报告班级:通信工程1405 姓名:李笑阳学号:U201413536一.约瑟夫环1.需求分析①.约瑟夫问题的一种描述是:编号为1,2,……,n点的n个人按顺时针方向围坐一个圈,每人持有一个密码。

一开始选一个正整数作为报数上限值m,从第一个人开始从顺时针方向自1开始报数,报到m时停止。

报到m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始从新从1报数,如此下去,直达所有人出列。

②.基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各人的编号。

③.演示程序提示用户输入其总人数,然后依此输入每个人的数字,程序按照出列的顺序输出各人的编号。

测试数据:m的初始值为20;n=7,7个人的密码依次是3,1,7,2,4,8,4,首先m 的值为6(正确的出列顺序为6,1,4,7,2,3,5)2.设计概要①循环链表的结点类型定义typedef struct LNode②.创建链表模块LinkList creatList_L(int n)③.删除链表并释放空间模块void ListDelete_L(LinkList L,int key,int n)④.主函数模块(约瑟夫环的实现)Void main()3.具体代码实现#include<stdio.h>#include<malloc.h>//定义结构体typedef struct LNode{int password,num;struct LNode *next;}LNode,*LinkList;//创建链表LinkList creatList_L(int n){LinkList p,head,q;int i=1,key;head=(LinkList)malloc(sizeof(LNode));p=head;for(i=1;i<=n;i++) //进入循环赋值{scanf("%d",&key);q=p;p=(LinkList)malloc(sizeof(LNode));p->num=i;p->password=key;q->next=p;}p->next=head->next;free(head); ////现在的p节点是列表的尾节点把尾节点的下一个指向头结点//也就是形成了一个环head=p->next;return (head);}//输出并删除列表void ListDelete_L(LinkList L,int key,int n){LinkList p,s;int j=1;while(n>0){p=L;//key是人数上限M==key 现在开始循环叫数叫到M的输出//并从循环链表中删除for(j=1;j<key;j++){s=p;p=p->next;}printf("%2d %5d\n",p->num,p->password);key=p->password;//s是p的上一个节点,现在把s的下一个节点指向p的下一个s->next=p->next;L=p->next;//释放p节点free(p);//链表总数减一,一直到n==0时退出while循环n--;}}void main(){LinkList s;int n,m;printf("请输入总人数N和上限数M:");scanf("%d%d",&n,&m);printf("请输入%d个人的密码:",n);s=creatList_L(n); //调用创建列表printf("序号密码\n");ListDelete_L(s,m,n); //调用输出并删除列表}4.运行分析①.运行结果②.复杂度的分析时间复杂度为O(n2),空间复杂度为O(n)5.实验总结这个算法中的主函数只完成输入输出,其他都是通过调用完成。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。

数据结构上机实习报告

数据结构上机实习报告

上机实习报告班号:116112姓名:**学号:***********实习报告【实习一】线性表及其应用n(n>20)的阶乘【问题描述】大数运算——计算n的阶乘(n>=20)。

【基本要求】(1)数据的表示和存储:(1.1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;(1.2)试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。

(2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。

【问题分析】(1)设计数据的存储结构:介于乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。

然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或结点存储数据的若干位数值。

从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。

累积运算的特点是当前的计算结果是下次乘法运算的乘数。

实现两个数的乘法运算须考虑:(1)乘数的各位数都要与被乘数进行乘法运算;(2)乘法过程中的进位问题及其实现;(3)因每个元素或结点最多存储数据的3位数值,故当元素或结点中的数值大于999,需向前一个元素或结点进位。

综合以上几点,我采用了单链表的储存结构形式。

(2)阶乘算法的实现:1. 链表型数据乘法的具体实现描述:(1)初始算法顺序访问对每个节点上的数据乘以要乘的数后在顺序访问查看是否需要进位,大于999则向前进位,如果前面没有节点则添加新节点储存进位的数(2)改进算法将原始算法的乘操作和进位操作合在一起进行,提高程序效率.2. 数据输出算法具体实现描述从高位向低位顺序输出节点上储存的数据,注意补零,最高位的节点不补,其它节点要补。

对于最后的结果,因为我采用的是普通的单链表算法,因此我添加了一个逆置的算法。

数据结构集中上机过桥问题详细实验报告

数据结构项目集中上机实践报告姓名:学号:班级:学院:计算机科学与技术专业:计算机科学与技术指导老师:1.实验题目三件有制约关系物品过河问题(80分)有一人要将自己的兔子、蔬菜和狐狸等三件物品运过河。

但过河所用的船每次只能装其中的两件,而这三件物品之间又存在一定的制约关系:兔子不能单独和狐狸以及不能和蔬菜在一起,因为狐狸要吃兔子,兔子也能吃蔬菜。

试构造出问题模型,并编程实现这一问题的求解。

2.数据结构及其存储结构(1)选择对应的数据结构,用图来解决。

(2)选择存储结构,由于问题的规模很小,且总的状态种类很少,所以,我选择邻接矩阵作为图的存储结构。

3.算法的基本思想及分析对象:农夫farmer,狐狸fox,兔子rabbit,蔬菜vegetable。

兔子不能单独和狐狸以及不能和蔬菜在一起,因为狐狸要吃兔子,兔子也能吃蔬菜,如图:农夫兔子狐狸蔬菜算法的思想其实很简单,首先在创建结点,利用is_safe()函数将不安全的结点全部排除,再利用is_connected()函数得到每个结点的后继结点。

之后利用深度优先搜索可以找到实现这一问题的路径。

问题的分析:①每一个物体都只有两个状态,在原岸或者在对岸;②不同的状态,如农夫和羊在对岸,狼和白菜在原岸;③从一个状态安全地转到另外几个状态,如农夫自己过河或农夫带着羊过河;④不安全状态,如农夫在对岸,其他东西在原岸;⑤初始状态(都在原岸),结束状态集(都在对岸)。

建立模型:首先,采用二进制中的0/1表示每一个物体的两种状态,用一个四位的二进制数表示一种整体的状态,这样就使原来的问题变的更加易于理解,有利于我们找到合适的数据结构类型来实现问题。

根据对象的状态分为过河(1)和不过河(0),此对象集合就构成了一个状态空间。

问题关键是在这个状态空间内寻找一条从开始状态到结束状态都安全的路径。

其初始状态为四个对象都不过河(都为0),结束状态为四对象全部过河(都是1)。

从一个状态到另一个状态,这其中可以根据相互之间的制约关系,排除不安全的状态,得到安全的路径。

《数据结构》上机实验报告—常用排序算法的实现

return OK;
}
int InsertSort(Form &F)
{//对顺序表F作直接插入排序
int i,j;
int comp=0;//比较次数
int move=0;//移动次数
for(i=2;i<=F.length;i++)
{
comp++;
if(F.r[i].key<F.r[i-1].key)
{
high--;
move++;
}
F.r[low]=F.r[high];
if(low<high&&F.r[low].key<=p)
{
low++;
move++;
}
F.r[high]=F.r[low];
}
F.r[low]=F.r[0];
return low;
}
void main()
{
Form F;
Init_Form(F);
{
F.r[0]=F.r[i]; //F.r[0]是监视哨
F.r[i]=F.r[i-1];
j=i-2;
comp++;
if(F.r[0].key<F.r[j].key)
{//进行元素移动,以腾出位置插入F.r[i]
F.r[j+1]=F.r[j];// 记录后移
j--;
move++;
}
F.r[j+1]=F.r[0]; //在j+1处插入F.r[i]
2.实现快速排序算法。
3.实现折半插入排序。
4.采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。

数据结构上机实验报告

数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。

2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。

通过实验,我们将学习如何使用这两种数据结构来解决实际问题。

3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。

3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。

该算法可以判断一个字符串中的括号是否匹配。

具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。

通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。

3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。

该算法可以模拟多个任务按照一定的优先级进行调度的过程。

具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。

通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。

4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。

数据结构上机报告1

实验1(线性表):任意输入一串字符,将该字符串看成一个线性表,以链式存储结构(或者静态链表)实现这个线性表,并进行线性表的查找、插入、删除和就地逆置等操作1.需求分析意输入一串字符,将该字符串看成一个线性表,以链式存储结构(或者静态链表)实现这个线性表,并进行线性表的查找、插入、删除和就地逆置等操作2.详细设计1.主函数{输入字符串;生成线性表;调用函数,实现操作;}2.调用函数{ 查找函数;插入函数;删除函数;逆置函数;}3.调用关系图为:void main(){ list_search(); list_insert;list_delete; list_turn()}ADT List{数据对象:D={a i|a i=ElemSet,i=1,2,……,n,n≧0}数据关系:R1={<a i-1,a i>| a i-1,a i€D, i=1,2,……,n }基本操作:list_search (&l); //查找函数list_insert (&l); //插入函数list_delete (&l) ; //删除函数list_turn (&l) //就地逆置}3.用户使用说明先输入一个字符串,回车键结束,程序会自动生成一个线性链表;接着会出现操作选择界面,输入所要进行的操作:输入1进行查找操作,输入要查找元素就会输出元素位置;程序如下:#include<stdio.h>#include<stdlib.h>#include<string.h>struct node{ char data;struct node* prior;struct node* next;};void list_search(struct node* head);void list_insert(struct node* head,int lenth);void list_delete(struct node* head,int lenth);void list_turn(struct node *head);//主函数void main(){struct node head;head.data=0;head.next=NULL;head.prior=NULL;struct node* p=&head;struct node* q=&head;int i=0;char c;printf("请输入字符串:\t");scanf("%c",&c);while(c!='\n'){i++;q=(struct node*)malloc(sizeof(struct node));q->prior=p;q->next=NULL;q->data=c;p->next=q;p=q;scanf("%c",&c);}fflush(stdin);int number=i;p=&head;printf("生成的线性表为:\n");while(p->next){p=p->next;printf("%c",p->data);}int flag=1;char choose;char judge[4];while(flag){printf("\n");printf("请输入你想进行的操作:\n");printf("1---查找\t");printf("2---插入\t");printf("3---删除\t");printf("4---就地逆置\n");int flag1=1;while(flag1){scanf("%c",&choose);fflush(stdin);if(choose=='1'){list_search(&head);flag1=0;} if(choose=='2'){list_insert(&head,number);flag1=0;p=&head;printf("线性表现在变为:\n");while(p->next){p=p->next;printf("%c",p->data);}}if(choose=='3'){list_delete(&head,number);flag1=0;p=&head;printf("线性表现在变为:\n");while(p->next){p=p->next;printf("%c",p->data);}}if(choose=='4'){list_turn(&head);flag1=0;p=&head;printf("线性表现在变为:\n");while(p->next){p=p->next;printf("%c",p->data);}}}int i=number;fflush(stdin);printf("\n继续请输入yes,退出请输入no\n");gets(judge);if(strcmp(judge,"yes")) flag=0;if(strcmp(judge,"no"));}//whileprintf("谢谢使用~\n");}//main//查找函数void list_search(struct node* head){char temp;printf("请输入你要查找的元素:\n");fflush(stdin);scanf("%c",&temp);struct node* p=head;struct node* q=head;int i=0;int flag=1;while(p->next){p=p->next;i++;if(p->data==temp){printf("所查元素的位置是:\t");printf("%d\n",i);flag=0;printf("\n");}}if(flag) printf("所查元素不在线性表内!\n"); }//list_search//插入函数void list_insert(struct node* head,int number){char temp;int pos;printf("请输入你要插入的元素:\n");fflush(stdin);scanf("%c",&temp);int flag=1;while(flag){printf("请输入所插入元素的位置\n");fflush(stdin);scanf("%d",&pos);if(pos>=number||pos<=0) {printf("输入错误,请重新输入!\n");continue;} else flag=0;}struct node* p=head;struct node* q=head;int i=0;while(i<pos-1){p=p->next;i++;}q=(struct node*)malloc(sizeof(struct node));q->data=temp;p->next->prior=q;q->next=p->next;q->prior=p;p->next=q;}//list_insert//删除函数void list_delete(struct node* head,int number){int temp;int flag=1;while(flag){printf("请输入所要删除元素的位置:\n");fflush(stdin);scanf("%d",&temp);if(temp>=number||temp<=0) {printf("输入错误,请重新输入!\n");continue;} else flag=0;}struct node* p=head;struct node* q=head;while(temp){p=p->next;temp--;}q=p->prior;q->next=p->next;if(p->next)p->next->prior=q;free(p);}//list_delete//逆置函数void list_turn(struct node *head) {struct node* p=head;struct node* q=head;struct node* r=q->next;while(r){p=r;r=r->next;q=p->prior;p->prior=p->next;p->next=q;}p->prior=head;head->next->next=NULL;head->next=p;p=head;}//list_inverse set调试结果:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:*****日期:目录实验一线性表 ........................................................................................................ - 2 -一、实验目的.................................................................................................... - 2 -二、实验代码.................................................................................................... - 2 -三、实验结果.................................................................................................... - 8 -四、个人思路.................................................................................................... - 9 - 实验二栈和队列 .................................................................................................... - 9 -一、实验目的.................................................................................................... - 9 -二、实验代码.................................................................................................. - 10 -三、实验结果.................................................................................................. - 15 -四、个人思路.................................................................................................. - 16 - 实验三数组 .......................................................................................................... - 16 -一、实验目的.................................................................................................. - 16 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 18 -四、个人思路.................................................................................................. - 18 - 实验四树 .............................................................................................................. - 18 -一、实验目的.................................................................................................. - 18 -二、实验代码.................................................................................................. - 19 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。

(文件夹:习题1)代码:单链表代码://单链表逆置主文件.cpp#include<iostream.h>#include<stdio.h>#include"单链表结构类型定义.h"#include"建立单链表.h"#include"输出单链表.h"#include"单链表逆置.h"void main(){linklist*head;creat(head);print(head);invert(head);//调用单链表逆置的函数print(head);}//单链表结构类型定义.htypedef char datatype;typedef struct node{datatype data;struct node *next;}linklist;//建立单链表.hvoid creat(linklist*&head)//采用尾插法建立具有结点的单链表{char ch;linklist *s,*r;head=new linklist;r=head;while((ch=getchar())!='*'){s=new linklist;s->data=ch;r->next=s;r=s;}r->next=NULL;}//输出单链表.hvoid print(linklist *head){linklist*p=head->next;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;}//单链表逆置.hvoid invert(linklist*head){linklist*p,*q,*r;p=head->next;q=p->next;while(q!=NULL){r=q->next;q->next=p;p=q;q=r;}head->next->next=NULL;head->next=p;}单链表结果截图见下方实验结果。

顺序表代码://顺序表逆置主文件.cpp#include<iostream.h>#include<stdio.h>#include"顺序表结构类型定义.h"#include"建立顺序表.h"#include"输出顺序表.h"#include"顺序表逆置.h"void main(){sequenlist*L;creat(L);print(L);invert(L);//调用顺序表逆值的函数 print(L);}//顺序表的结构类型定义.htypedef char datatype;const int maxsize=1024;typedef struct{ datatype data[maxsize];int last;}sequenlist;//建立顺序表.hvoid creat(sequenlist*&L){L=new sequenlist;L->last=0;char ch;while((ch=getchar())!='*'){L->data[L->last]=ch;L->last++;}}//输出顺序表.hvoid print(sequenlist*L){for(int i=0;i<L->last;i++)cout<<L->data[i]<<" ";cout<<endl;}//顺序表逆置.hvoid invert(sequenlist*L){char mid;int i,j;i=0;j=L->last-1;while(i<j){mid=L->data[i];L->data[i]=L->data[j];L->data[j]=mid;i++;j--;}}顺序表实验截图见下方实验结果。

2.已知由不具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空间。

(文件夹:习题2)代码://分解单链表主程序文件.cpp#include<iostream.h>#include<stdio.h>#include"单链表结构类型定义.h"#include"建立单链表.h"#include"输出单链表.h"#include"输出循环链表.h"#include"在循环链表中插入.h"#include"分解单链表.h"void main(){ linklist *head,*letter,*digit,*other;creat(head);print1(head);letter=new linklist;letter->next=letter;digit=new linklist;digit->next=digit;other=new linklist;other->next=other;resolve(head,letter,digit,other);//调用分解单链表的函数 print2(letter);print2(digit);print2(other);}//单链表结构类型定义typedef char datatype;typedef struct node{ datatype data;struct node *next;}linklist;void creat(linklist*&head)//建立单链表{ datatype x;linklist *s,*r;head=new linklist;r=head;cin>>x;while(x!='$'){s=new linklist;s->data=x;r->next=s;r=s;cin>>x;}r->next=NULL;}void print1(linklist*head)//输出单链表{ linklist *p=head->next;while(p!=NULL){ cout<<p->data;p=p->next;}cout<<endl;}void print2(linklist*head)//输出循环链表{ linklist *p=head->next;while(p!=head){ cout<<p->data;p=p->next;}cout<<endl;}//在循环链表中插入.hvoid insert(linklist*h,linklist*p){ linklist *q=h;while(q->next!=h) q=q->next;q->next=p;p->next=h;}//分解单链表.hvoid resolve(linklist* head,linklist* letter,linklist* digit,linklist* other) {linklist* p = head->next,*t;head->next =NULL;while (p!=NULL){t = p; p=p->next;if (t->data >='0' && t->data <='9')insert(digit,t);else if ((t->data >='a' && t->data <='z') ||(t->data >='A' && t->data <='Z'))insert(letter,t);else insert(other,t);}return;}截图见下方实验结果。

相关文档
最新文档