数据结构实验-线性表及其应用

实验1 线性表及其应用实验性质:验证性实验学时:2学时一、实验目的1.掌握线性表的顺序存储结构在计算机的表示方法及其基本操作的实现;2.掌握线性表的链式存储结构在计算机的表示方法及其基本操作的实现;3.能够利用线性表结构对实际问题进行分析建模,利用计算机求解。

二、实验预备知识1.复习C/C++语言相关知识(如:结构体的定义、typedef的使用、函数的定义、调用及参数传递方式);2.阅读并掌握顺序表与链表的类型定义及其查找、插入、删除等基本操作。

三、实验内容1.理解并分别用顺序表、链表的操作运行下列程序:#include <iostream>using namespace std;#include "Status.h"typedef int ElemType;#include "SqList.h" //用#include "LinkList.h"替换void main(){SqList L; //用LinkList L;替换,与#include "LinkList.h"配合int n,i;ElemType e;InitList(L);cout<<"\nL=";ListTraverse(L);cout<<"\n请设置将向线性表L中输入的元素个数:";cin>>n;CreateList(L,n);cout<<"\nL=";ListTraverse(L);cout<<"\nL的表长为:"<<ListLength(L)<<endl;cout<<"\n请输入想要获取的元素位序:";cin>>i;if(GetElem(L,i,e)) cout<<"\n第"<<i<<"个元素为:"<<e<<endl;else cout<<"\n第"<<i<<"个元素不存在!"<<endl;cout<<"\n请输入要查找的元素:";cin>>e;if(i=LocateElem(L,e)) cout<<"\n元素"<<e<<"的位置为:"<<i<<endl;else cout<<"\n元素"<<e<<"不存在!"<<endl;cout<<"\n请输入插入位置和所插入元素:";cin>>i>>e;if(ListInsert(L,i,e)){cout<<"\nL=";ListTraverse(L);}else cout<<"\n插入操作失败!"<<endl;cout<<"\n请输入被删元素的位置:";cin>>i;if(ListDelete(L,i,e)) cout<<"\n被删元素为:"<<e<<endl;else cout<<"\n删除操作失败!"<<endl;cout<<"\nL=";ListTraverse(L);}本题目说明:(1)头文件Status.h的内容如下:#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;(2)头文件SqList.h(内容包括顺序表的结构定义及基本操作实现)。

(3)头文件LinkList.h(内容包括链表的结构定义及基本操作实现)。

(4)顺序表中基本操作的补充:● CreateList(&L,n):向顺序表L中输入n个元素(0≤n≤MAXSIZE)。

Status CreateList(SqList &L,int n){int i;if(!L.elem||n<0||n>MAXSIZE) return ERROR;cout<<"\n请输入"<<n<<"个元素:";for(i=1;i<=n;i++)cin>>L.elem[i-1]; //可以用随机函数rand()自动生成L.length=n;return OK;}● ListTraverse(L):以线性表的记录形式遍历输出顺序表L,例如:(a1,a2,…,ai,…an)。

void ListTraverse(SqList L){int i;cout<<'(';for(i=1;i<=L.length;i++)cout<<L.elem[i-1]<<',';if(L.length) cout<<"\b)"<<endl;else cout<<')'<<endl;}2.设计实现一个算法,用以对两个非递减有序表A、B进行合并,其中A=(2,5,8,9) ,B=(3,4,8,10,12,20)。

3.(任选题)已知有两个多项式P(x)和Q(x),基于链表设计算法实现P(x)+Q(x)运算,而且不重新开辟存储空间。

实验2 栈和队列的实现实验性质:验证性实验学时:2学时一、实验目的1.掌握栈的特点、在计算机中的存储表示方法及其基本操作的实现;2.掌握队列的特点、在计算机中的存储表示方法及其基本操作的实现;3.能够利用栈和队列求解一些常见问题。

二、实验预备知识1.阅读并掌握顺序栈、链栈两种存储方法的类型定义及其压栈、弹栈等基本操作。

2.阅读并掌握循环队列、链队列两种存储方法的类型定义及其入队、出队等基本操作。

三、实验内容1.理解并用顺序栈操作运行下列程序:#include <iostream>using namespace std;#include "Status.h"typedef int ElemType;#include "SqStack.h"void main(){SqStack S;ElemType e;InitStack(S);Push(S,2);Push(S,4);Push(S,6);Push(S,8);cout<<"\n由栈底至栈顶的元素为:";StackTraverse(S);cout<<"\n栈的长度为:"<<StackLength(S)<<endl;GetTop(S,e);cout<<"\n栈顶元素为:"<<e<<endl;Pop(S,e);cout<<"\n由栈底至栈顶的元素为:";StackTraverse(S);cout<<"\n栈的长度为:"<<StackLength(S)<<endl;GetTop(S,e);cout<<"\n栈顶元素为:"<<e<<endl;}2.理解并用循环队列、链队列操作运行下列程序:#include <iostream>using namespace std;#include "Status.h"typedef int ElemType;#include "SqQueue.h"void main(){SqQueue Q;ElemType e;InitQueue(Q);EnQueue(Q,1);EnQueue(Q,3);EnQueue(Q,5);EnQueue(Q,7);GetHead(Q,e);cout<<"\n队头元素为:"<<e<<endl;cout<<"\n队列中从队头至队尾的元素为:";QueueTraverse(Q);cout<<"\n队列的长度为:"<<QueueLength(Q)<<endl;DeQueue(Q,e);cout<<"\n出队的元素为:"<<e<<endl;cout<<"\n出队操作完成之后队列中从队头至队尾的元素为:";QueueTraverse(Q);cout<<"\n队列的长度为:"<<QueueLength(Q)<<endl;}本题目说明:(1)头文件Status.h的内容同实验1。

(2)头文件SqStack.h(内容包括顺序栈的结构定义及基本操作实现)。

(3)头文件SqQueue.h(内容包括循环队列的结构定义及基本操作实现)。

(4)顺序栈中基本操作的补充:●StackTraverse(S):从栈底到栈顶依次对S的每个数据元素进行访问。

void StackTraverse(SqStack S){ElemType *p;p=S.base;while(p!=S.top){cout<<*p++<<" ";}cout<<endl;}(5)循环队列中基本操作的补充:●QueueTraverse(L):从队头到队尾,依次对Q的每个数据元素访问。

void QueueTraverse(SqQueue Q){int i;i=Q.front;while(i!=Q.rear){cout<<Q.base[i]<<" ";i=(i+1)%MAXSIZE;}cout<<endl;}3.从键盘输入一个表达式,试编写算法计算表达式的值。

合集下载

线性表实验报告

线性表实验报告

安徽师范大学数学计算机科学学院实验报告专业名称物联网工程实验室 6号楼2060404实验课程数据结构实验名称顺序表姓名庞现然学号 14111206029 同组人员无实验日期 2015.4.91、实验目的1. 熟练掌握顺序表的类型定义和基本操作算法(以建立、插入、删除、遍历、排序和归并等操作为重点)的实现。

2. 通过实验加深对C语言的使用(特别是函数、数组、结构体和指针)。

3. 掌握模块化程序设计方法。

2、实验原理运用各函数的调用,来实现线性表的基本操作。

3、需求分析输:(1)程序目的:实验线性表的基本操作。

(2)输入的形式:线性表(3)输入值的范围:处理范围内(4)输出的形式:线性表(5)程序能达到的功能:实现线性表的基本操作(6)测试数据:13,5,27,9,32,123,76,98,54,874、概要设计typedef int Status;typedef int ElemType;5、详细设计各函数及其定义:开始1.构造初始化线性表!InitList(&L)2.输入10个元素给线性表L(整数):1.输出顺序表DispList(&L); 6.输出元素的位置2.输出顺序表的长度 7.插入数据ListInsert(&L,4,56)3.输入所要查询的元素为序n 8.输出此时的线性表DispList(&L)4.输出第n个数据的值 9.输出顺序表的表长5.输入一个要查询的元素的值 10.删除数据元素ListDelete(&L,n,&e) 11.销毁线性表结束1.Status InitList(Sqlist *L)//初始化线性表!{L->elem = (ElemType *)malloc(LIST_Init_Size*sizeof(ElemType));if(! L->elem) exit (OVERFLOW) ; //储存分配失败L->length = 0; //空表长度为0L->listsize = LIST_Init_Size; //初始储存量return OK;}//InitLIst_Sq2.void DestroyList(Sqlist *L)//销毁线性表!{free(L);}//DestroyList_Sq3.Status ListEmpty(Sqlist L)//判定是否为空表!{if(L.length == 0)return ERROR;//如L为空表,则返回0,否则返回1.return OK;}//ListEmpty_Sq4.Status ListLength(Sqlist *L)//求线性表的长度!{return(L->length);}//ListLength_Sq5.void DispList(Sqlist *L)//输出线性表!{int i;/*if ( ListEmpty(L) == 0 ) return;//判断是否为空? */ for ( i = 0; i<L->length;i++){printf("%d ",L->elem[i]);} printf("\n");}//DIspList_Sq6.int GetElem(Sqlist *L,int i,ElemType *e)//求某个数据元素的值!{if (i<1 || i>L->length) return 0;e = &L->elem[i-1];//该运算返回L中第 i(1≤i≤ListLength(L))个元素的值,存放在e中return OK;}//GetElem_Sq7.int LocateElem(Sqlist *L,ElemType e)//按元素查找!{int i = 0;while (i < L->length && L->elem[i] != e)i++;if (i >= L->length)return 0; //若这样的元素不存在,则返回值为0。

线性表的基本操作及其应用

线性表的基本操作及其应用

线性表的基本操作及其应用一、实验目的1、帮助学生复习C++语言程序设计中的知识。

2、熟悉线性表的逻辑结构。

3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。

二、实验内容单链表的基本操作[问题描述]实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。

[基本要求](1)依次从键盘读入数据,建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。

三、概要设计各操作的具体函数实现:1.用尾插法建立带头结点的链表可任意输入元素(char 型),void CreatList(LinkList &L){//LinkList p;L=(LinkList)malloc(sizeof(LNode));int n=0,j=0;L->next=NULL;cout<<"请输入结点个数:";cin>>n;for(int i=n;i>0;i--){LinkList p;p=(LinkList)malloc(sizeof(LNode));cout<<"请输入一个节点数据:"<<endl;cin>>p->data;p->next=L->next;L->next=p;Length++;//每增加一个数据,Length加一}}2.清空链表分析链表为空时,输出为空;当链表不为空时,清空链表,并输出原来的链表已经被清空!的字样告诉操作者,链表已为空了int ClearList(LinkList &L){if(L->next==NULL){cout<<"链表为空!";}else {{LinkList p,q;p=L->next;while(p){q=p;p=p->next;-- Length;delete q;}}cout<<"原来的链表已经被清空!!"<<endl;}return OK;}3.求链表的长度在建立链表是已经用Length着个全局变量记载建立的结点的个数,即链表的长度用cout<<Length就可以得到链表的长度:int Listlength(LinkList L){cout<<"链表长度为:"<<Length<<endl;return Length;}4.链表元素的展示用函数DisplayList(LinkList L)实现,首先判断链表是否为空,当链表不为空时,在从第一个元素找到并输出,主要步骤为:LinkList p;p=L->next;cout<<"链表中的数据依次为:"<<'\t';while(p){cout<<p->data<<" ";p=p->next;}5.从链表中查找元素用函数GetElem_L(LinkList L)来实现该功能。

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

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

实验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.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。

《数据结构》实验报告模板(附实例)--实验一线性表的基本操作实现

《数据结构》实验报告模板(附实例)--实验一线性表的基本操作实现

《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。

2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。

二、实验内容√ 1、单链表的表示与操作实现 ( * )2、约瑟夫环问题3、Dr.Kong的艺术品三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。

2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。

3、严格按照数据结构实验报告模板和规范,及时完成实验报告。

四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、单链表的结点类型定义/* 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;2、初始化单链表LinkedList LinkedListInit( ){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 }3、清空单链表void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数}4、检查单链表是否为空int LinkedListEmpty(LinkedList L){ …. }5、遍历单链表void LinkedListTraverse(LinkedList L){….}6、求单链表的长度int LinkedListLength(LinkedList L){ …. }7、从单链表表中查找元素LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 }8、从单链表表中查找与给定元素值相同的元素在链表中的位置LinkedList LinkedListLocate(LinkedList L, DataType x){ …… }9、向单链表中插入元素void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法// 在链表中第i 个结点之前插入新的元素 x}10、从单链表中删除元素void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 }11、用尾插法建立单链表LinkedList LinkedListCreat( ){ …… }㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结五、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。

数据结构实验报告-实验:1线性表的顺序存储和操作实现

数据结构实验报告-实验:1线性表的顺序存储和操作实现
System.exit(1);
}
for(inti=pos-1;i<length;i++)
if(listArray[i].equals(obj))returni+1;
return-1;
}
publicbooleanmodify(Object obj,intpos){
if(pos<1||pos>length){
List sort();
}
publicclasssequenceListimplementsList {
finalintmaxSize=10;
privateintlength;
privateObject[]listArray;
publicsequenceList(){//无参数的构造函数的定义
length=0;//线性表初始为空,即长度为0
System.out.println();
list2.preOrder();
System.out.println("线性表list2长度:"+list2.size());
}
}
publicinterfaceList {
Object value(intpos);
booபைடு நூலகம்eanadd(Object obj,intpos);
int[] a={20,16,38,42,29};
for(inti=0;i<a.length;i++) list1.add(a[i], i+1);
intn1=(Integer)list1.remove(2);
list1.add(80, 3);
intn2=(Integer)list1.value(4);

数据结构线性表应用

数据结构线性表应用

实验一线性表应用一. 实验目的1、掌握用Turbo C或VC++上机调试线性表的基本方法;2、掌握线性表的基本操作,如插入、删除、查找,以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;并能够运用线性表基本操作解决问题,实现相应算法。

二. 实验学时:课内实验学时:2学时课外实验学时:4学时三.备选实验题目1.单链表基本操作练习(实验类型:验证型)1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:1…建立链表2…连接链表3…输出链表0…结束2)实验要求:在程序中定义下述函数,并实现所要求的函数功能:CreateLinklist( ): 从键盘输入数据,创建一个单链表ContLinklist( ):将前面建立的两个单链表首尾相连OutputLinklist( ):输出显示单链表3)实验提示:✧单链表数据类型定义(C语言)# include <stdio.h>typedef int ElemType; //元素类型typedef struct LNode{ ElemType data;struct LNode *next;}LNode,*LinkList;✧为了算法实现简单,最好采用带头结点的单向链表。

4)注意问题:✧重点理解链式存储的特点及指针的含义。

✧注意比较顺序存储与链式存储的各自特点。

✧注意比较带头结点、无头结点链表实现插入、删除算法时的区别。

✧单链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。

2.顺序表基本操作练习(实验类型:验证型)1)问题描述:✧从键盘输入一组整型元素序列,建立顺序表。

✧实现该顺序表的遍历。

✧在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。

✧判断该顺序表中元素是否对称,对称返回1,否则返回0。

2)实验要求:✧对应问题描述,在程序中定义4个相应的函数,实现上面要求的函数功能:✧在主程序中设计一个简单的菜单,调用上述4个函数3)实验提示:✧顺序表存储数据类型定义(C语言)# define MAXSIZE 100 //表中元素的最大个数typedef int ElemType; //元素类型typedef struct list{ElemType elem[MAXSIZE]; //静态线性表int length; //表的实际长度}SqList; //顺序表的类型名4)注意问题:✧插入、删除时元素的移动原因、方向及先后顺序。

数据结构线性表应用

数据结构线性表应用在计算机科学领域中,数据结构是一门至关重要的学科,它为我们提供了高效组织和管理数据的方法。

其中,线性表作为一种基本的数据结构,具有广泛的应用场景。

线性表是由零个或多个数据元素组成的有限序列。

这些数据元素在逻辑上是线性排列的,也就是说,它们之间存在着一种顺序关系。

常见的线性表实现方式有顺序表和链表。

顺序表是一种采用连续存储空间来存储数据元素的线性表。

它的优点是可以随机访问元素,时间复杂度为 O(1)。

这意味着,如果我们知道元素在顺序表中的位置,就能够快速地获取到该元素。

想象一下,我们有一个学生成绩的顺序表,要查找第 10 个学生的成绩,直接根据索引就能迅速找到。

顺序表在需要频繁进行随机访问的场景中表现出色,比如在数据库中存储数据时。

然而,顺序表也有它的局限性。

当需要插入或删除元素时,如果插入或删除的位置不是在表尾,就需要移动大量的元素,时间复杂度为O(n)。

这在数据量较大时,可能会导致性能下降。

相比之下,链表则在插入和删除操作上具有优势。

链表中的每个节点包含数据元素和指向下一个节点的指针。

当进行插入或删除操作时,只需要修改相关节点的指针即可,时间复杂度为 O(1)。

比如,在一个购物车的链表中,添加或删除商品时,不需要移动其他商品的位置,操作效率很高。

线性表在日常生活中的应用比比皆是。

以我们常见的排队为例,排队的人群可以看作是一个线性表。

每个人按照先后顺序排列,新加入的人排在队尾,离开的人从队首离开。

这种先入先出的特性,与线性表中的队列结构相似。

在计算机程序中,线性表也有广泛的应用。

比如,在文本编辑软件中,我们输入的字符序列可以看作是一个线性表。

当我们进行插入、删除字符的操作时,就是对这个线性表进行修改。

再比如,在操作系统的进程管理中,进程可以按照它们的创建顺序或者优先级排列成一个线性表。

操作系统在调度进程时,需要根据线性表中的信息来决定哪个进程先执行,哪个进程后执行。

在软件开发中,线性表也常用于实现栈这种数据结构。

数据结构--线性表实验报告+二叉树实验报告

数据结构--线性表实验报告+二叉树实验报告班级:学号:姓名:日期:1. 实验题目编辑一个程序,用来演示线性表的建立、插入、删除等操作。

2. 需求分析本演示程序在Microsoft Visual C++ 6.0环境下编写调试,完成线性表的生成、任意位置的插入、删除等。

(1)输入的形式和输入的范围:执行插入操作时,需要输入插入位置和元素的值;执行删除操作时,需要输入待删除元素的位置。

在所有输入中,元素的值都是由整数、字符数组和字符数组组成的。

(2)输出的形式:在所有操作中都要求显示相关操作是否正确以及操作后线性表的内容。

其中删除操作完成后,要显示删除后所剩的元素的值。

(3)程序所能达到的功能:完成线性表的生成、插入、删除操作。

3. 概要设计(1)为了实现上述程序功能,需要定义线性表的数据结构。

线性表单个元素的结构如图1.1所示。

图1.1 线性表元素的数据结构(2)本程序包含6个函数:①主函数main()。

②初始化线性表函数creat()。

③插入元素函数insert()。

④删除元素函数del()。

线性表实验报告+二叉树实验报告各函数间的关系如图1.2所示。

图1.2 程序所包含各函数之间的关系4. 详细设计实现概要设计中定义的所有的数据类型,对每个操作给出具体的算法;对主程序和其他模块也都需要写出具体算法。

(一)数据类型。

用C语言描述如下:typedef struct {int num; float score; }student;(二)线性表的基本操作函数的具体算法:1. 主函数main()的具体算法:void main() {student L; creat(L); insert(L); del(L); }2. 初始化线性表函数creat()的具体算法:void creat(student s) {printf(“输入学生数据:\n"); for(i=0;ii++)scanf("%d%f",s[i].num,s[i].score);线性表实验报告+二叉树实验报告printf("目前数据数:%d组\n",i); for(i=0;ii++)printf("%d\t%5.1f\t\n",s[i].num,s[i].score); }3. 插入元素函数insert()的具体算法:void insert(student s) {printf("输入插入数据位置:\n"); scanf("%d", if(j4)printf("输入有误,请输入在0~4之间\n"); scanf("%d", // if(j=4)// printf("输入插入数据:\n");// scanf("%d%f",s[j-1].num,s[j-1].score); if(j=4)for(i=3;i=j-1;i--) s[i]=s[i-1];printf("输入插入数据:\n");scanf("%d%f",s[j-1].num,s[j-1].score); n=n+1;printf("目前数据数:%d组\n",n); for(i=0;ii++)printf("%d\t%5.1f\t\n",s[i].num,s[i].score); }4. 删除元素函数del()的具体算法:void del(student s) {printf("输入删除数据位置:\n"); scanf("%d", if(j4)printf("输入有误,请输入在0~4之间\n"); scanf("%d", for(i=j-1;ii++) s[i]=s[i+1]; n=n-1;printf("目前数据数:%d组\n",n); for(i=0;ii++)。

《数据结构》实验1实验报告

南京工程学院实验报告<班级>_<学号>_<实验X>.RAR文件形式交付指导老师。

一、实验目的1.熟悉上机环境,进一步掌握语言的结构特点。

2.掌握线性表的顺序存储结构的定义及实现。

3.掌握线性表的链式存储结构——单链表的定义及实现。

4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。

5.掌握线性表在链式存储结构——单链表中的各种基本操作。

二、实验内容1.顺序线性表的建立、插入及删除。

2.链式线性表的建立、插入及删除。

三、实验步骤1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。

2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。

3.建立一个带头结点的单链表,结点的值域为整型数据。

要求将用户输入的数据按尾插入法来建立相应单链表。

四、程序主要语句及作用程序1的主要代码(附简要注释)public struct sequenlist{public const int MAXSIZE=1024; /*最大值为1024*/public elemtype[] vec;public int len; /* 顺序表的长度 */public sequenlist( int n){vec=new elemtype[MAXSIZE ];len = n;}};class Program{static void Main(string[] args){sequenlist list1 = new sequenlist(5);for (int i = 0; i < 5; i++){list1.vec[i] = i;}for (int i = 0; i < 5; i++){Console.Write("{0}---", list1.vec[i]) ;}Console.WriteLine("\n");Console.WriteLine("表长:{0}\n",list1.len );Console.ReadKey();}}程序2的主要代码(附简要注释)public void insertlist(int i, int x){if (len >= MAXSIZE)throw new Exception("上溢"); /*长度大于最大值则抛出异常*/if (i < 1 || i > len + 1)throw new Exception("位置");/插入位置小于1或大于len+1则抛出插入位置错误的异常for (int j = len; j >= i; j--)vec[j] = vec[j - 1]; //注意第j个元素存在数组下标为j-1处vec[i - 1] = x;len++;}};class Program{static void Main(string[] args){sequenlist list2 = new sequenlist(7);list2.vec[0] = 21;list2.vec[1] = 23;list2.vec[2] = 14;list2.vec[3] = 5;list2.vec[4] = 56;list2.vec[5] = 17;list2.vec[6] = 31;Console.Write("请输入第i个位置插入元素:");int loc =Convert.ToInt32( Console.ReadLine());Console.Write("请输入第{0}个位置插入的元素:", loc);int ele = Convert.ToInt32(Console.ReadLine());Console.WriteLine("插入前的线性表:");for (int i = 0; i < list2.len ; i++){Console.Write("{0}---", list2.vec[i]);}Console.WriteLine("\n");list2.insertlist(loc, ele);Console.WriteLine("插入后的线性表:");for (int i = 0; i < list2.len ; i++){Console.Write("{0}---", list2.vec[i]);}Console.WriteLine("\n");Console.ReadKey();}}程序3的主要代码(附简要注释)class Node{private int num;public int Num{set { num = value; }/输入值get { return num; }/获得值}private Node next;public Node Next{set { next = value; }get { return next; }}}class Pp{static void Main(string[] args){Node head;Node tempNode, tempNode1;int i;head = new Node();Console.WriteLine("输入六项数据:\n");Console.Write("输入第1项数据:");head.Num = Convert.ToInt32(Console.ReadLine());head.Next = null;tempNode = head;for (i = 1; i < 6; i++){tempNode1 = new Node();Console.Write("输入第{0}项数据:",i+1);tempNode1.Num = Convert.ToInt32(Console.ReadLine());/插入项转换为整形数值 tempNode1.Next = null;tempNode.Next = tempNode1;tempNode = tempNode.Next;}Console.WriteLine("线性表:");tempNode = head;for (i = 0; i < 6; i++){Console.Write("{0}", tempNode.Num);if (i < 5){Console.Write("--");}tempNode = tempNode.Next;}Console.ReadKey();}}五、程序运行结果截图程序1程序2程序3六、收获,体会及问题(写得越详细、越个性化、越真实越好,否则我不知道你做这个实验的心路历程,也就无法充分地判断你是否是独立完成的这个实验、你是否在做这个实验时进行了认真仔细地思考、通过这个实验你是否在实践能力上得到了提高)这次试验刚开始做时完全不知道从哪下手,才刚上了几节课,对于线性表、链式表都不是理解的很透彻,不知道用哪个软件编写程序。

线性表的应用(算法与数据结构课程设计)

线性表的应用一、问题描述线性表有两种不同的存储结构,分别是顺序存储结构和链式存储结构,在实际中应用十分广泛。

本设计要求分别利用线性表的两种存储结构,设计算法完成对大数的阶乘、加法、乘法的求解。

二、基本要求1、选择合适的存储结构实现大数存储;2、设计算法,采用顺序存储结构完成大数的阶乘运算;3、设计算法,采用链式存储结构完成大数的加法运算;4、设计算法,选择合适的存储结构完成大数的乘法运算;5、其中某一算法采用两种存储结构实现。

三、测试数据1、阶乘运算的测试数据:63!2、加法运算的测试数据: 9876876787+896789675599993、乘法运算的测试数据:9876876787×89678967559999四、算法思想1、阶乘运算的算法思想:一个数的阶乘,利用一个顺序表来存储结果,首先令L.elem[0]=1,其他全部赋值为零,再用for循环,从1至i完成阶乘运算,其中由于位数越乘越多,故将其按位存储在顺序表中,防止数据范围溢出,在逐位相乘中,利用for循环位数,如若有进位问题,每次运算时,此位保留的数位,t=L.elem[j]*i+jw; L.elem[j]=t%10;jw=t/10;如果满足j>=top && jw==0;程序跳出,进行下一步i运算,此处top位保留上一位的位数,如此运算下去,输出顺序表。

2、加法运算的算法思想:本运算分别采用了两种存储结构,链式和栈存储结构。

加法是两个数位数对齐,从低位向高位加的运算,如果在哪位有进位,则后一位,进行加法还要另加上前面的进位,由此将输入的字符大数,存入链表中,且改为整形存入,此时是的链表是倒序的,定义一个变量表示每次的进位jw=0,建立一个链表,让他存储结果,如此两链表的数相加,每次还要加上上次留下的进位,此为保留的数位:new->data =(p->data +q->data +jw)%10; new->next =NULL;jw =(p->data+q->data+jw)/10;当两个数是一场一短时,自然当相等的长度加完后在执行下面的判断,保留住剩下的数同时每次加上jw,最后就是当最后一位有进位时将最后一个链表值赋jw,由于现在此链表存储的结果是反序的,故将其压入栈中,让后再输出栈元素,就是想加的结果。

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