数据结构实验报告

合集下载

数据结构实验一实验报告

数据结构实验一实验报告

数据结构实验一实验报告一、实验目的本次数据结构实验一的目的主要在于让我们通过实际操作,深入理解线性表的基本概念和操作方法,掌握顺序表和链表这两种常见的数据结构,并能够运用所学知识解决一些简单的实际问题。

二、实验环境本次实验使用的编程环境为具体编程环境名称,开发工具为具体开发工具名称。

三、实验内容(一)顺序表的实现与操作1、顺序表的定义顺序表是一种用一组地址连续的存储单元依次存储数据元素的线性结构。

2、顺序表的基本操作实现初始化顺序表:创建一个空的顺序表,并为其分配一定的存储空间。

插入元素:在指定位置插入新的元素。

删除元素:删除指定位置的元素。

查找元素:在顺序表中查找指定的元素,并返回其位置。

(二)链表的实现与操作1、链表的定义链表是一种通过指针将各个数据元素链接起来的线性结构。

2、链表的基本操作实现初始化链表:创建一个空的链表。

插入节点:在链表的指定位置插入新的节点。

删除节点:删除链表中指定位置的节点。

查找节点:在链表中查找指定的节点,并返回其位置。

四、实验步骤(一)顺序表的实现1、定义顺序表的数据结构使用数组来存储顺序表的元素,并记录顺序表的当前长度和最大长度。

2、实现顺序表的初始化函数分配初始的存储空间,并将长度初始化为 0 。

3、实现顺序表的插入函数首先判断插入位置是否合法,如果合法,则将插入位置之后的元素依次向后移动一位,然后将新元素插入到指定位置,并更新长度。

4、实现顺序表的删除函数首先判断删除位置是否合法,如果合法,则将删除位置之后的元素依次向前移动一位,并更新长度。

5、实现顺序表的查找函数通过遍历顺序表,逐个比较元素,找到目标元素并返回其位置。

(二)链表的实现1、定义链表的节点结构包含数据域和指针域,指针域用于指向下一个节点。

2、实现链表的初始化函数创建一个空的链表,即头节点的指针为空。

3、实现链表的插入函数根据插入位置的不同,分为在表头、表尾和中间插入三种情况。

在插入时,需要创建新的节点,并正确调整指针的指向。

数据结构实验报告-线性表(顺序表实现)

数据结构实验报告-线性表(顺序表实现)

实验1:线性表(顺序表的实现)一、实验项目名称顺序表基本操作的实现二、实验目的掌握线性表的基本操作在顺序存储结构上的实现。

三、实验基本原理顺序表是由地址连续的的向量实现的,便于实现随机访问。

顺序表进行插入和删除运算时,平均需要移动表中大约一半的数据元素,容量难以扩充四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和一些预定义:2.定义顺序表:3.初始化:4.插入元素:5.查询元素:6.删除元素:7.销毁顺序表:8.清空顺序表:9.顺序表长度:10.判空:11.定位满足大小关系的元素(默认小于):12.查询前驱:13.查询后继:14.输出顺序表15.归并顺序表16.写测试程序以及主函数对顺序表的每一个操作写一个测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码:#include <bits/stdc++.h>using namespace std;#define error 0#define overflow -2#define initSize 100#define addSize 10#define compareTo <=typedef int ElemType;struct List{ElemType *elem;int len;int listsize;}L;void init(List &L){L.elem = (ElemType *) malloc(initSize * sizeof(ElemType)); if(!L.elem){cout << "分配内存失败!";exit(overflow);}L.len = 0;L.listsize = initSize;}void destroy(List &L){free(L.elem);L.len = L.listsize = 0;}void clear(List &L){L.len = 0;}bool empty(List L){if(L.len == 0) return true;else return false;}int length(List L){return L.len;}ElemType getElem(List L,int i){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}return L.elem[i - 1];}bool compare(ElemType a,ElemType b) {return a compareTo b;}int locateElem(List L,ElemType e) {for(int i = 0;i < L.len;i++){if(compare(L.elem[i],e))return i;}return -1;}int check1(List L,ElemType e){int idx = -1;for(int i = 0;i < L.len;i++)if(L.elem[i] == e)idx = i;return idx;}bool check2(List L,ElemType e){int idx = -1;for(int i = L.len - 1;i >= 0;i--)if(L.elem[i] == e)idx = i;return idx;}int priorElem(List L,ElemType cur_e,ElemType pre_e[]) {int idx = check1(L,cur_e);if(idx == 0 || idx == -1){string str = "";str = idx == 0 ? "无前驱结点" : "不存在该元素";cout << str;exit(error);}int cnt = 0;for(int i = 1;i < L.len;i++){if(L.elem[i] == cur_e){pre_e[cnt ++] = L.elem[i - 1];}}return cnt;}int nextElem(List L,ElemType cur_e,ElemType next_e[]){int idx = check2(L,cur_e);if(idx == L.len - 1 || idx == - 1){string str = "";str = idx == -1 ? "不存在该元素" : "无后驱结点";cout << str;exit(error);}int cnt = 0;for(int i = 0;i < L.len - 1;i++){if(L.elem[i] == cur_e){next_e[cnt ++] = L.elem[i + 1];}}return cnt;}void insert(List &L,int i,ElemType e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}if(L.len >= L.listsize){ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize + addSize) * sizeof(ElemType));if(!newbase){cout << "内存分配失败!";exit(overflow);}L.elem = newbase;L.listsize += addSize;for(int j = L.len;j > i - 1;j--)L.elem[j] = L.elem[j - 1];L.elem[i - 1] = e;L.len ++;}void deleteList(List &L,int i,ElemType &e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}e = L.elem[i - 1];for(int j = i - 1;j < L.len;j++)L.elem[j] = L.elem[j + 1];L.len --;}void merge(List L,List L2,List &L3){L3.elem = (ElemType *)malloc((L.len + L2.len) * sizeof(ElemType)); L3.len = L.len + L2.len;L3.listsize = initSize;if(!L3.elem){cout << "内存分配异常";exit(overflow);}int i = 0,j = 0,k = 0;while(i < L.len && j < L2.len){if(L.elem[i] <= L2.elem[j])L3.elem[k ++] = L.elem[i ++];else L3.elem[k ++] = L2.elem[j ++];}while(i < L.len)L3.elem[k ++] = L.elem[i ++];while(j < L2.len)L3.elem[k ++] = L2.elem[j ++];}bool visit(List L){if(L.len == 0) return false;for(int i = 0;i < L.len;i++)cout << L.elem[i] << " ";cout << endl;return true;}void listTraverse(List L){if(!visit(L)) return;}void partion(List *L){int a[100000],b[100000],len3 = 0,len2 = 0; memset(a,0,sizeof a);memset(b,0,sizeof b);for(int i = 0;i < L->len;i++){if(L->elem[i] % 2 == 0)b[len2 ++] = L->elem[i];elsea[len3 ++] = L->elem[i];}for(int i = 0;i < len3;i++)L->elem[i] = a[i];for(int i = 0,j = len3;i < len2;i++,j++) L->elem[j] = b[i];cout << "输出顺序表:" << endl;for(int i = 0;i < L->len;i++)cout << L->elem[i] << " ";cout << endl;}//以下是测试函数------------------------------------void test1(List &list){init(list);cout << "初始化完成!" << endl;}void test2(List &list){if(list.listsize == 0)cout << "线性表不存在!" << endl;else{int len;ElemType num;cout << "选择插入的元素数量:" << endl;cin >> len;cout << "依次输入要插入的元素:" << endl;for(int i = 1;i <= len;i++){cin >> num;insert(list,i,num);}cout << "操作成功!" << endl;}}void test3(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "请输入要返回的元素的下标" << endl;int idx;cin >> idx;cout << "线性表中第" << idx << "个元素是:" << getElem(L,idx) << endl;}}void test4(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{int idx;ElemType num;cout << "请输入要删除的元素在线性表的位置" << endl;cin >> idx;deleteList(L,idx,num);cout << "操作成功!" << endl << "被删除的元素是:" << num << endl; }}void test5(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{destroy(L);cout << "线性表已被销毁" << endl;}}void test6(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{clear(L);cout << "线性表已被清空" << endl;}}void test7(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else cout << "线性表的长度现在是:" << length(L) << endl;}void test8(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else if(empty(L))cout << "线性表现在为空" << endl;else cout << "线性表现在非空" << endl;}void test9(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num;cout << "请输入待判定的元素:" << endl;cin >> num;cout << "第一个与目标元素满足大小关系的元素的位置:" << locateElem(L,num) << endl;}}void test10(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = priorElem(L,num,num2);cout << num << "的前驱为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test11(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = nextElem(L,num,num2);cout << num << "的后继为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test12(List list){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "输出线性表所有元素:" << endl;listTraverse(list);}}void test13(){if(L.listsize == 0)cout << "初始线性表不存在!" << endl; else{List L2,L3;cout << "初始化一个新线性表" << endl;test1(L2);test2(L2);cout << "归并两个线性表" << endl;merge(L,L2,L3);cout << "归并成功!" << endl;cout << "输出合并后的线性表" << endl;listTraverse(L3);}}void test14(){partion(&L);cout << "奇偶数分区成功!" << endl;}int main(){std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int op = 0;while(op != 15){cout << "-----------------menu--------------------" << endl;cout << "--------------1:初始化------------------" << endl;cout << "--------------2:插入元素----------------" << endl;cout << "--------------3:查询元素----------------" << endl;cout << "--------------4:删除元素----------------" << endl;cout << "--------------5:销毁线性表--------------" << endl;cout << "--------------6:清空线性表--------------" << endl;cout << "--------------7:线性表长度--------------" << endl;cout << "--------------8:线性表是否为空----------" << endl;cout << "--------------9:定位满足大小关系的元素--" << endl;cout << "--------------10:查询前驱---------------" << endl;cout << "--------------11:查询后继---------------" << endl;cout << "--------------12:输出线性表-------------" << endl;cout << "--------------13:归并线性表-------------" << endl;cout << "--------------14:奇偶分区---------------" << endl;cout << "--------------15: 退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl; if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1(L);break;case 2:test2(L);break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:test12(L);break;case 13:test13();break;case 14:test14();break;case 15:cout << "测试结束!" << endl;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果1.初始化:2.插入元素3.查询元素(返回的是数组下标,下标从0开始)4.删除元素(位置从1开始)5.销毁顺序表6.清空顺序表7.顺序表长度(销毁或清空操作前)8.判空(销毁或清空操作前)9.定位满足大小关系的元素(销毁或清空操作前)说明:这里默认找第一个小于目标元素的位置且下标从0开始,当前顺序表的数据为:1 4 2 510.前驱(销毁或清空操作前)11.后继(销毁或清空操作前)12.输出顺序表(销毁或清空操作前)13.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。

数据结构实验报告实验总结

数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。

通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。

下面对每一部分实验进行总结。

实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。

在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。

实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。

通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。

实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。

通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。

实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。

通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。

通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。

同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。

在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。

通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。

总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。

在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。

数据结构实验一顺序表实验报告

数据结构实验一顺序表实验报告

数据结构实验一顺序表实验报告一、实验目的本次实验的主要目的是通过实现顺序表的基本操作,深入理解线性表的逻辑结构和存储结构,掌握顺序表的插入、删除、查找等操作的实现方法,提高编程能力和问题解决能力。

二、实验环境本次实验使用的编程语言为 C 语言,编程环境为 Visual Studio 2019。

三、实验原理顺序表是一种线性表的存储结构,它使用一组连续的存储单元依次存储线性表中的元素。

在顺序表中,元素的逻辑顺序与物理顺序是一致的。

顺序表的基本操作包括初始化、插入、删除、查找、遍历等。

在实现这些操作时,需要考虑顺序表的存储空间是否已满、插入和删除元素时元素的移动等问题。

四、实验内容(一)顺序表的定义```cdefine MAXSIZE 100 //定义顺序表的最大长度typedef struct {int dataMAXSIZE; //存储顺序表的元素int length; //顺序表的当前长度} SeqList;```(二)顺序表的初始化```cvoid InitList(SeqList L) {L>length = 0;}```(三)顺序表的插入操作```cint InsertList(SeqList L, int i, int e) {if (L>length == MAXSIZE) {//顺序表已满return 0;}if (i < 1 || i > L>length + 1) {//插入位置不合法return 0;}for (int j = L>length; j >= i; j) {//移动元素L>dataj = L>dataj 1;}L>datai 1 = e; //插入元素L>length++;return 1;}```(四)顺序表的删除操作```cint DeleteList(SeqList L, int i, int e) {if (L>length == 0) {//顺序表为空return 0;}if (i < 1 || i > L>length) {//删除位置不合法}e = L>datai 1; //取出被删除的元素for (int j = i; j < L>length; j++){//移动元素L>dataj 1 = L>dataj;}L>length;return 1;}```(五)顺序表的查找操作```cint SearchList(SeqList L, int e) {for (int i = 0; i < Llength; i++){if (Ldatai == e) {return i + 1;}}}```(六)顺序表的遍历操作```cvoid TraverseList(SeqList L) {for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);}printf("\n");}```五、实验步骤1、打开 Visual Studio 2019,创建一个新的 C 语言项目。

数据结构实验报告-树(二叉树)

数据结构实验报告-树(二叉树)

实验5:树(二叉树)(采用二叉链表存储)一、实验项目名称二叉树及其应用二、实验目的熟悉二叉树的存储结构的特性以及二叉树的基本操作。

三、实验基本原理之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。

线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。

在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。

直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。

四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和预定义2.创建二叉树3.前序遍历4.中序遍历5.后序遍历6.总结点数7.叶子节点数8.树的深度9.树根到叶子的最长路径10.交换所有节点的左右子女11.顺序存储12.显示顺序存储13.测试函数和主函数对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码:#include <bits/stdc++.h>using namespace std;#define MAX_TREE_SIZE 100typedef char ElemType;ElemType SqBiTree[MAX_TREE_SIZE];struct BiTNode{ElemType data;BiTNode *l,*r;}*T;void createBiTree(BiTNode *&T){ElemType e;e = getchar();if(e == '\n')return;else if(e == ' ')T = NULL;else{if(!(T = (BiTNode *)malloc(sizeof (BiTNode)))){cout << "内存分配错误!" << endl;exit(0);}T->data = e;createBiTree(T->l);createBiTree(T->r);}}void createBiTree2(BiTNode *T,int u) {if(T){SqBiTree[u] = T->data;createBiTree2(T->l,2 * u + 1);createBiTree2(T->r,2 * u + 2); }}void outputBiTree2(int n){int cnt = 0;for(int i = 0;cnt <= n;i++){cout << SqBiTree[i];if(SqBiTree[i] != ' ')cnt ++;}cout << endl;}void preOrderTraverse(BiTNode *T) {if(T){cout << T->data;preOrderTraverse(T->l);preOrderTraverse(T->r);}}void inOrderTraverse(BiTNode *T) {if(T){inOrderTraverse(T->l);cout << T->data;inOrderTraverse(T->r);}}void beOrderTraverse(BiTNode *T){if(T){beOrderTraverse(T->l);beOrderTraverse(T->r);cout << T->data;}}int sumOfVer(BiTNode *T){if(!T)return 0;return sumOfVer(T->l) + sumOfVer(T->r) + 1;}int sumOfLeaf(BiTNode *T){if(!T)return 0;if(T->l == NULL && T->r == NULL)return 1;return sumOfLeaf(T->l) + sumOfLeaf(T->r);}int depth(BiTNode *T){if(!T)return 0;return max(depth(T->l),depth(T->r)) + 1;}bool LongestPath(int dist,int dist2,vector<ElemType> &ne,BiTNode *T) {if(!T)return false;if(dist2 == dist)return true;if(LongestPath(dist,dist2 + 1,ne,T->l)){ne.push_back(T->l->data);return true;}else if(LongestPath(dist,dist2 + 1,ne,T->r)){ne.push_back(T->r->data);return true;}return false;}void swapVer(BiTNode *&T){if(T){swapVer(T->l);swapVer(T->r);BiTNode *tmp = T->l;T->l = T->r;T->r = tmp;}}//以下是测试程序void test1(){getchar();cout << "请以先序次序输入二叉树结点的值,空结点用空格表示:" << endl; createBiTree(T);cout << "二叉树创建成功!" << endl;}void test2(){cout << "二叉树的前序遍历为:" << endl;preOrderTraverse(T);cout << endl;}void test3(){cout << "二叉树的中序遍历为:" << endl;inOrderTraverse(T);cout << endl;}void test4(){cout << "二叉树的后序遍历为:" << endl;beOrderTraverse(T);cout << endl;}void test5(){cout << "二叉树的总结点数为:" << sumOfVer(T) << endl;}void test6(){cout << "二叉树的叶子结点数为:" << sumOfLeaf(T) << endl; }void test7(){cout << "二叉树的深度为:" << depth(T) << endl;}void test8(){int dist = depth(T);vector<ElemType> ne;cout << "树根到叶子的最长路径:" << endl;LongestPath(dist,1,ne,T);ne.push_back(T->data);reverse(ne.begin(),ne.end());cout << ne[0];for(int i = 1;i < ne.size();i++)cout << "->" << ne[i];cout << endl;}void test9(){swapVer(T);cout << "操作成功!" << endl;}void test10(){memset(SqBiTree,' ',sizeof SqBiTree);createBiTree2(T,0);cout << "操作成功!" << endl;}void test11(){int n = sumOfVer(T);outputBiTree2(n);}int main(){int op = 0;while(op != 12){cout << "-----------------menu--------------------" << endl;cout << "--------------1:创建二叉树--------------" << endl;cout << "--------------2:前序遍历----------------" << endl;cout << "--------------3:中序遍历----------------" << endl;cout << "--------------4:后序遍历----------------" << endl;cout << "--------------5:总结点数----------------" << endl;cout << "--------------6:叶子节点数--------------" << endl;cout << "--------------7:树的深度----------------" << endl;cout << "--------------8:树根到叶子的最长路径----" << endl;cout << "--------------9:交换所有节点左右子女----" << endl;cout << "--------------10:顺序存储---------------" << endl;cout << "--------------11:显示顺序存储-----------" << endl;cout << "--------------12:退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl;if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1();break;case 2:test2();break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:cout << "测试结束!" << endl;break;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果测试用例:1.创建二叉树(二叉链表形式)2.前序遍历3.中序遍历4.后序遍历5.总结点数6.叶子结点数7.树的深度8.树根到叶子的最长路径9.交换所有左右子女10.顺序存储七、思考讨论题或体会或对改进实验的建议通过这次实验,我掌握了二叉树的顺序存储和链式存储,体会了二叉树的存储结构的特性,掌握了二叉树的树上相关操作。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的本次实验的主要目的是通过实现一个简单的链表数据结构,来掌握链表的基本操作和算法。

二、实验内容本次实验的内容是实现一个简单的链表数据结构,包括链表的创建、插入、删除、修改和遍历等基本操作,并应用链表实现一个学生信息管理系统。

三、实验步骤1.创建链表数据结构的定义:定义一个结构体,包含学生的姓名、学号和成绩等信息。

2.实现链表的创建操作:通过不断插入结点的方式,构建一个带头结点的链表。

3.实现链表的插入操作:在链表中插入一个新的结点,需要考虑插入位置和插入的数据。

4.实现链表的删除操作:根据给定的条件,在链表中删除特定的结点。

5.实现链表的修改操作:根据给定的条件,在链表中特定的结点并修改其数据。

6.实现链表的遍历操作:按照一定顺序,遍历整个链表并输出结点的数据。

7.利用链表数据结构实现学生信息管理系统:实现添加学生信息、删除学生信息、修改学生信息和查找学生信息等功能。

四、实验结果通过实验,我们成功实现了一个简单的链表数据结构,并应用链表实现了一个学生信息管理系统。

我们可以通过系统来添加学生信息、删除学生信息、修改学生信息和查找学生信息。

五、实验总结通过本次实验,我深入理解了链表数据结构的定义、操作和应用。

链表是一种常用的数据结构,具有插入、删除和查找等操作的高效性。

通过实现链表,我加深了对链表操作和算法的理解,并学会了如何应用链表来解决实际问题。

在实际应用中,链表还可以结合其他数据结构或算法来实现更复杂的功能。

例如,可以使用链表来实现栈和队列等数据结构,还可以应用链表算法来解决图论和图像处理等问题。

通过本次实验,我不仅学会了链表的基本操作和算法,还培养了动手实践、问题解决和团队合作的能力。

这对于我的进一步学习和发展都非常有帮助。

我相信,通过不断实践和学习,我将能够运用数据结构来解决更复杂的实际问题。

数据结构实验报告实验一线性表

数据结构实验报告实验一线性表

数据结构实验报告实验名称: 实验一线性表学生姓名:班级:班内序号:学号:1.日期: 2013年11月7日2.实验要求①实验目的:➢通过选择下面四个题目之一进行实现, 掌握如下内容:➢熟悉C++语言的基本编程方法, 掌握集成编译环境的调试方法➢学习指针、模板类、异常处理的使用➢掌握线性表的操作的实现方法➢学习使用线性表解决实际问题的能力②实验要求:1、线性表存储结构(五选一):2、带头结点的单链表3、不带头结点的单链表4、循环链表5、双链表6、静态链表1、线性表的基本功能:2、构造: 使用头插法、尾插法两种方法3、插入: 要求建立的链表按照关键字从小到大有序4、删除5、查找6、获取链表长度7、销毁其他: 可自行定义编写测试main()函数测试线性表的正确性。

③代码要求:➢ 1.必须要有异常处理, 比如删除空链表时需要抛出异常;➢2、保持良好的编程的风格:➢代码段与段之间要有空行和缩近➢标识符名称应该与其代表的意义一致➢函数名之前应该添加注释说明该函数的功能➢关键代码应说明其功能2.程序分析2.1 存储结构存储结构为单链表, 示意图:2.2 关键算法分析(1)关键算法:(2)头插法每次插入元素都从单链表的第一个结点位置插入, 先前插入的结点随着新结点插入而不断后移。

执行过程:在堆中建立新结点: Node*s=new Node;②将a[i]写入到新结点的数据域: s->data=a[i];③修改新结点的指针域: s->next=front->next;(3)④修改头结点的指针域, 将新结点加入到链表中:front->next=s;(4)尾插法每次新插入的元素都在单链表的表尾。

通常尾插法需要一个指针变量保存终端结点的地址, 成为尾指针, 设为r。

每插入一个结点后, r指向新插入的终端结点。

步骤:在堆中建立新结点: Node*s=new Node;②将a[i]写入到新结点的数据域: s->data=a[i];③将新结点加入到链表中: r->next=s;(5)④修改尾指针: r=s;(6)按位查找获取单链表第i个位置上的元素其结点地址。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的本次数据结构实验旨在通过实际操作和编程实现,深入理解和掌握常见的数据结构及其操作方法,提高编程能力和问题解决能力。

二、实验环境操作系统:Windows 10编程工具:Visual Studio 2019编程语言:C++三、实验内容(一)线性表1、顺序表实现顺序表的创建、插入、删除、查找等基本操作。

分析顺序表在不同操作下的时间复杂度。

2、链表实现单链表、双向链表的创建、插入、删除、查找等操作。

比较单链表和双向链表在操作上的优缺点。

(二)栈和队列1、栈用数组和链表分别实现栈的基本操作。

验证栈的“后进先出”特性。

2、队列实现顺序队列和循环队列。

分析循环队列在解决“假溢出”问题上的优势。

(三)树1、二叉树实现二叉树的创建、遍历(前序、中序、后序)。

计算二叉树的高度和节点数。

2、二叉搜索树实现二叉搜索树的插入、删除、查找操作。

分析二叉搜索树的性能。

(四)图1、图的存储用邻接矩阵和邻接表存储图。

比较两种存储方式的优缺点。

2、图的遍历实现深度优先遍历和广度优先遍历。

应用图的遍历解决实际问题,如寻找最短路径。

四、实验步骤(一)线性表1、顺序表定义一个数组来存储顺序表的元素。

实现插入操作时,若插入位置合法,将插入位置后的元素依次向后移动一位,然后将新元素插入指定位置。

实现删除操作时,若删除位置合法,将删除位置后的元素依次向前移动一位。

查找操作通过遍历数组实现。

分析时间复杂度,插入和删除操作在最坏情况下为 O(n),查找操作平均时间复杂度为 O(n/2)。

2、链表定义节点结构体,包含数据域和指针域。

单链表的插入操作,找到插入位置的前一个节点,修改指针完成插入。

单链表的删除操作,找到删除节点的前一个节点,修改指针完成删除。

双向链表在单链表的基础上增加了前驱指针,操作时更加方便。

比较单链表和双向链表,单链表在插入和删除操作时只需要修改一个指针,空间复杂度较低;双向链表在查找前一个节点时无需遍历,时间复杂度更低。

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

篇一:数据结构实验报告(c语言)(强力推荐) 数据结构实验 实验内容和目的: 掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。学习基本的查找和排序技术。让我们在实际上机中具有编制相当规模的程序的能力。养成一种良好的程序设计风格。 实验教材: 数据结构题集(c语言版) 清华大学出版社2007年 实验项目: 实验一、栈和循环队列 ㈠、实验内容: ① 栈 掌握栈的特点(先进后出filo)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。本程序采用的是链栈结构,具有初始化一个栈、push、pop、显示所有栈里的元素四个功能。 ② 循环队列 掌握队列的特点(先进先出fifo)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。 ㈡、实验代码 ① 栈 程序代码: #include <stdio.h> #include <malloc.h> #define stack_size 6 #define error 0 #define ok 1 typedef int selemtype; typedef struct snode { selemtype data; struct snode *next;}snode,*linkstack; int creattwo(linkstack &head,int n) { int i; snode *p; head=(linkstack)malloc(sizeof(snode)); head->next=null; printf(请输入数据(数字):\n); for(i=n;i>0;--i) { p=(snode *)malloc(sizeof(snode)); scanf(%d,&p->data); p->next=head->next; head->next=p; } return 1; } int menu_select() { int sn; for(;;) { scanf(%d,&sn); if(sn<1||sn>6) printf(\n\t输入错误,请重新输入\n); else break; } return sn; } int push(linkstack &top,selemtype e) { snode *q; q=(linkstack)malloc(sizeof(snode)); if(!q) { printf(溢出!\n); return(error); }q->data=e; q->next=top->next; top->next=q; return(ok); } int pop(linkstack &top,selemtype &e) { snode *q; if(!top->next) {printf(error!\n); return(error);} e=top->next->data; q=top->next; top->next=q->next; free(q); return(ok); } void main() {int e; linkstack top; while(1) { switch(menu_select()) { case 1: if(creattwo(top,stack_size))printf(success!\n);break;case 2: printf(push:\n); scanf(%d,&e); if(push(top,e))printf(success!\n); break; case 3: if(pop(top,e))printf(success!\n); printf(%d\n,e); break; case 4: linkstack p; printf(所有栈里的元素:\n); p=top; while(p->next){p=p->next; printf(%7d,p->data); } printf(\n); break; case 5: return; } } } 运行结果: ② 循环队列 程序代码: #include<stdlib.h> #include<stdio.h> #define overflow -1 #define ok 1 #define error 0 #define maxsize 100 typedef struct { int *elem;//队列存储空间 int front;int rear; //判断选择是否正确 int menu_select() { int sn; for(;;) { scanf(%d,&sn); if(sn<1||sn>6) printf(\n\t输入错误,请重新输入\n);else break; } return sn; } { q.elem=(int *)malloc(maxsize*sizeof(int)); if(!q.elem)exit(overflow); q.front=q.rear=-1; for(int i=0;i<maxsize;i++) q.elem[i]=-1; return ok; } //返回q的元素个数 { return (q.rear-q.front+maxsize)%maxsize; } //显示队列的元素 { for(int i=0;i<=queuelength(q);i++) if(q.elem[i]!=-1)printf(%d ,q.elem[i]);printf(\n); } //入队篇二:数据结构实验报告 本科生实验报告 (五) 姓名: 学院: 专业: 班级: 实验课程名称:数据结构实验 实验日期:2013年6月19 日 指导教师及职称: 实验成绩: 开课时间:2012~2013 学年 第二学期 实验管理中心印制 篇三:《数据结构》实验报告 姓名:关宏新 学号:089074114 班级:计084班 指导教师:储岳中 实验一 线性表基本操作的实现 一、 实验目的 1、 掌握使用turbo c2.0上机调试线性表的基本方法; 2、 掌握线性表的基本操作:插入、删除、查找等运算在顺序存储结构和链式存储结构上的运算。 二、实验要求 1、 链表插入、删除和查找算法的代码; 2、 程序运行结果及分析; 3、 实验总结。 三、实验内容 1、 认真阅读和掌握本实验的参考程序。 2、 上机运行本程序,并完善删除、查找等运算。 3、 保存程序的运行结果,并结合程序进行分析。 4、 按照你对链表操作需要,重新改写算法并运行,实现链表的插入、删除、查找等运算,并保存运行结果。 四、程序流程图、算法及运行结果 1-1 #include stdio.h #include stdlib.h #define maxsize 100 struct seqlist { intdata[maxsize]; intlength; }; typedef struct seqlist *pseqlist; pseqlist creaenulllist_seq() { pseqlist palist=(pseqlist)malloc(sizeof(struct seqlist)); if(palist!=null) { palist->length=0; return(palist); } printf(out of space!!\n); return null; } int isnulllist_seq(pseqlist palist) { return (palist->length==0); } int insertpre_seq(pseqlist palist,int p,int x)int q; if(palist->length>=maxsize) { printf(overflow!\n); return(0); } if(p<0 || p>palist->length) { printf(not exist!\n); return(0); } if(isnulllist_seq(palist)) { palist->data[0]=x; palist->length=1; return(1); } for(q=palist->length-1;q>=p;q--) palist->data[q+1]=palist->data[q] ; palist->data[p]=x; palist->length= palist->length+1; return(1); } void main() { int i; pseqlist list; list=creaenulllist_seq(); printf(插入前的顺序表为:\n ); for(i=0;i<=9;i++) { insertpre_seq(list,i,i*i); printf( %d , list->data[i]); } insertpre_seq(list,5,55); printf(\n插入后的顺序表为:\n ); for(i=0;i<list->length;i++) printf( %d , list->data[i]); printf(\n); getch(); 1-2 #include stdio.h #include stdlib.h #define maxsize 100 struct seqlist { intdata[maxsize]; intlength; }; typedef struct seqlist *pseqlist;

相关文档
最新文档