当前位置:文档之家› 西电数据结构大作业

西电数据结构大作业

题目:数据结构上机报告学院:电子工程学院专业:信息对抗技术学生姓名:***学号:***********西安电子科技大学数据结构课程实验报告实验名称线性表电子工程学院 1402031 班Array姓名甘佳霖学号 14020310092同作者实验日期 2017 年 3 月 18 日实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验要求1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。

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

三、设计思路1.顺序表做逆置操作时将对应的首尾元素位置交换,单链表的指针end指向链表的末尾,指针start指向链表头结点,指针s用来找到指向end节点的节点,将指向链表末尾和头结点的存储内容交换,然后头结点指针指向下一节点,s指针从start节点开始遍历寻找指向end 指针的节点,并将end指针赋值为s指针,就完成了单链表的逆置,可以看出单链表和顺序表都可以完成线性表的逆置。

2.分解单链表的实现思路是首先新建3个循环链表,然后顺序遍历单链表,ASCII码判断链表中的元素属于哪一类元素,然后将这个元素添加到对应的循环链表中,从而实现分解单链表的功能。

四、运行结果1.单链表逆置:顺序表逆置:2.分解单链表五、实验总结线性表和单链表是最简单的、最常用的数据结构类型,是实现其他数据结构的基础,熟悉对它们的操作有助于后面对数据结构课程的学习和理解。

附录:单链表逆置代码如下://单链表逆置主文件.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--;}}西安电子科技大学数据结构课程实验报告实验名称栈和队列电子工程学院 1402031 班Array姓名甘佳霖学号 14020310092同作者实验日期 2017 年 4 月 11 日实验二栈和队列一、实验目的1.熟悉栈和队列的顺序和链式存储结构2.掌握栈和队列的基本运算3.能够利用栈和队列的基本运算完成栈和队列应用的运算二、实验要求1.假设以数组sequ[m]存放循环队列的元素,同时设变量rear和quelen分别指示循环队列中队尾元素的位置和内含元素的个数。

编写实现该循环队列的入队和出队操作的算法。

提示:队空的条件:sq->quelen==0;队满的条件:sq->quelen==m。

2.设单链表中存放有n个字符,试编写算法,判断该字符串是否有中心对称的关系,例如xyzzyx是中心对称的字符串。

(提示:将单链表中的一半字符先依次进栈,然后依次出栈与单链表中的另一半字符进行比较。

)三、设计思路1.队列是一个先进先出的线性表,入队时,先判断队列是否已满,如果不满将元素插入到队尾,然后判断rear是否指向sequ[m],如果是,指向队尾指针rear+1,否者rear=sequ[0],队列内元素个数quelen+1。

出队时头指针front后移一位,如果front=sequ[m],front指向sequ[0],否则front++,quelen-1,从而实现入队与出队的操作。

2.要判断字符串是否中心对称,首先获取栈的长度N,将前N/2个元素(N为偶数)或前(N-1)/2个元素(N为奇数)顺序压入栈中,然后依次出栈(先进后出),与另一半元素依次对应比较,全为真则可判断字符串中心对称。

四、运行结果1.循环队列入队出队2.判断字符串中心对称五、实验总结通过这次实验,我掌握了栈和队列的基本原理,了解了对于栈和队列的操作,让我对栈和队列的知识有了更多的了解。

附录:1.循环队列入队出队代码//循环队列入队出队的主程序文件.cpp#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include"循环队列的结构类型定义.h"#include"置空队.h"#include"入队.h"#include"出队.h"void main(){ qu *sq;datatype x, *p;int key;sq=new qu;setnull(sq);do{ cout<<"1.Enter Queue 2.Delete Queue -1.Quit:";cin>>key;switch(key){ case 1: cout<<"Enter the Data:"; cin>>x;enqueue(sq,x);break;case 2: p=dequeue(sq);if(p!=NULL) cout<<*p<<endl;break;case -1: exit(0);}}while(1);}//出队.hdatatype *dequeue(qu *sq){datatype *temp;if(sq->quelen==0){printf("队列为空,请先进行入队操作\n");return 0;}else{temp=(datatype*)malloc(sizeof(datatype)); sq->quelen--;*temp=sq->sequ[(sq->rear-sq->quelen+m)%m];cout<<"出队成功!\n";return (temp);}}//入队.hvoidenqueue(qu *sq, datatype x){if(sq->quelen==m)printf("队列已满,请先进行出队操作\n");else {sq->quelen++;sq->rear=(sq->rear+1)%m;sq->sequ[sq->rear]=x;cout<<"入队成功!\n";}}//循环队列的结构类型定义.hconstint m=5;typedefint datatype;typedefstruct{ datatypesequ[m];int rear, quelen;}qu;//置空队.hvoidsetnull(qu *sq){ sq->rear=m-1;sq->quelen=0;}2.判断字符串中心对称代码//判字符串中心对称的主程序文件.cpp#include<iostream.h>#include"单链表顺序栈结构类型定义.h"#include"置栈空.h"#include"求单链表长度.h"#include"输出单链表.h"#include"建立单链表.h"#include"顺序栈入栈.h"#include"顺序栈出栈.h"#include"判字符串是否中心对称.h"void main(){linklist *head;stack *s;datatypestr[80];cin>>str;creat(head,str);printlink(head);setnull(s);if(symmetry(head,s)) cout<<"字符串\""<<str<<"\"中心对称\n";else cout<<"字符串\""<<str<<"\"不是中心对称\n";}//定义单链表结构类型.htypedef char datatype;typedefstruct node{ datatype data;struct node *next;}linklist;//定义顺序栈结构类型constintmaxsize=40;typedefstruct{ datatype elements[maxsize];int top;}stack;//建立具有头结点的单链表.hvoidcreat(linklist *&head,datatype*str) { datatype *p=str;linklist *s,*r;head=new linklist;r=head;while(*p!='\0'){s=new linklist;s->data=*p;r->next=s;r=s;p++;}r->next=NULL;}//判断字符是否中心对称.hint symmetry(linklist*head,stack*s){int n=length(head)/2;linklist*p=head->next;datatype x;for(inti=0;i<n;i++){push(s,p->data);p=p->next;}if(length(head)%2==1)p=p->next;while(p!=NULL){x=pop(s);if(x==p->data)p=p->next;else return 0;}return 1;}//求单链表长度.hint length(linklist*head){ linklist *p=head->next;int n=0;while(p!=NULL){ n++; p=p->next; } return n;}//输出单链表.hvoidprintlink(linklist*head){ linklist *p=head->next;while(p!=NULL){ cout<<p->data;p=p->next;}cout<<endl;}//顺序栈出栈.hdatatype pop(stack*s){datatype temp;s->top--;temp=s->elements[s->top+1];return temp;}//顺序栈入栈.hvoid push(stack*s,datatype e){s->top++;s->elements[s->top]=e;}//置栈空.hvoidsetnull(stack *&s){s=new stack;s->top=-1;}西安电子科技大学数据结构课程实验报告实验名称数组电子工程学院 1402031 班Array姓名甘佳霖学号 14020310092同作者实验日期 2017 年 5 月 6 日实验三数组一、实验目的1.熟悉数组的结构2.掌握矩阵的进行运算二、实验要求若在矩阵A m×n中存在一个元素A[i-1[j-1],其满足A[i-1[j-1]是第i行元素中最小值,且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。

相关主题