《计算机软件技术基础》 实验报告I—数据结构
计算机软件技术基础实验报告
计算机软件技术基础实验报告自动化0901班郝万福学号:20092395实验1:线性表的排序与查找目的:掌握数据结构的基本概念、线性表的基本操作以及查找和排序方法的设计。
内容:键盘输入一组无序数据,添加到线性表中;排序线性表并输出排序结果;键盘输入一个数,并插入到排好序的线性表中(要求插入后的表仍为有序表),输出结果;键盘输入一个数,并从线性表中删除相应的数据,输出结果。
要求:程序清单;运行过程及运行结果。
实验代码:/*班级:自动化 0901 班姓名:郝万福学号:20092395编译环境: Visual Studio 2011Windows 7 x86-64 旗舰版*/#include"stdafx.h"#include"iostream"#include<conio.h>// 程序实现有各种方法,这里给出一个实例。
// 定义一个线性表const int nMaxSize = 15; // 最大值int nLen = 0; // 表中元素个数int nLinearList[nMaxSize];// 定义操作void LSort();void LOut();void LInsert(int n);void LDelete(int n);int main(){// 输入数据并放入线性表中printf("Please input data\n"); // std::cout << "Please input data\n";int nIn = 0;for (int i = 0; i <= 9; i++){scanf("%d",&nIn); // std::cin >> nIn;nLinearList[i] = nIn;nLen++;}LSort(); // 排序线性表LOut(); // 输出结果printf("Please input a data to insert \n");scanf("%d",&nIn);LInsert(nIn); // 输入一个数字,并插入到线性表中LOut();printf("Please input a data to delete \n");scanf("%d",&nIn);LDelete(nIn); // 输入一个数字,并从线性表中删除LOut();char chTmp;printf("Please input a char to finish this program.");chTmp = getch();return 0;}void LSort() // 冒泡排序,由大到小{for(int j=0;j<=10;j++){for (int i=0;i<11-j;i++)if (nLinearList[i]<nLinearList[i+1]){int temp=nLinearList[i];nLinearList[i]=nLinearList[i+1];nLinearList[i+1]=temp;}}}void LOut(){printf( "\n");for (int i = 0; i < nLen; i++){printf( "%d, ", nLinearList[i] );}printf( "\n");}void LInsert(int n){ nLen++;nLinearList[nLen] = n;for(int k=0;k<=nLen;k++){for (int l=0;l<nLen+1-k;l++)if (nLinearList[l]<nLinearList[l+1]) {int temp=nLinearList[l];nLinearList[l]=nLinearList[l+1]; nLinearList[l+1]=temp;}}}void LDelete(int n){int b=1;for(int k=0;k<=nLen;k++){if(n==nLinearList[k]) {b=0;}if(b==0){nLinearList[k]=nLinearList[k+1];}}nLen--;}实验结果:实验2:栈与队列的应用目的:掌握栈与队列的基本概念、基本操作及设计与应用。
计算机软件技术基础实验报告
}linklist;
体 linklist *creat()
{
实
int i;
linklist *head,*r,*q;
验
q=(linklist *)malloc(LEN);
head=q;
内
r=q;
q->next=NULL;
容
printf("Please input the number:\n");
scanf("%d",&i);
计算机软件技术基础实验报告
《计算机软件技术基础》实验报告
专 业 _____________ 年 级 _____________ 学 号 _____________ 学生姓名 _____________ 指导老师 _____________
南华大学计算机学院编
1 / 29
计算机软件技术基础实验报告
I 实验要求
while(p!=0)
{
printf("%d\n",p->data);
p=p->next;
}
}
void deletelist(int i,linklist *head)
{
linklist *p,*q;
int k=1;
p=head;
q=p->next;
3 / 29
计算机软件技术基础实验报告
while((q!=NULL)&&(i!=k)) {
实验一 线性表
【实验目的】
1.熟悉 VC 环境,学习如何使用 C 语言实现线性表的两种存储结构。 2.通过编程、上机调试,进一步理解线性表的基本概念,熟练运用 C 语言实现线性表基本操作。 3.熟练掌握线性表的综合应用问题。
计算机软件技术基础上机实验报告
return h;
}
pushls(slnode *h,int x)/*把数据元素插入栈中*/
{slnode *p;
p=(slnode *)malloc(sizeof(slnode));
p->data=x;
p->next=h->next;
h->next=p;
j++;}
if(j!=i-1)
{printf("i is invalid!");return 0;}
else
{if(p->next==null)
{ printf("i is invalid!");
return 0;}
else
{ s=p->next;
p->next=s->next;
free(s);
return h;}
{p=h->next;
h->next=p->next;
ch=p->data;
printf("%5d",ch);}
printf("\n");
}
三、队
3.1顺序队
实验内容:队的顺序存储结构的定义、创建、插入和删除,
将数据元素显示出来。
源程序
#include<stdio.h>
#define max 10
typedef struct
/*在第i个结点处插入数据元素x*/
{slnode *p,*s;
int j;p=h;j=0;
while(p->next!=null&&j<i-1)
《数据结构》实验报告
《数据结构》实验报告实验一一、实验目的及要求理解线性表的顺序存储结构;熟练掌握顺序表结构及其有关算法的设计;理解线性表的链式存储结构;熟练掌握动态链表结构及其有关算法的设计;根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法;深入了解栈和队列的特性,以便在实际问题背景下灵活运用他们;同时巩固对这两种结构的构造方法的理解。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以顺序表作存储结构,实现线性表的插入、删除;2.以单链表作存储结构,实现有序表的合并;3.利用栈(以顺序栈作存储结构)实现进制转换,并用队列(以链队列作存储结构)计算并打印杨辉三角。
四、源程序清单五、实验结果六、总结实验二一、实验目的及要求掌握二叉树的动态存储结构--二叉链表,掌握二叉树的三种遍历方法,会运用三种遍历的方法求解有关问题。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以二叉链表作存储结构,建立一棵二叉树;2.输出其先序、中序、后序遍历序列;3.求出它的深度;4.统计其叶子结点数四、源程序清单五、实验结果六、总结实验三一、实验目的及要求掌握图的存储结构及其建立算法,熟练掌握图的两种遍历算法及其应用。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以邻接矩阵法作存储结构,建立一个无向图;2.输出该图的深度优先搜索序列;3.输出该图的广度优先搜索序列;4. 设计算法求出该图的连通分量个数及边的数目。
四、源程序清单五、实验结果六、总结实验四一、实验目的及要求掌握顺序表的查找方法,尤其是折半查找方法。
掌握二叉排序树的查找算法。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.建立一个顺序表,用顺序查找的方法对其实施查找;2.建立一个有序表,用折半查找的方法对其实施查找;3.建立一个二叉排序树,根据给定值对其实施查找;4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。
计算机软件技术基础实验报告
学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:实验二栈和队列的基本操作一、实验目的1.掌握栈与队列的数据类型描述及特点;2.掌握栈和队列的存储;3.掌握栈的顺序和链式存储存表示与入栈、出栈操作的程序实现;4. 掌握队列的链式存储表示与入队、出队基本操作算法实现。
二、实验用软件和工具实验软件 VC++ 6.0三、实验步骤1.根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等),定义一个顺序栈和链栈结构体(队列结构体)。
2.利用入栈功能保存数据。
3.利用出栈删除弹出栈内信息。
4.根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等),利用入队功能保存数据。
5.利用出队删除队列信息。
四、实验程序与程序运行结果顺序栈程序:sxz.h#include <iostream>using namespace std;template <class T>class sq_Stack{private:int mm;int top;T *s;public:sq_Stack(int);void prt_sq_Stack();void ins_sq_Stack(T x);T del_sq_Stack();T read_sq_Stack();学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:};template <class T>sq_Stack<T>::sq_Stack(int m){mm=m;s = new T[mm];top=0;return;}template <class T>void sq_Stack<T>::prt_sq_Stack(){int i;cout<<"top="<<top<<endl;for (i=top;i>0;i--) cout<<s[i-1]<<endl;return;}template <class T>void sq_Stack<T>::ins_sq_Stack(T x){if (top==mm){cout<<"overflow!"<<endl; return;}//存储空间已满,上溢错误top=top+1; //s[top-1]=x; //插入新元素return;}template<class T>T sq_Stack<T>::del_sq_Stack(){T y;if(top==0) //空,下溢错误{cout<<"underflow!"<<endl; return(0);}y=s[top-1]; //top=top-1; //长度减1return(y);}template<class T>T sq_Stack<T>::read_sq_Stack(){if(top==0) //空,下溢错误{cout<<"underflow!"<<endl; return(0);}return(s[top-1]);学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:}sxz.cpp#include "sq_Stack.h"int main(){sq_Stack<int> s(10);s.ins_sq_Stack(50);s.ins_sq_Stack(60);s.ins_sq_Stack(70);s.ins_sq_Stack(80);s.ins_sq_Stack(90);s.ins_sq_Stack(100);cout<<"第1次输出栈顶指针与栈中的元素:"<<endl;s.prt_sq_Stack();cout<<"输出栈顶元素:"<<s.read_sq_Stack()<<endl;cout<<"输出退栈的元素:"<<endl;cout<<s.del_sq_Stack()<<endl;cout<<s.del_sq_Stack()<<endl;cout<<s.del_sq_Stack()<<endl;cout<<"再输出栈顶指针与栈中的元素:"<<endl;s.prt_sq_Stack();return 0;}顺序队列程序:sq_Queue.h#include <iostream>using namespace std;template <class T>class sq_Queue{private:int mm;int front;int rear;int s;T *q;public:sq_Queue(int) ;void prt_sq_Queue();void ins_sq_Queue(T x);T del_sq_Queue();};template <class T>sq_Queue<T>::sq_Queue(int m){mm=m;q = new T[mm];front=mm;学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:rear=mm;s=0;return;}template <class T>void sq_Queue<T>::prt_sq_Queue(){int i;cout<<"front="<<front<<endl;cout<<"rear="<<rear<<endl;if ((s==0)&&(rear==front)){cout<<"队列空!"<<endl; return;}i=front;if (front>=mm)front=i%mm ;for (i=front; i<rear;i++){ cout<<q[i]<<endl;}return;}template <class T>void sq_Queue<T>::ins_sq_Queue(T x){if ((s==1)&&(rear==front)){cout<<"Queue_overflow!"<<endl; return;}//存储空间已满,上溢错误rear=rear+1; //if (rear==mm+1)rear=1;q[rear-1]=x; //插入新元素s=1;return;}template <class T>T sq_Queue<T>::del_sq_Queue(){T y;if (s=0){cout<<"Queue_underflow!"<<endl; return(0);}//存储空间已满,上溢错误front=front+1; //if (front==mm+1)front=1;y=q[front-1]; //插入新元素if (rear==front)s=0;return(y);}sq_Queue.cpp学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:#include "sq_Queue.h"int main(){sq_Queue<int> q(10);q.prt_sq_Queue();q.ins_sq_Queue(50);q.ins_sq_Queue(60);q.ins_sq_Queue(70);q.ins_sq_Queue(80);q.ins_sq_Queue(90);q.ins_sq_Queue(100);cout<<"输出队头与队尾指针及队列中的元素:"<<endl;q.prt_sq_Queue();cout<<"输出退队元素:"<<endl;cout<<q.del_sq_Queue()<<endl;cout<<q.del_sq_Queue()<<endl;cout<<q.del_sq_Queue()<<endl;cout<<"再输出队头与队尾指针及队列中的元素:"<<endl;q.prt_sq_Queue();return 0;}链栈:#include <iostream.h>#include <stdio.h>#include <stdlib.h>typedef char DateType;typedef struct node{DateType data;struct node* next;}LinkStack;LinkStack *top;void InitStack(){top=(LinkStack*)malloc(sizeof(LinkStack));top->next=NULL;top->data=0;cout<<"初始化链栈成功!";}void push(DateType x){LinkStack* s;s=(LinkStack*)malloc(sizeof(LinkStack));s->data=x;s->next=top;top=s;cout<<"入栈成功!";}学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:void pop(){LinkStack* s;s=top;if(s->next==NULL){cout<<"栈为空!";}else{top=s->next;free(s);cout<<"出栈成功";}}void readTop(){if(top==NULL){cout<<"栈为空!";}else{cout<<"栈顶元素为:"<<top->data;}}void showStack(){LinkStack* s;s=top;if(s->next==NULL){cout<<"栈为空!";}else{cout<<"链栈元素为:\n";cout<<"\t\t\t";while(s!=NULL){cout<<" "<<s->data;s=s->next;}}}void main(){int i,j;DateType x;while(j)学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:{cout<<"\n\n\n\n";cout<<"****************************************************************"<<endl; cout<<"*** 菜单:***"<<endl;cout<<"*** ①创建链栈②入栈③读栈顶元***"<<endl;cout<<"*** ④出栈⑤显示链栈元素⑥退出***"<<endl;cout<<"****************************************************************"<<endl; cout<<"请选择您所希望的操作:";cin>>i;if(i==1){InitStack();}else if(i==2){if(top==NULL){cout<<"请先初始化链表!";}else{cout<<"请输入要入栈的元素:";cin>>x;push(x);}}else if(i==3){pop();}else if(i==4){readTop();}else if(i==5){showStack();}else if(i==6){j=0;cout<<"程序结束\n";}}}链队列:#include <stdlib.h>#include<iostream.h>#define TRUE 1#define FALSE 0学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:typedef int QElemType;typedef struct LNode{QElemType data;struct LNode *next;}LNode , *LinkList;typedef struct{LinkList front;LinkList rear;}LinkQueue;//链式队列void InitQueue_L(LinkQueue &Q)//引用做参数,Q为结构体{//初始化队列Q.front=Q.rear=new LNode;if(!Q.front) {cout<<"存储分配失败!"<<endl; exit(1);}Q.front->next=NULL;}int IsEmpty(LinkQueue &Q){if(Q.front==Q.rear){return TRUE;}else{return FALSE;}}//创建队列,数据元素由键盘输入void CreateQueue_L(LinkQueue &Q){QElemType temp;LNode *p;cout<<"输入要插入的队列值(输入-1结束)"<<endl;cin>>temp;while(temp != -1){p=new LNode;p->data=temp;p->next=NULL;Q.rear->next=p;学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:Q.rear=p;cin>>temp;}cout<<"创建成功!"<<endl;}//入队操作int EnterQueue(LinkQueue &Q,QElemType x){//将数据元素x插入到队列Q中LNode *NewNode=new LNode;if(!NewNode) {cout<<"存储分配失败!"<<endl; exit(1);}if(NewNode!=NULL){NewNode->data=x;NewNode->next=NULL;Q.rear->next=NewNode;Q.rear=NewNode;cout<<"入队成功!"<<endl<<endl;return(TRUE);}else return(FALSE); //溢出}//出队操作int DeleteQueue(LinkQueue &Q,QElemType &x){//将队列Q的队头元素出队,并存放到x所指的存储空间中LNode *p;/*if(Q.front==Q.rear){cout<<"该队列为空!"<<endl;return(FALSE);}*/p=Q.front->next;x=p->data;Q.front->next=p->next; //队头元素p出队if(Q.rear==p) //如果队中只有一个元素p,则p出队后成为空队Q.rear=Q.front;free(p); //释放存储空间cout<<"出队成功!"<<endl<<endl;return(TRUE);}//队列长度int QueueLength_L(LinkQueue Q){int length=0;if(IsEmpty(Q)) cout<<"该队列为空!"<<endl;else学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:{LNode *p=new LNode;p=Q.front->next;while(p){length++;p=p->next;}}return length;}//输出队列元素void OutputQueue_L(LinkQueue Q){LNode *p=new LNode;if(!p) {cout<<"存储分配失败!"<<endl; exit(1);}if(Q.front==Q.rear) cout<<"该队列为空!"<<endl;else{p=Q.front->next;cout<<endl;cout<<"队列的元素依次为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl<<endl;}}QElemType SearchQueue(LinkQueue &Q,int &i){LNode *p=new LNode;if(!p) {cout<<"存储分配失败!"<<endl; exit(1);}//if(Q.front==Q.rear) cout<<"该队列为空!"<<endl;int j=1;p=Q.front->next;while(p&&j<i){j++;p=p->next;}return p->data;}学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩://销毁队列void DestroyQueue_L(LinkQueue &Q){while(Q.front){Q.rear=Q.front->next;delete Q.front;Q.front=Q.rear;}}void main(){int flag=1,select;LinkQueue Q;int x;while(flag){cout<<" ☆☆链式队列基本操作☆☆"<<endl;cout<<" ☆1.创建队列☆"<<endl;cout<<" ☆2.判断链队列是否为空☆"<<endl;cout<<" ☆3.队头元素出队☆"<<endl;cout<<" ☆4.新元素入队☆"<<endl;cout<<" ☆5.求队列长度☆"<<endl;cout<<" ☆6.输出队列元素☆"<<endl;cout<<" ☆7.查找第i个位置元素☆"<<endl;cout<<" ☆8.销毁队列☆"<<endl;cout<<" ☆9.其他键退出☆"<<endl;cout<<endl;cout<<"请选择操作:";cin>>select;switch(select){case 1:InitQueue_L(Q);CreateQueue_L(Q);OutputQueue_L(Q);break;case 2:if(IsEmpty(Q)) cout<<"该队列为空!"<<endl;else cout<<"该队列不为空!"<<endl;break;case 3:if(IsEmpty(Q)) {cout<<"队列为空!"<<endl; break;}学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:DeleteQueue(Q,x);OutputQueue_L(Q);break;case 4:if(IsEmpty(Q)) {cout<<"队列还未创建!"<<endl; break;}cout<<"输入要入队的元素x:";cin>>x;EnterQueue(Q,x);OutputQueue_L(Q);break;case 5:if(IsEmpty(Q)) {cout<<"队列还未创建!"<<endl; break;}cout<<"该链队列的长度为:"<<QueueLength_L(Q)<<endl<<endl;break;case 8:if(IsEmpty(Q)) {cout<<"队列还未创建!"<<endl; break;}DestroyQueue_L(Q);cout<<"销毁成功!"<<endl<<endl;break;case 7:cout<<"请输入要查找的位置i:";cin>>x;if(x<1||x>QueueLength_L(Q)) {cout<<"i值不合法!"<<endl; break;}cout<<"该元素为:"<<SearchQueue(Q,x)<<endl<<endl;break;case 6:OutputQueue_L(Q);break;default:flag=0;break;}}}试验运行结果如图:栈:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:队列:链栈:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:链队列:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:五、实验心得与体会通过本次上机实验,我掌握了栈的顺序和链式存储存表示与入栈、出栈操作的程序实现,以及队列的链式存储表示与入队、出队基本操作算法实现。
数据结构实训实验报告
一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
数据结构 实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
操作系统为 Windows 10。
三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。
对链表进行排序,如冒泡排序或插入排序。
2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。
利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。
3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。
进行二叉树的插入、删除节点操作。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先遍历和广度优先遍历。
四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。
南京航空航天大学软件技术基础数据结构上机实验报告
南京航空航天大学计算机软件技术基础实践实验报告课程名称:计算机软件技术基础专题:数据结构上机实践姓名:xxx学号:xxx学院:自动化学院专业:自动化班级:xxx2013年10月目录(程序和流程图)实验一------------------------------------4第一种算法---------------------------4第二种算法---------------------------7实验二------------------------------------9线性表------------------------------9单链表------------------------------11顺序栈------------------------------14链栈---------------------------------15链列---------------------------------18实验三------------------------------------20二叉树----------------------------20实验四------------------------------------22顺序查找------------------------22二分查找------------------------24插入排序------------------------26选择排序------------------------28冒泡排序------------------------30大作业------------------------------------32通讯录---------------------------32一、实验一实验对象:顺序表。
实验目的:实现两个顺序表的合并。
实验要求:将共同拥有的元素只存其一。
思路清晰,编程正确,并将数据元素显示出来。
数据结构实验实训总结报告
一、实验背景随着计算机技术的飞速发展,数据结构作为计算机科学的重要基础,已经成为现代软件开发和数据处理的关键技术。
为了提高学生的数据结构应用能力,我们学校开设了数据结构实验实训课程。
本课程旨在通过实验实训,使学生深入理解数据结构的基本概念、性质、应用,掌握各种数据结构的实现方法,提高编程能力和解决实际问题的能力。
二、实验内容本次数据结构实验实训主要包括以下内容:1. 数据结构的基本概念和性质通过实验,使学生掌握线性表、栈、队列、串、树、图等基本数据结构的概念、性质和应用场景。
2. 数据结构的存储结构通过实验,使学生熟悉线性表、栈、队列、串、树、图等数据结构的顺序存储和链式存储方法,了解不同存储结构的优缺点。
3. 数据结构的操作算法通过实验,使学生掌握线性表、栈、队列、串、树、图等数据结构的插入、删除、查找、遍历等基本操作算法。
4. 数据结构的实际应用通过实验,使学生了解数据结构在各个领域的应用,如网络数据结构、数据库数据结构、人工智能数据结构等。
三、实验过程1. 实验准备在实验开始前,教师首先对实验内容进行讲解,使学生了解实验目的、实验步骤和实验要求。
同时,教师要求学生预习实验内容,熟悉相关理论知识。
2. 实验实施(1)线性表:通过实现线性表的顺序存储和链式存储,实现插入、删除、查找等操作。
(2)栈和队列:通过实现栈和队列的顺序存储和链式存储,实现入栈、出栈、入队、出队等操作。
(3)串:通过实现串的顺序存储和链式存储,实现串的插入、删除、查找等操作。
(4)树:通过实现二叉树、二叉搜索树、平衡二叉树等,实现树的插入、删除、查找、遍历等操作。
(5)图:通过实现图的邻接矩阵和邻接表存储,实现图的插入、删除、查找、遍历等操作。
3. 实验总结实验结束后,教师组织学生进行实验总结,总结实验过程中的收获和不足,提出改进措施。
四、实验成果通过本次数据结构实验实训,学生取得了以下成果:1. 掌握了数据结构的基本概念、性质和应用场景。
计算机软件技术报告
实验一线性表的基本操作一、实验目的与基本要求1.掌握数据结构中的一些基本概念。
数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。
2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。
3.掌握线性表的基本操作:插入、删除、查找以及线性表的合并等运算。
4.掌握运用C语言上机调试线性表的基本方法。
二、实验条件1.硬件:一台微机2.软件:操作系统和C语言系统三、实验方法确定存储结构后,上机调试实现线性表的基本运算。
四、实验内容1.试编写在无头结点的单链表上实现线性表基本运算LOCATE(L,X),INSERT(L,X,1)和DELETE(L,1)的算法。
2.假设有两个按数据元素值递增有序排列的线性表A和B,均以单链表作为存储结构。
编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表)结点空间存放表C。
3.将一个线性表中的值就地逆置。
4.在线性表的顺序存储结构的第一个位置上插入一个元素。
(注意区分链表和顺序表)五、实验提示编写一个可运行的程序,建立链表与顺序表,并由用户输入递增有序排列的链表A、链表B、顺序表的内容。
最好有一定的容错功能和友好的界面。
实现实验内容的各项操作并输出操作后的表的内容。
选做:链表的排序,以实现输入非有序表也可进行内容2的要求。
六遇到的问题及解决方法1 指针的用法,由于C语言学习的时间已经是两年前的事了,有一些基本的用法用起来显得很生涩。
解决办法:重新复习C语言指针部分,参考教材(《C语言程序设计》-谭浩强)和现学教材。
2 线性表的删除运算,不知道具体的编写流程。
解决办法:参考现学教材,通过与同学之间的沟通解决了这个问题。
六、代码/*ElemType替换为需要的变量名*/#include<stdio.h>typedef int ElemTypetypedef struct node{ElemType data;struct node *next;}SLink;/**********初始化线性表**********/void InitList(SLink *sq){sq=(SLink *)malloc(sizeof(SLink));sq->next=NULL;}/**********求线性表长度运算**********/int GetLength(SLink *sq){int i=0;SLink *p=sq->next;while(p!=NULL){i++;p=p->next;}return i;}/**********求线性表中第i个元素运算**********/SLink *GetElem(SLink *sq,int i){int j=1;SLink *p=sq->next;if(i<i|| i>GetLength(sq))return NULL;while(j<i){p=p->next;j++;}return p;}/**********按值查找运算**********/SLink *Locate(SLink *sq,ElemType x,int i) {SLink *p=sq->next;if(i<1||i>GetLength(sq))return NULL;while(p!=NULL&&p->data!=x)p=p->next;return p;}/**********插入结点运算**********/int InsElem(SLink *sq,ElemType x,int i) {int j=1;SLink *p=sq,*s;s=(SLink *)malloc(sizeof(SLink));s->data=x;s->next=NULL;if(i<1||i>GetLength(sq)+1)return 0;while(j<i){p=p->next;j++;}s->next=p->next;p->next=s;return 1;}/**********删除结点运算**********/int DelElem(SLink *sq,int i){int j=1;SLink *p=sq,*q;if(i<1||i>GetLength(sq))return 0;while(j<i){p=p->next;j++;}q=p->next;p->next=q->next;free(q);return 1;}/**********输出元素值运算**********/void DispList(SLink *sq){SLink *p=sq->next;while(p!=NULL){printf("%d\n",p->data);p=p->next;}return;}/*ha和hb市带头结点非递减有序单链表表头指针,合并为一个非递增有序单链表。
计算机软件技术基础实验报告
实验一线性表的基本操作一、实验目的与基本要求1.掌握数据结构中的一些基本概念。
数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。
2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。
3.掌握线性表的基本操作:插入、删除、查找以及线性表的合并等运算。
4.掌握运用C 语言上机调试线性表的基本方法。
二、实验条件1.硬件:一台微机2.软件:操作系统和C 语言系统三、实验方法确定存储结构后,上机调试实现线性表的基本运算。
四、实验内容1.试编写在无头结点的单链表上实现线性表基本运算LOCATE(L,X),INSERT (L, X , 1)和DELETE (L , 1)的算法。
2 •假设有两个按数据元素值递增有序排列的线性表A和B,均以单链表作为存储结构。
编写算法将A 表和B 表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表)结点空间存放表C。
3.将一个线性表中的值就地逆置。
4.在线性表的顺序存储结构的第一个位置上插入一个元素。
(注意区分链表和顺序表)实验代码:#include "stdlib.h"#include "stdio.h" struct node{// 定义结构体int d;struct node *next;};struct node *head1,*head2,*p,*q;void pre( struct node *head) // 打印数据{printf( " 链表中的数据为:\n" ); p=head;while (p!=NULL){printf( "%5d",p->d); q=p;p=p->next;}printf( "\n" );}struct node *creat() // 建立链表{ struct node *head;int x;printf( " 输入你要储存的数据:\n" ); head=NULL;q=NULL; scanf( "%d",&x);while (x>0){p=( struct node *)malloc( sizeof ( struct node)); p->d=x;p->next=NULL;if (head==NULL) head=p; else q->next=p;q=p;scanf( "%d",&x); getchar();} pre(head);return (head);}void locate( struct node *head, int x) // 查找链表中的数据{int u=1; p=head;while (p->next!= NULL){ if (p->d==x) break ;else{ p=p->next;u++;}}if (p->d!= x)printf( " 无此结点");printf( "在链表中的位置为:");printf( "%d",u);}void insert( struct node *head, int x, int i) // 插入数据{ p = head; int j=1; q=( struct node *)malloc( sizeof ( struct node)); q->d=x;if (i==1){ q->next=head;head=q;else{while ((j<i-1)&&(p->next !=NULL)){j++;p=p->next;} q->next=p->next;p->next=q;}}void delet( struct node *head, int i) // 删除数据{ p=head; int j=1;if (i<0) printf( " 无此位置");if (i==1){q=head; head=head->next; free(q);}else{while ((j<i-1) && (p->next != NULL)){ p=p->next;j++;} q=p->next;p->next=q->next; free(q);}}void hebing( struct node *x, struct node *y) // 合并两个链表{p=x;q=y;while (p->next!=NULL)p=p->next;p->next=q;pre(x);}void paixu( struct node *head) // 对链表中的数据进行排序{int m,n,i=1,t; p=head;while (p->next!=NULL){p=p->next;i++;}p=head;for (n=i;n>1;n--){p=head;for (m=1;m<n;m++){q=p->next;if (p->d<q->d){t=p->d;p->d=q->d;q->d=t;}p=p->next;}}void caozuo( struct node *head) // 操作界面{int m,n; char t;printf("输入你要的操作:,查找2,插入3,删除\n"); scanf( "%c" ,&t);switch (t){case '1' :{printf( "输入你要查找的元素的值:\n" );scanf( "%d",&m); locate(head,m);} break ;case '2' :{printf( " 输入你要插入的元素的值和位置:\n" );scanf( "%d",&m);scanf( "%d",&n); insert(head,m,n);pre(head);} break ;case '3' :{printf( " 输入你要删除的元素的位置:\n" );scanf( "%d",&m); delet(head,m);pre(head);} break ;default :printf( "error\n" );}}void main() // 主函数{char frag= 'y' ,n=NULL;printf("输入你要建立的第A链表中的元素:\n");head1=creat();printf("输入你要建立的第B链表中的元素:\n"); head2=creat();do// 选择操作{printf("选择你要操作的链表A/B或者合并排序操作C: \n"); scanf( "%c",&n);getchar();switch (n){case 'A' : {caozuo(head1);} break ;case 'B' : {caozuo(head2);} break ;case 'C' :{hebing(head1,head2);paixu(head1);pre(head1);} break ;default :printf( "error\n" );}printf( "\n 是否继续y/n :\n" );scanf( "%c",&frag);getchar();}while (frag== 'y' );}实验 2 栈和队列的基本操作一、实验目的与基本要求1.掌握栈和队列的顺序存储和链式存储结构2.掌握栈和队列的特点。
数据结构实验报告
数据结构实验报告
数据结构是一门涉及计算机程序设计以存储、组织和处理数据的学科。
它通过将数据存储在内存中用不同的方式来实现,从而收集、存储、检索和变更数据。
实验室实验旨在演示我们如何使用数据结构在应用程序中创建和处理数据。
学生学习如何实现树形结构、哈希表、链表等数据结构,以及如何使用它们来实现数据结构的基本应用功能,如搜索、排序、插入等。
首先,我们用C语言实现了简单的树形结构,实现了给定数据的搜索、排序和插入功能。
实现这个环境中的这个树形结构需要考虑一些函数,如建立新的节点、插入节点、删除节点、查找节点、计算和分析树结构等。
然后,我们实验室代码测试,确保正确实现和功能。
接下来我们实现哈希表,实现散列函数和拉链法等,用于搜索、插入和删除。
哈希表比树形结构具有更高的存储空间和更快的搜索速度,所以这种结构是数据库和大规模索引中广泛使用的数据结构之一。
最后,我们实现链表,它是一种重要的动态数据结构,可以存储大量的数据,可以快速地更新、插入和删除数据。
通过链表,学生学习了如何实现插入和删除功能,以及如何反式和正向遍历链表。
在实验室练习中,我们学习和掌握了如何使用数据结构,使用数据结构来存储和处理数据,使用不同的数据结构来满足不同的功能要求,以及如何优化实现和操作数据结构的数据结构性能。
此外,本次实验室还提出了使用面向对象编程来实现更复杂的数据结构的思路,可以为学生后续深入研究和实践提供基础。
软件技术基础实验报告1
实验题目:软件技术基础实验实验一顺序表和单链表基本操作上机实验Part A一、需求分析1.程序要实现的基本功能顺序表的创建、元素删除、遍历等操作2.输入输出的要求有序的一组整数{1,2,3,4,6},设计顺序表并实现以下操作A.初始化一个空的顺序表;B.从键盘依次输入上述数据添加到顺序表中;C.删除表中的第四个数据元素;D.显示B、C操作后顺序表中的内容。
二、概要设计1.本程序所用的数据结构数组和结构体2.主程序及各函数子模块之间的层次关系3.主程序及各模块的流程图三、详细设计1.采用c语言定义相关的数据类型typedef struct,int2.源程序见附录四、结果测试1.输入数据{1,2,3,4,6}2.输出结果验证Part B一、需求分析1.程序要实现的基本功能单链表的初始化、生成、长度统计、查找、删除等操作2.输入输出的要求现有有序的一组整数{1,2,2,3,4,6,6},设计单链表,分别编写函数实现以下操作:A.初始化一个空链表;B.依次添加上述一组数据(结点),生成该链表;C.统计该链表的长度;D.在表中查找数据为3和7的结点,并返回其位置(若找不到返回-1);E.删除相邻的重复结点,使链表变为1-2-3-4-6。
主程序及各模块的流程图;F.显示经B、E操作后,链表的内容。
概要设计1.本程序所用的数据结构结构体、指针2.主程序及各函数子模块之间的层次关系3.主程序及各模块的流程图三、详细设计1.采用c语言定义相关的数据类型typedef struct node,int,int*2.源程序见附录四、结果测试1.输入数据{1,2,2,3,4,6,6}2.输出结果验证查找数据元素3查找数据元素7实验二:基本查找排序操作上机实验一、需求分析1.程序要实现的基本功能两种基本的查找算法(顺序查找、二分查找)和三种基本排序算法(简单插入排序、简单冒泡排序、简单选择排序)2.输入输出的要求现有一顺序表,表中元素分别为{51,38,79,22,91,105,33,52,16,112},分别编写函数实现以下操作:A、采用简单插入排序法实现对顺序表的排序,显示每一趟的排序结果;B、采用简单冒泡排序法实现对顺序表的排序,显示每一趟的排序结果;C、采用简单选择排序法实现对顺序表的排序,显示每一趟的排序结果;D、对上述排序后的顺序表采用顺序查找方法,查找关键字为52和关键字为36的元素,分别显示查找结果;E、对上述排序后的顺序表采用二分查找方法,查找关键字为22的元素,显示查找结果。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过实验可以更深入地理解和掌握数据结构的概念、原理和应用。
本次实验的主要目的包括:1、熟悉常见的数据结构,如链表、栈、队列、树和图等。
2、掌握数据结构的基本操作,如创建、插入、删除、遍历等。
3、提高编程能力和解决实际问题的能力,能够运用合适的数据结构解决具体的问题。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的实现与操作单向链表的创建、插入和删除节点。
双向链表的实现和基本操作。
循环链表的特点和应用。
2、栈和队列的实现栈的后进先出特性,实现入栈和出栈操作。
队列的先进先出原则,完成入队和出队功能。
3、树的操作二叉树的创建、遍历(前序、中序、后序)。
二叉搜索树的插入、查找和删除操作。
4、图的表示与遍历邻接矩阵和邻接表表示图。
深度优先搜索和广度优先搜索算法的实现。
四、实验步骤及结果1、链表的实现与操作单向链表:首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。
通过创建链表头节点,并使用循环依次插入新节点,实现了链表的创建。
插入节点时,根据指定位置找到插入点的前一个节点,然后修改指针完成插入操作。
删除节点时,同样找到要删除节点的前一个节点,修改指针完成删除。
实验结果:成功创建、插入和删除了单向链表的节点,并正确输出了链表的内容。
双向链表:双向链表节点结构体增加了指向前一个节点的指针。
创建、插入和删除操作需要同时维护前后两个方向的指针。
实验结果:双向链表的各项操作均正常,能够双向遍历链表。
循环链表:使链表的尾节点指向头节点,形成循环。
在操作时需要特别注意循环的边界条件。
实验结果:成功实现了循环链表的创建和遍历。
2、栈和队列的实现栈:使用数组或链表来实现栈。
入栈操作将元素添加到栈顶,出栈操作取出栈顶元素。
实验结果:能够正确进行入栈和出栈操作,验证了栈的后进先出特性。
数据结构实验报告实验1
数据结构实验报告实验1一、实验目的本次实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见的数据结构,如线性表、栈、队列等,并能够运用所学知识解决实际问题。
二、实验环境本次实验使用的编程环境为Visual Studio 2019,编程语言为C++。
三、实验内容与步骤(一)线性表的实现与操作1、顺序表的实现定义一个固定大小的数组来存储线性表的元素。
实现插入、删除、查找等基本操作。
2、链表的实现定义链表节点结构体,包含数据域和指针域。
实现链表的创建、插入、删除、遍历等操作。
(二)栈的实现与应用1、栈的实现使用数组或链表实现栈的数据结构。
实现入栈、出栈、栈顶元素获取等操作。
2、栈的应用利用栈实现表达式求值。
(三)队列的实现与应用1、队列的实现使用循环数组或链表实现队列。
实现入队、出队、队头元素获取等操作。
2、队列的应用模拟银行排队系统。
四、实验结果与分析(一)线性表1、顺序表插入操作:在指定位置插入元素时,需要移动后续元素,时间复杂度为 O(n)。
删除操作:删除指定位置的元素时,同样需要移动后续元素,时间复杂度为 O(n)。
查找操作:可以直接通过索引访问元素,时间复杂度为 O(1)。
2、链表插入操作:只需修改指针,时间复杂度为 O(1)。
删除操作:同样只需修改指针,时间复杂度为 O(1)。
查找操作:需要遍历链表,时间复杂度为 O(n)。
(二)栈1、表达式求值能够正确计算简单的四则运算表达式,如 2 + 3 4。
对于复杂表达式,如(2 + 3) 4,也能得到正确结果。
(三)队列1、银行排队系统模拟了客户的到达、排队和服务过程,能够反映出队列的先进先出特性。
五、实验中遇到的问题及解决方法(一)线性表1、顺序表的空间浪费问题问题描述:当预先分配的空间过大而实际使用较少时,会造成空间浪费。
解决方法:可以采用动态分配空间的方式,根据实际插入的元素数量来调整存储空间。
2、链表的指针操作错误问题描述:在链表的插入和删除操作中,容易出现指针指向错误,导致程序崩溃。
数据结构实习报告
一、实习背景随着计算机科学技术的不断发展,数据结构作为计算机科学的重要基础,在各个领域都发挥着重要作用。
为了提高自己的实践能力,加深对数据结构理论知识的理解,我参加了本次数据结构实习。
通过实习,我学习了数据结构在实际应用中的实现方法和技巧,提高了自己的编程能力和问题解决能力。
二、实习内容1. 实习项目概述本次实习项目是一个基于C语言实现的学生信息管理系统。
系统包括学生信息的添加、删除、修改、查询等功能。
在实现过程中,我主要使用了线性表、链表、栈、队列、树等数据结构。
2. 数据结构设计(1)线性表:用于存储学生信息,包括学号、姓名、性别、年龄、班级等字段。
(2)链表:实现学生信息的添加、删除、修改等功能。
(3)栈:实现学生信息的临时存储,如删除操作时需要先弹出栈顶元素。
(4)队列:实现学生信息的排序功能,如按学号排序。
(5)树:实现学生信息的分类存储,如按班级分类。
3. 程序设计(1)主程序:负责调用各个模块,实现学生信息管理系统的整体功能。
(2)数据输入模块:负责从用户处获取输入的学生信息,并将其存储到数据结构中。
(3)数据输出模块:负责将学生信息显示给用户,包括添加、删除、修改、查询等操作的结果。
(4)数据操作模块:负责实现学生信息的各种操作,如添加、删除、修改、查询等。
三、实习成果1. 实现了一个功能完善的学生信息管理系统。
2. 掌握了线性表、链表、栈、队列、树等数据结构在实际应用中的实现方法和技巧。
3. 提高了编程能力和问题解决能力。
4. 了解了软件开发的流程,如需求分析、设计、编码、测试等。
四、实习体会1. 数据结构是计算机科学的重要基础,在实际应用中具有重要意义。
2. 在编程过程中,要善于运用各种数据结构,以提高程序的性能和可读性。
3. 需要具备良好的编程习惯,如代码规范、注释清晰等。
4. 在遇到问题时,要善于查阅资料,分析问题,提出解决方案。
5. 团队合作是软件开发的重要环节,要学会与他人沟通、协作。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过本次实验,旨在加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解和运用,提高编程能力和问题解决能力,培养算法设计和分析的思维。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、数组与链表的实现与操作分别实现整数数组和整数链表的数据结构。
实现数组和链表的插入、删除、查找操作,并比较它们在不同操作下的时间复杂度。
2、栈与队列的应用用数组实现栈结构,用链表实现队列结构。
模拟栈的入栈、出栈操作和队列的入队、出队操作,解决实际问题,如表达式求值、任务调度等。
3、二叉树的遍历构建二叉树的数据结构。
实现先序遍历、中序遍历和后序遍历三种遍历算法,并输出遍历结果。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先搜索(DFS)和广度优先搜索(BFS)算法,并分析它们的时间复杂度。
四、实验步骤1、数组与链表数组的实现:定义一个固定大小的整数数组,通过索引访问和操作数组元素。
链表的实现:定义链表节点结构体,包含数据和指向下一个节点的指针。
插入操作:对于数组,若插入位置在末尾,直接赋值;若不在末尾,需移动后续元素。
对于链表,找到插入位置的前一个节点,修改指针。
删除操作:数组需移动后续元素,链表修改指针即可。
查找操作:数组通过索引直接访问,链表需逐个节点遍历。
2、栈与队列栈的实现:用数组模拟栈,设置栈顶指针。
队列的实现:用链表模拟队列,设置队头和队尾指针。
入栈和出栈操作:入栈时,若栈未满,将元素放入栈顶,栈顶指针加 1。
出栈时,若栈不为空,取出栈顶元素,栈顶指针减 1。
入队和出队操作:入队时,在队尾添加元素。
出队时,取出队头元素,并更新队头指针。
3、二叉树构建二叉树:采用递归方式创建二叉树节点。
先序遍历:先访问根节点,再递归遍历左子树,最后递归遍历右子树。
中序遍历:先递归遍历左子树,再访问根节点,最后递归遍历右子树。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机软件技术基础》实验报告I—数据结构班号:0313203 学号:031320306姓名:蔡瑶Email:1556027855@签名:南京航空航天大学2016年3月9日目录实验一:约瑟夫斯问题求解 (xx)实验二:停车场管理问题 (xx)实验三:管道铺设施工的最佳方案问题 (xx)实验四:内部排序算法的实现与比较 (xx)实验一:约瑟夫斯问题求解一.问题描述1)实验题目约瑟夫斯(Josephus)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。
报m 的人出列,将他的密码作为新的m值,从他在顺时针方向下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。
试设计一个程序,按出列顺序印出各人编号。
2)基本要求利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
3)测试数据n=7,7个人的密码依次为:3,1,7,2,4,8,4。
m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
二.需求分析1. 本程序按照用户指定初始人数和报数上限m,以及每个人的密码,完成依次取出所有人序号的任务2.程序运行后,首先要求用户指定初始报数上限m,然后依次读取个人的密码。
可设n≤30。
注意链表中空表和非空表的界限。
程序需自动顾虑取值范围正确与否3.输入数据:建立输入处理,输入n输入以及每个人的密码;m的初值。
输出形式:建立一个输出函数,输出正确的序列。
三.设计思路为了实现上述功能,应以头尾相接的循环链表来作为存储的方式1.链表的定义S LNODE{intcode,data;SLNODE *next;};2.数据的存入输入编号以及密码等数据h=(SLNODE*)malloc(sizeof(SLNODE)); printf("please input data %d :",i); scanf("%d",&h->data);s=(SLNODE*)malloc(sizeof(SLNODE)); printf(" please input data %d :",i); scanf("%d",&s->data);3.构造循环单链表p->next=h;4.程序保护在输入的数据不符合要求时纠正printf("please input positive number! "); printf("please input data %d :",i); scanf("%d",&h->data);printf("please input positive number! "); printf("please input n:");scanf("%d",&n);printf("please input positive number! "); printf("please input date %d:",i); scanf("%d",&h->data);四.流程图五.调试分析第一次编译没有错误后,调试程序,输入两个数据以后,内存崩溃,查错发现程序中的一个判断条件判断h的指针是空指针,但是写成了h->next=NULL赋值语句,造成死循环。
改正后还是在运行的过程中出现了问题。
排查发现在n=1时的循环出现问题,在删除结点时,应该先把r赋给o,再将t->next指向r,最后删除o来实现,但是程序中的顺序出现了错误。
改正后调试成功。
六.使用说明首先输入人数,然后依次输入对应编号的人的密码,最后输入一个任意初始密码开始报数。
输出结果依次为每次报数的最后一个人。
七.调试结果八.遇到的问题和解决方法在一一般的单链表中,头结点为空,在构造这个循环链表的时候,如果头结点为空结点需要多出很多步骤而且出错的概率会增加,而且我认为头结点是人为定义的方便单链表的查找和管理的,它毕竟也是一个结点,所以我从头结点开始存储数据。
在最后判断什么时候还剩最后一个结点并且结束程序时出现了困难,后来想到了用两个指针分别指向头结点和头结点前一个结点,当它们重合,则只剩一个结点,此时应该输出最后一个数据并且结束程序。
九.收获和感想首先,编写程序的时候,要注意细节,比如“=”和“==”,否则会造成严重的错误。
还有在写循环的时候,注意循环的可行性,仔细思考语句间的逻辑关系。
十.附录源程序清单//// main.c// 约瑟夫斯//// Created by caiyao on 16/3/8.// Copyright © 2016年caiyao. All rights reserved.//#include<stdio.h>#include<stdlib.h>#include<time.h>#define SLNODE struct node //定义链表SLNODE{int code,data;SLNODE *next;};int main(void) //主程序{time_t rawtime;struct tm * timeinfo;time(&rawtime);timeinfo=localtime(&rawtime);printf("current local time and date:%s",asctime(timeinfo));printf("学号:031320306 姓名:蔡瑶\n"); //输入姓名学号,程序开始时间int m,n,i=1;SLNODE *h,*r,*t,*p,*s,*o; //定义链表指针printf("please input n: "); //输入人数scanf("%d",&n);while (n==0||n<0){printf("please input positive number! "); //判断人数是否为正数printf("please input n:");scanf("%d",&n);}h=(SLNODE*)malloc(sizeof(SLNODE));printf("please input data %d :",i); //输入第一个人的密码datascanf("%d",&h->data);while (h->data==0||h->data<0) //判断输入的密码是否为正数{printf("please input positive number! ");printf("please input date %d:",i);scanf("%d",&h->data);}p=h; //开始构造链表,并且依次标号为codeh->next=NULL;h->code=i;while(i<n) //当编号数小于开始输入的人数时依次输入密码{i++;s=(SLNODE*)malloc(sizeof(SLNODE));printf(" please input data %d :",i);scanf("%d",&s->data);while (h->data==0||h->data<0) //判断输入密码是否为正数{printf("please input positive number! ");printf("please input data %d :",i);scanf("%d",&h->data);}s->code=i; //构造链表,依次编号if (h->next==NULL) //向头结点后边依次插入h->next=s;elsep->next=s;p=s;}p->next=h; //将最后一个结点指向头结点构成循环单链表r=h; //构造指针人r,t分别指向头结点和头结点前的一个结点t=h;while(t->next!=h){t=t->next;}printf("input m: ");scanf("%d",&m);if (m==0||m<0) //如果输入的初始密码不为正数,报错printf("error");while(r!=t) //当r和t不相等时说明循环链表中还有一个以上结点,进行循环{if(m==1) //如果数到某个结点时m为1,则输出它自身{printf("%d,",r->code); //输出依次被剔除的结点编号m=r->data;o=r;r=r->next;t->next=r;free(o);}else//如果数到某个结点时m不为1,则将r,t指针分别后移,m减1{r=r->next;t=t->next;m--;}}if(r==t){printf("%d\n",t->code);printf("current local time and date:%s",asctime(timeinfo)); //输出程序运行结束时间return(0);}}实验二:停车场管理问题一.问题描述1)实验题目设停车场是一个可停放n 辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。
若停车场内已经停满n辆车,那么后来的车只能在门外的便道上等候。
一旦有车开走,则排在便道上的第一辆车即可开入。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。
每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。