实验一 线性表(顺序表与链表)
实验一线性表操作实验报告
实验一线性表操作实验报告__大学计算机学院实验报告课程名称数据结构实验名称__线性表操作实验报告要求:1.实验目的 2.实验内容 3.实验步骤 4.运行结果 5.流程图 6.实验体会一、实验目的 1 熟悉并掌握线性表的逻辑结构、物理结构。
2 熟悉并掌握顺序表的存储结构、基本操作和具体的函数定义。
3 熟悉VC++程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互关系及各自的作用。
4 熟悉VC++操作环境的使用以及多文件的输入、编辑、调试和运行的全过程。
二、实验要求 1 实验之前认真准备,编写好程序。
2 实验中认真调试程序,对运行结果进行分析^p ,注意程序的正确性和健壮性的验证。
3 不断积累程序的调试方法。
三、实验内容基本题: 1 对元素类型为整型的顺序存储的线性表进行插入、删除和查找操作。
程序:#include #include #include const LIST_INIT_SIZE=10; const LISTINCREMENT=1; typedef struct { int _elem; int length; int listsize; }SqList; void InitList_Sq(SqListL) //构造一个空的线性表L { L.elem=(int_)malloc(LIST_INIT_SIZE_sizeof(int)); if(!L.elem)e_it(0); //存储分配失败 L.length=0; //空表长度为0L.listsize=LIST_INIT_SIZE; //初始存储容量 coutL.length+1)cout=L.listsize) //当前存储空间已满,增加分配 { int_newbase=(int_)realloc(L.elem,(L.listsize+LISTINCREMENT)_sizeof(int)); if(!newbase) e_it(0); //存储分配失败 L.elem=newbase; //新基址 L.listsize+=LISTINCREMENT; //增加存储容量 } int_q=(L.elem[i-1]); for(int_p=(L.elem[L.length-1]);=q;--p) _(p+1)=_p; _q=j; ++L.length; coutL.length)) cout>_; _p=_; p++;List.length++; } cout>y; if(y==1) { cout>m>>n;ListInsert_Sq(List,m,n); disp(List); } else if(y==2){ cout>m; ListDelete_Sq(List,m,j); cout>m; cout #include#include int a[100]; int josephus(int n,int s,int m) { if(!(n_s_m)) { cout>n; cout>s; cin>>m; _=josephus(n,s,m);cout>y; }while(y==1); getch; } 运行结果:(2)提高:#include using namespace std; typedef struct LNode { struct LNode _ne_t; int a; }LNode,_LinkList; class JosephouCircle //定义一个类包括三个元素 { public: void SetValue; void PickOut; private: int n; int s; int m; }; void JosephouCircle::SetValue //设置初值的大小{ cout>n; cout>s; cout>m; } void JosephouCircle::PickOut { LinkList L; LNode _p,_q; int j,k; L=(LinkList)malloc(sizeof(LNode)); L->ne_t=NULL; LNode_r; r=L; for (int i=1;ia=i; p->ne_t=NULL; r->ne_t=p; r=p; } p->ne_t=L->ne_t; p=L->ne_t; j=1;while(pjne_t;++j; } for(i=1;ine_t; } q=p->ne_t;p->ne_t=q->ne_t; p=q->ne_t; k=q->a; cout<<“输出的结果为:“<<k<<endl; free(q); } } int main(int argc,char_argv[]) { JosephouCircle Jo1; Jo1.SetValue; Jo1.PickOut; return 0; } 运行结果:四、实验体会与总结 1、对于线性链表和顺序表都属于线性表问题,但是线性链表比顺序表要灵活,方便;2、线性表在做元素寻找的操作的时候,必须从头结点开始寻找。
数据结构实验报告-线性表(顺序表实现)
实验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.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。
线性表的操作算法实验报告
实验报告2013学年第一学期任课老师:2、在实验过程中遇到的问题与解决方法:问题有很多,比如局部变量与全局变量的声明,常常顾此失彼,此处概念仍然不清。
填写内容时,可把表格扩大。
附:实验源程序代码顺序表(链表):// 线性表(链表)#include <stdio.h>#include "malloc.h"#include <iostream>using namespace std;typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;//创建一个长度为n的链表void CreateList(LinkList &L, int n) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;for (int i=n; i>0; --i){LinkList p = (LinkList)malloc(sizeof(LNode));cin>>p->data;p->next = L->next;L->next = p;}}// 在链表L第i个元素之前插入元素eint ListInsert(LinkList &L, int i, int e) {LinkList p=L;int j=0;while(p&&j<i-1) {p=p->next; ++j;}if(!p ||j>i-1) return 0;LinkList s = (LinkList)malloc(sizeof(LNode)); s->data=e;s->next=p->next;p->next=s;return 1;}// 在链表L中删除第i个元素,并由e返回其值int ListDelete(LinkList &L, int i, int &e) { LinkList p=L;int j=0;while(p->next&&j<i-1) {p=p->next; ++j;}if(!(p->next)||j>i-1) return 0;LinkList q=p->next;p->next=q->next;e=q->data;free(q);cout<<"被删除的元素数据为"<<e<<"\n"; return 0;}//查找第i个元素,并由e返回其值int GetElem(LinkList &L,int i, int &e) {LinkList p=L->next;int j=1;while (p && j<i) {p=p->next; ++j;}if (!p||j>i) return 0;e=p->data;cout<<"该元素的值为"<<e<<"\n";return 1;}//让链表L中的元素按从小到大的顺序排列LinkList Sort(LinkList L){ LinkList p,q;int temp;for(p=L;p!=NULL;p=p->next){for(q=p->next;q!=NULL;q=q->next){if(p->data>q->data){temp=q->data;q->data=p->data;p->data=temp;}}}return L;}//归并L和La得到新的单链性表Lbvoid MergeList_L(LinkList &L,LinkList &La,LinkList &Lb) { LinkList p,pa,pb;p=L->next;pa=La->next;Lb=pb=L; //用L的头结点作为Lb的头结点while (p&&pa) {if (p->data<=pa->data) {pb->next=p;pb=p;p=p->next;}else {pb->next=pa;pb=pa;pa=pa->next;}}pb->next=p?p:pa;free(La);}int main(){LinkList L;int n,s,e,i,f,g,h;cout<<"输入链表长度n:";cin>>n;cout<<"请输入L中的元素:"<<endl;CreateList( L, n);cout<<"输入的链表为:"<<" ";LNode *q=L->next;while(q){cout<<q->data<<" ";q=q->next;} cout<<endl;int choice;cout<<"请选择功能:"<<endl;cout<<"1.插入元素"<<endl;cout<<"2.删除元素"<<endl;cout<<"3.查找元素"<<endl;cout<<"4.给元素排序"<<endl;cout<<"5.合并链表"<<endl;cout<<"0.退出程序"<<endl;cout<<"PS:若先排序再合并,可将得到新的排序后的合并链表。
实验1顺序表和链表基本操作(学生)
实验一线性表运算的实现班级学号姓名一、实验预备知识1.复习C中函数的相关内容。
2.复习如何用主函数将多个函数连在一起构成一个C完整程序。
3.复习多文件结构。
二、实验目的1.掌握线性表的顺序和链式存储结构2.熟练运用线性表在顺序存储方式下的初始化、创建、输出、插入和删除运算3.熟练运用线性表在链式存储方式下的创建、输出、插入和删除运算三、实验要求1.编写初始化并创建线性表和输出线性表的算法。
2.编写对线性表插入和删除运算算法,要判断位置的合法性和溢出问题。
3.编写有序表的插入和删除运算算法。
4.编写一个主函数,将上面函数连在一起,构成一个完整的程序。
5.将实验源程序调试并运行,写出输入、输出结果,并对结果进行分析。
四、实验内容顺序表实验内容:1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。
2.初始化并建立顺序表。
(开辟的存储空间大小为8)3.编写顺序表输出算法。
4.依次插入3,21,15三个数,分别插入在第4,6和2位置,每插入一次都要输出一次顺序表。
5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次顺序表。
6.编写一个排序算法,对线性表中元素从小到大排列。
7.向有序表分别插入20和50,插入后表仍然有序。
(修改开辟的存储空间大小为15)单链表实验内容:1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。
2.建立一个带表头结点的单链表(前插入法和尾插入法都可以)。
3.编写单链表输出算法。
4.依次插入3,21,15三个数,分别插入在第4,6和12位置,每插入一次都要输出一次单链表。
5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次单链表。
6.编写一个排序算法,对线性表中元素从小到大排列。
7.分别删除值为25和42的元素,删除后表仍然有序。
五、实验结果给出程序清单及输入/输出结果六、总结1.实验过程中遇到的问题及解决方法2.收获北华航天工业学院《数据结构》课程实验报告实验题目:作者所在系部:作者所在专业:作者所在班级:作者学号:作者姓名:任课教师姓名:完成时间:北华航天工业学院教务处制一、实验目的1 掌握线性表的顺序和链式存储结构;2 熟练运用线性表在顺序存储方式下的初始化、创建、输出、插入和删除运算;3 熟练运用线性表在链式存储方式下的创建、输出、插入和删除运算。
数据结构实验报告顺序表和链表
实验报告课程名称数据结构实验项目实验一线性表的生成与操作题目一顺序表和链表的创建与基本操作系别___ _计算机学院 _ ______专业__ __计算机大类_ __班级/学号__(1406/2014011288)_____学生姓名 _______(孙文学)_________实验日期_(2015年10月19日)成绩_______________________指导教师黄改娟实验题目:实验一线性表的生成与操作------顺序表和链表的创建与基本操作(自己所选择实验题目,必填)一、实验目的1)掌握线性表的顺序存储和链式存储结构;2)验证顺序表及链表的基本操作的实现;(验证)3)理解算法与程序的关系,能够将算法转换为对应程序;4)体会线性表在实际应用中能够解决的问题。
(设计、综合)二、实验内容1)根据实验一题目列表,选定题目,说明题目的主要需求;2)结合所选定的题目,定义存储结构,并完成对应应用的线性表创建、插入、删除、查找等基本操作的算法描述;3)程序编码实现,并获得运行结果。
三、报告内容1)实验题目及主要存储结构定义(提示:请根据所选定题目,描述存储结构)题目:顺序表和链表的创建及基本操作顺序表我是采用数组存储的,链表是采用结构体存储的2)结合题目,说明对相应线性表的基本操作算法描述(提示:可用自然语言、流程图、伪代码等均可,要求对每一个操作,都给出具体的算法描述)基本操作:#顺序表#(1)插入:在线性表中的x位置插入y----将x位置及之后的元素都往后挪一位,将y的值赋给a[x].(2)删除:删除位置为x的元素----另y=a[x],然后x之后的元素都往前挪一位。
(3)查找:寻找值为y的元素----从a[0]开始,若a[i]==y,则返回i,否则i++。
#链表#(1)插入:当i小于要插入的位置x时,i++,插入p->data------p->next=s->next;s->next=p;(2)删除:当p->data不等于要删除的值x时,p=p->next;q=p->next;p->next=q->next;free(q);(3)查找:当p->data!=x时,p=p->next,找到之后返回p->data3)程序源码(提示:列出所编写程序的代码。
数据结构实验总结及心得体会
数据结构实验总结及心得体会引言数据结构作为计算机科学的基础课程,是理解和应用计算机编程的重要部分。
通过实验的形式,我们可以更加深入地理解不同数据结构的特点和应用场景。
本文将总结我在数据结构实验中的学习经验和心得体会。
实验一:线性表在线性表实验中,我学习了顺序表和链表两种基本的线性表结构。
顺序表使用数组来存储数据,具有随机访问的特点;链表使用指针来连接数据元素,具有插入和删除操作方便的特点。
通过这个实验,我深刻认识了线性表的存储结构和操作方法。
我遇到的难点是链表的插入和删除操作,因为涉及到指针的重新指向。
通过调试和分析代码,我逐渐理解了指针指向的含义和变化规律。
在实验结束后,我还进一步学习了循环链表和双向链表的特点和应用。
实验二:栈和队列栈和队列是两种常用的数据结构,可以用来解决很多实际问题。
在这个实验中,我学习了顺序栈、链式栈、顺序队列和链式队列四种基本实现方式。
实验中我遇到的最大困难是队列的循环队列实现,因为需要处理队列尾指针的位置变化。
我通过画图和调试发现了队列尾指针的变化规律,并在实验中成功实现了循环队列。
熟练掌握了栈和队列的操作方法后,我进一步学习了栈的应用场景,如表达式求值和括号匹配等。
队列的应用场景还有优先级队列和循环队列等。
实验三:串串是由零个或多个字符组成的有限序列,是实际应用中十分常见的数据类型。
在这个实验中,我学习了串的存储结构和常规操作。
实验中最具挑战性的部分是串的模式匹配。
模式匹配是在一个主串中查找一个子串的过程,可以使用暴力匹配、KMP 算法和BM算法等不同的匹配算法。
在实验中,我实现了KMP算法,并在实际应用中进行了测试。
从实验中我学到了使用前缀表和后缀表来提高模式匹配的效率。
同时,在应用中也了解到了串的搜索和替换等常见操作。
实验四:树和二叉树树是一种重要的非线性数据结构,应用广泛。
在这个实验中,我学习了树的基本概念、存储结构和遍历方式。
实验中最困难的部分是二叉树的遍历。
链表实验报告总结doc
链表实验报告总结篇一:顺序表,链表总结实验报告实验报告实验目的:学生管理系统(顺序表)实验要求:1.建表2.求表长3.插入4.查找5.删除6.列表7.退出源程序:#include#include#include#define MaxSize 1000typedef struct{char xh[40];char xm[40];int cj;}DataType; //学生的结构typedef struct {DataType data[MaxSize]; //定义表的数据类型int length; //数据元素分别放置在data[0]到data[length-1]当中} SqList; //表的结构void liebiao(SqList *L)//{int k,n;char q;printf("请输入,输入学生的个数:\n");fflush(stdin);scanf("%d",&n);for(k=0;k {printf("请输入学生学号\n");scanf("%s",L->data[k].xh);printf("请输入学生名字\n");scanf("%s",L->data[k].xm);printf("请输入学生成绩\n");scanf("%d",&L->data[k].cj); 建立表格}L->length=n;}void qb(SqList *L) //全部输出{int k,w;for(k=0;klength;k++){w=k+1;printf("第%d位学生:",w);printf("%s %s%d\n",L->data[k].xh,L->data[k].xm,L->d ata[k].cj);}}int cr(SqList *L,DataType *xs,int i) //插入信息{int j;if(L->length==MaxSize){printf("没有!");return 0;}else if((iL->length)){printf("程序溢出,不符合");return 0;}else{for(j=L->length-1;j>=i;j--){strcpy(L->data[j+1].xh,L->data[j].xh); strcpy(L->data[j+1].xm,L->data[j].xm);L->data[j+1].cj=L->data[j].cj;}strcpy(L->data[i].xh,xs->xh);strcpy(L->data[i].xm,xs->xm);L->data[i].cj=xs->cj;L->length=L->length+1;}return 0;}int cz(SqList *L) //查找信息{char xh[40];char xm[40];int cj;int i=0,u;printf(" 1、按学号查询\n"); printf(" 1、按姓名查询\n"); printf(" 1、按成绩查询\n"); printf("请选择:");fflush(stdin);scanf("%d",&u);if (u==1){printf("请输入要查找学生的学号:");scanf("%s",xh);for(i=0;ilength;i++){篇二:单链表的实验报告辽宁工程技术大学上机实验报告篇三:单链表实验报告实验一线性表基本操作的编程实现--线性表在链表存储下的主要操作实现班级:T523-1 姓名:王娟学号:33完成日期:XX.04.04 地点:5502学时:2学时一、需求分析【实验目的】通过本次实验,对课堂上线性表的知识进行巩固,进一步熟悉线性表的链接存储及相应的基本操作;并熟练掌握VC++ 6.0操作平台,学会调试程序,以及编写电子实验报告【实验要求】编写线性表的基本操作,有构造线性表,线性表的遍历,插入,删除,查找,求表长等基本功能,在此基础上能够加入DOS下的图形界面以及学会文件的操作等功能,为以后的学习打下基础。
数据结构实验一:线性表的应用
数据结构实验报告实验一线性表的应用一、实验目的:1.掌握线性表的两种存储结构及实现方式;2.熟练掌握顺序表和链表的建立、插入和删除的算法。
二、实验要求:1.C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.写出算法设计小结和心得。
三、实验内容:1.用顺序表表示集合,编写程序以实现集合的交、并、差运算。
2.设带头结点的单链表ha和hb中结点数据域值按从小到大顺序排列,且各自链表内无重复的结点,要求:(1)建立两个按升序排列的单链表ha和hb。
(2)将单链表ha合并到单链表hb中,且归并后的hb链表内无重复的结点,结点值仍保持从小到大顺序排列。
(3)输出合并后单链表hb中每个结点的数据域值。
四、程序源代码:1.#include<stdio.h>#include<stdlib.h>#define LIST_INIT_CAPACITY 100 typedef int ElementType;typedef struct List{ElementType elem[LIST_INIT_CAPACITY]; int nLength;}SqList;void init(struct List*L)//初始化顺序表{if(L)L->nLength=0;}int visit(SqList*L,ElementType e)//遍历顺序表{for(int i=0;i<L->nLength;i++){if(L->elem[i]==e){return 0;break;}elsecontinue;return 1;}}SqList*jiao(SqList*L1,SqList*L2,SqList*L3)//求两个集合的交集{int n=0;for(int i=0;i<L1->nLength;i++){for(int j=0;j<L2->nLength;i++){if(L1->elem[i]==L2->elem[j]){L3->elem[n]=L1->elem[i];n++;}elsecontinue;}}printf("集合的交集:\n");return L3;}SqList*bing(SqList*L1,SqList*L2,SqList*L3)//求两个集合的并集{int j=0;for (int i=0;i<L1->nLength;i++){if (visit(L2,L1->elem[i])){L3->elem[j]=L1->elem[i];L3->nLength++;j++;}elsecontinue;}printf("集合的并集:\n");return L3;}SqList*cha(SqList*L1,SqList*L2,SqList*L3)//求两个集合的差集{int j=0;for(int i=0;i<L1->nLength;i++){if(visit (L2,L1->elem[i])){L3->elem[j]=L1->elem[i];j++;L3->nLength++;}elsecontinue;}printf("集合的差集:\n");return L3;}void show(SqList *list)//显示线性表元素{for (int i=0;i<list->nLength;i++){printf(" %d",list->elem[i]);}printf("\n");}void main(){SqList*list1,*list2,*list3;list1=(SqList*)malloc(sizeof(SqList));list2=(SqList*)malloc(sizeof(SqList));list3=(SqList*)malloc(sizeof(SqList));init(list1);init(list2);init(list3);intstr1[6]={1,2,3,4,5,6},str2[7]={1,3,4,5,7,9,10};for(int i=0;i<6;i++){list1->elem[i]=str1[i];list1->nLength=i+1;}for(i=0;i<7;i++){list2->elem[i]=str2[i];list2->nLength++;}printf("初始集合:\n");show(list1);show(list2);list3=jiao(list1,list2,list3);show(list3);init(list3);list3=bing(list1,list2,list3);show(list3);init(list3);list3=cha(list1,list2,list3);show(list3);}2.#include <stdio.h>#include<stdlib.h>typedef int ElementType;typedef struct ListNode{ElementType data;struct ListNode *next;}sLinkList;sLinkList*create(ElementType i)//创建接点{sLinkList *p;p=(sLinkList*)malloc(sizeof(sLinkList));if(!p)exit(0);elsep->data=i;return p;}void anotherorder(sLinkList*head){sLinkList*P;P=head->next;if(head!=NULL)//头指针不为空{while (P->next!=NULL){sLinkList*q;//p的后继指针sLinkList*t;q=P->next;t=P->next->next;q->next=head->next;head->next=q;P->next=t;}}}void print(sLinkList*head)//输出链表{if(head==NULL){exit(0);}sLinkList*p=head->next;while(p!=NULL){printf("%4d",p->data);p=p->next;}printf("\n");}void hebing(sLinkList *p,sLinkList *q,sLinkList *l)//将两个链表合并{ sLinkList*z;q=q->next;l=l->next;while(q!=NULL&&l!=NULL){if(q->data>l->data){z=create(l->data);p->next=z;z->next=NULL;p=z;l=l->next;}elseif(q->data<l->data){z=create(q->data);p->next=z;z->next=NULL;p=z;q=q->next;}elseif(q->data==l->data){for(int i=0;i<2;i++){z=create(q->data);p->next=z;z->next=NULL;p=z;}q=q->next;l=l->next;}}if(q==NULL){while (l!=NULL){z=create(l->data);p->next=z;z->next=NULL;p=z;l=l->next;}}if(l==NULL){while (q!=NULL){z=create(q->data);p->next=z;z->next=NULL;p=z;q=q->next;}}printf("合并后:\n");}void deletelist(sLinkList*p)//删除多余元素节点{if(p!=NULL)p=p->next;sLinkList*q;//中间指针while (p!=NULL){int i=p->data;sLinkList*head=p;while (head->next!=NULL){if(i==head->next->data){q=head->next;head->next=q->next;free(q);}elsehead=head->next;}p=p->next;}printf("最终结果:\n");}void main(){sLinkList *ha; ha=(sLinkList*)malloc(sizeof(ListNode)); if(ha!=NULL)//判空{ha->next=NULL;ha->data=-1;}sLinkList *p;sLinkList *q=ha;int a[5]={2,4,6,8,10};for (int i=0;i<5;i++){p=create(a[i]);q->next=p;p->next=NULL;q=p;}printf("初始:\n");print(ha);sLinkList *hb;hb=(sLinkList*)malloc(sizeof(ListNode)); if(hb!=NULL)//判空{hb->next=NULL;hb->data=-1;}q=hb;int b[6]={1,4,5,8,9,10};for (i=0;i<6;i++){p=create(b[i]);q->next=p;p->next=NULL;q=p;}print(hb);//构建ha,hbsLinkList *hc;hc=(sLinkList*)malloc(sizeof(ListNode)); hebing(hc,ha,hb);print(hc);deletelist(hc);print(hc);}五、测试结果:1.2.六、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)经过这次实验,我对线性表的两种形式顺序表和链表有了进一步的了解,对线性表之间的运算及线性表的简单应用有了更深的体会。
线性表实验报告
线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。
在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。
线性表有两种存储结构:顺序存储结构和链式存储结构。
顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。
其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。
链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。
其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。
四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。
1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。
实现顺序表的初始化函数,将表的长度初始化为 0。
实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。
实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。
实现顺序表的遍历函数,输出表中的所有元素。
2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。
实现链表的创建函数,创建一个空链表。
实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。
实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
数据结构_实验1_线性表的基本操作
数据结构_实验1_线性表的基本操作在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地进行访问、修改和操作。
线性表是一种常见且基础的数据结构,它就像是一个有序的元素队列。
在本次实验 1 中,我们将深入探索线性表的基本操作,理解其背后的原理和实现方式。
线性表可以分为顺序表和链表两种常见的实现方式。
顺序表是将元素存储在连续的内存空间中,而链表则是通过节点之间的链接来存储元素。
首先,让我们来看看顺序表的基本操作。
顺序表的优点是可以通过下标直接访问元素,时间复杂度为 O(1)。
比如,如果我们要获取顺序表中第 5 个元素的值,只需要通过下标 4 就可以快速得到。
但在插入和删除元素时,情况就变得复杂一些。
如果要在顺序表的中间插入一个元素,就需要将插入位置后面的元素依次向后移动,以腾出空间插入新元素。
这一操作的时间复杂度为 O(n),其中 n 是顺序表的长度。
同样,删除中间的元素时,也需要将后面的元素依次向前移动。
接下来,我们再聊聊链表。
链表中的每个节点包含数据域和指针域。
指针域用于指向下一个节点,从而形成链表的链接结构。
在链表中进行插入和删除操作相对简单,只需要修改相关节点的指针即可,时间复杂度通常为 O(1)。
然而,要访问链表中的特定元素,就需要从链表的头节点开始,沿着指针依次遍历,直到找到目标节点,其时间复杂度为 O(n)。
在实验中,我们实现了线性表的创建操作。
对于顺序表,我们首先确定其初始容量,然后分配相应的连续内存空间。
对于链表,我们创建一个头节点,并初始化其指针域为 NULL。
接着是元素的插入操作。
在顺序表中,如果插入位置合法且还有剩余空间,我们将插入位置后面的元素向后移动,然后将新元素插入指定位置。
在链表中,我们根据插入位置找到前一个节点,然后创建新节点并修改指针链接。
元素的删除操作也是重点之一。
对于顺序表,删除指定位置的元素后,将后面的元素依次向前移动。
而在链表中,找到要删除节点的前一个节点,修改指针跳过要删除的节点。
数据结构实验报告(一)线性表的应用
数据结构实验报告(⼀)线性表的应⽤实验说明数据结构实验⼀ 线性表的实验——线性表的应⽤⼀、实验⽬的通过本实验使学⽣了解线性表的⼀种简单应⽤,熟悉线性表顺序存储与链式存储的特性,特别训练学⽣编程灵活控制链表的能⼒,为今后编程控制更为复杂的数据结构奠定基础。
⼆、实验内容1.⽤顺序表和链表分别分别编程实现教材中例⼦2-1与2-2。
要求:(1)只能⽤C语⾔编程实现;(2)完全保持书中算法2.1与算法2.2形式,不允许有任何变化,除⾮语法上不允许;所调⽤各函数参照书中19页的功能描述,其中函数名、参数个数及性质、函数功能必须与书中完全⼀致,不能有变化。
2.利⽤线性表表⽰⼀元多项式完成多项式的加、减、乘、求导、求值运算。
要求:(1)输⼊的⼀元多项式可以采⽤只输⼊各项的系数与指数这种简化的⽅式。
如对于多项式2x2+6x5,输⼊可为: 2,2 6,5 这样的简单形式。
(2)遇到有消项时应当处理,如2x2+6x5与3x2-6x5进⾏相加时,结果为5*x^2。
(3)当给定x的值时,能计算表达式相加或相减的结果。
(4)操作的结果放⼊⼀个新线性表中,原来的两个表达式存储表⽰不变,也可以不是产⽣新的线性表,⽽是将两上线性表合并为⼀个。
(5)要求程序功能模块划分合理(每个函数功能单⼀、可重⽤性好),使⽤空间尽可能少,算法尽可能⾼效。
实验报告1.实现功能描述使⽤线性表表⽰⼀元多项式完成多项式的加、减,乘,求导、求值运算。
2.⽅案⽐较与选择(1)因为使⽤的是线性表,所以主要⽅案有数组法和链表法。
(2)从时间复杂度来说,使⽤数组法更优;从空间复杂度来说,链表法更优。
因为数组法是指定好空间的,若式⼦⼤⼩超出设置⼤⼩,那程序必然出错;若式⼦⼤⼩⼩于设置⼤⼩,那就意味着有多余的空间被浪费了。
综合来讲,若计算式⼦较为庞⼤,使⽤链表法更佳;相反,若计算式⼦较⼩,数组法更佳。
3.设计算法描述(1)单个项式的数据存储使⽤了结构体,数组法是在⼀个结构体中定义两个⼀维数组;链表法是通过⼀个结构体作为⼀个节点,通过next指针连接起来。
数据结构实验报告-线性表
1 线性表1. 实验题目与环境1.1实验题目及要求(1)顺序表的操作利用顺序存储方式实现下列功能:根据键盘输入数据建立一个线性表,并输出该线性表;对该线性表进行数据的插入、删除、查找操作,并在插入和删除数据后,再输出线性表。
(2)单链表的操作利用链式存储方式实现下列功能:根据键盘输入数据建立一个线性表,并输出该线性表;对该线性表进行数据的插入、删除、查找操作,并在插入和删除数据后,再输出线性表。
(3)线性表的应用约瑟夫环问题。
有n个人围坐一圈,现从某个人开始报数,数到M的人出列,接着从出列的下一个人开始重新报数,数到M的人又出列,如此下去,直到所有人都出列为止。
要求依次输出出列人的编码。
2.问题分析(1)顺序表的操作利用一位数组来描述顺序表,即将所有元素一词储存在数组的连续单元中,要在表头或中间插入一个新元素时,需要将其后的所有元素都向后移动一个位置来为新元素腾出空间。
同理,删除开头或中间的元素时,则将其后的所有元素向前移动一个位置以填补空位。
查找元素时,则需要利用循环语句,一一判断直到找出所要查找的元素(或元素的位置),输出相关内容即可(2)单链表的操作利用若干个结点建立一个链表,每个节点有两个域,即存放元素的数据域和存放指向下一个结点的指针域。
设定一个头指针。
在带头结点的单链表中的第i个元素之前插入一新元素,需要计数找到第i-1个结点并由一指针p指向它,再造一个由一指针s指向的结点,数据为x,并使x的指针域指向第i个结点,最后修改第i-1个结点的指针域,指向x结点。
删除第i个元素时,需要计数寻找到第i个结点,并使指针p指向其前驱结点,然后删除第i个结点并释放被删除结点的空间。
查找第i个元素,需从第一个结点开始计数找到第i个结点,然后输出该结点的数据元素。
(3)线性表的应用程序运行之后,首先要求用户指定初始报数的上限值,可以n<=30,此题中循环链表可不设头结点,而且必须注意空表和"非空表"的界限。
实验一线性表操作实验报告
实验一_线性表操作_实验报告实验一:线性表操作一、实验目的1.理解线性表的基本概念和特点。
2.掌握线性表的基本操作,包括插入、删除、查找等。
3.通过实验,提高动手能力和解决问题的能力。
二、实验原理线性表是一种较为常见的数据结构,它包含零个或多个数据元素,相邻元素之间有前后关系。
线性表具有以下特点:1.元素之间一对一的顺序关系。
2.除第一个元素外,每个元素都有一个直接前驱。
3.除最后一个元素外,每个元素都有一个直接后继。
常见的线性表有数组、链表等。
本实验主要针对链表进行操作。
三、实验步骤1.创建链表:首先创建一个链表,并给链表添加若干个节点。
节点包括数据域和指针域,数据域存储数据,指针域指向下一个节点。
2.插入节点:在链表中插入一个新的节点,可以选择在链表的头部、尾部或中间插入。
3.删除节点:删除链表中的一个指定节点。
4.查找节点:在链表中查找一个指定数据的节点,并返回该节点的位置。
5.遍历链表:从头节点开始,依次访问每个节点的数据。
四、实验结果与分析1.创建链表结果:我们成功地创建了一个链表,每个节点都有数据域和指针域,数据域存储数据,指针域指向下一个节点。
2.插入节点结果:我们成功地在链表的头部、尾部和中间插入了新的节点。
插入操作的时间复杂度为O(1),因为我们只需要修改指针域即可。
3.删除节点结果:我们成功地删除了链表中的一个指定节点。
删除操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要删除的节点。
4.查找节点结果:我们成功地在链表中查找了一个指定数据的节点,并返回了该节点的位置。
查找操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要查找的节点。
5.遍历链表结果:我们成功地遍历了整个链表,并访问了每个节点的数据。
遍历操作的时间复杂度为O(n),因为我们可能需要遍历整个链表。
通过本次实验,我们更加深入地理解了线性表的基本概念和特点,掌握了线性表的基本操作,包括插入、删除、查找等。
数据结构实验报告-实验一顺序表、单链表基本操作的实现
数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。
(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。
(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。
l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。
线性表实验报告
LinkList p;
p=L->next;
while(p){
printf("%5d",p->data);
p=p->next;
}
return OK;
}
void main()
{
int i,n,k,d,e;
LinkList La,Lb;
InitList_L(La);
InitList_L(Lb);
e=L.elem[i];
for(j=i;j<=L.length;j++)
L.elem[j]=L.elem[j+1];
L.length--;
return ok;
}
int output(sqlist &L){
int i;
printf("output sqlist data:\n");
for(i=0;i<L.length;i++)
PrintList(La);
printf("\nAfter delete the list is:\n");
ListDelete_L(La,e);
PrintList(La);
printf("\n");
printf("I will insert:");
scanf("%d",&k);
ListInsert_L(La,k);
int a,j,i,m;
CLinkList p,r;
printf("Input the m(m<=20):\nm=");
scanf("%d",&m);
线性表逆置(顺序表)实验报告
线性表逆置(顺序表)实验报告实验一:线性表逆置(顺序表)实验报告(一)问题的描述:实现顺序表的逆置算法(二)数据结构的设计:顺序集是线性表的顺序存储形式,因此设计如下数据类型则表示线性表:typedefstruct{elemtype*elem;/*存储空间基址*/intlength;/*当前长度*/intlistsize;/*当前分配的存储容量(以sizeof(elemtype)为单位)*/}sqlist;(三)函数功能、参数说明及概要设计:1.函数statusinitlist(sqlist*l)功能说明:实现顺序表l的初始化算法设计:为顺序表中分配一块大小为list_init_size的储存空间2.函数intlistlength(sqlistl)功能表明:回到顺序表中l长度算法设计:回到顺序表的length 变量3.函数statuslistinsert(sqlist*l,inti,elemtypee)功能说明:将元素e插入到顺序表l中的第i个节点算法设计:推论顺序表中与否已八十,已八十则提空间,年满则稳步,将元素e填入至第i个元素之前,并将后面的元素依次往科玄珠4.函数statuslisttraverse(sqlistl,void(*vi)(elemtype*))功能说明:依次对l的每个数据元素调用函数vi()算法设计:依次对l的每个数据元素调用函数vi()5.函数voidexchange(sqlist*l)功能说明:实现顺序表l的逆置算法设计:用for循环将顺序表中l中的第i个元素依次与第(i+length)个元素互换6.函数voidprint(elemtype*c)功能表明:列印元素c算法设计:列印元素c2.(四)具体程序的实现/*程序名*/#include#include#include/*malloc()等*/#include/*int_max等*/#include/*eof(=^z或f6),null*/#include/*atoi()*/#include/*eof()*/#include/*floor(),ceil(),abs()*/#include/*exit()*//*函数结果状态代码*/#definetrue1#definefalse0#defineok1#defineerror0#defineinfeasible-1/*#defineoverflow-2因为在math.h中已定义overflow的值3,故换成此行*/typedefintstatus;/*status就是函数的类型,其值就是函数结果状态代码,如ok等*/typedefintboolean;/*boolean就是布尔类型,其值就是true或false*/typedefintelemtype;/*线性表的动态分配顺序存储结构*/#definelist_init_size10//线性表存储空间的起始分配量#definelistincrement2//线性表存储空间的分配增量typedefstruct{elemtype*elem;//存储空间基址intlength;//当前长度intlistsize;//当前分配的存储容量(以sizeof(elemtype)为单位)}sqlist;/*顺序则表示的线性表的基本操作*/statusinitlist(sqlist*l)/*算法2.3*/{/*操作结果:构造一个空的顺序线性表*/(*l).elem=(elemtype*)malloc(list_init_size*sizeof(elemtype));if(!(*l).elem)exit(overflow);/*存储分配失败*/(*l).length=0;/*空表长度为0*/(*l).listsize=list_init_size;/*起始存储容量*/returnok;}statusdestroylist(sqlist*l){/*初始条件:顺序线性表l已存在。
数据结构线性表实验报告
数据结构线性表实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中线性表的基本概念、存储结构和操作算法,并通过实际编程实现来提高对线性表的应用能力和编程技能。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验内容(一)线性表的顺序存储结构顺序表是用一组地址连续的存储单元依次存储线性表的数据元素。
其特点是逻辑上相邻的元素在物理位置上也相邻,便于随机存取,但插入和删除操作需要移动大量元素,效率较低。
(二)线性表的链式存储结构链表是通过指针将一组零散的存储单元链接成一个线性序列。
常见的链表有单链表、双向链表和循环链表。
链表的插入和删除操作只需修改指针,无需移动元素,但随机存取效率较低。
(三)线性表的基本操作实现1、初始化线性表2、销毁线性表3、清空线性表4、判断线性表是否为空5、获取线性表的长度6、获取指定位置的元素7、查找指定元素在线性表中的位置8、在线性表指定位置插入元素9、删除线性表指定位置的元素四、实验步骤(一)顺序表的实现1、定义顺序表的结构体,包括数据存储数组和表的长度。
2、实现顺序表的初始化函数,分配初始存储空间并设置表长度为0。
3、销毁顺序表函数,释放存储空间。
4、清空顺序表函数,将表长度置为 0。
5、判断顺序表是否为空,根据表长度判断。
6、获取顺序表长度,直接返回表长度。
7、获取指定位置元素,检查位置合法性后返回对应元素。
8、查找指定元素位置,遍历表进行比较。
9、插入元素函数,检查插入位置合法性,若合法则移动后续元素,插入新元素并更新表长度。
10、删除元素函数,检查删除位置合法性,若合法则移动后续元素,更新表长度。
(二)链表的实现1、定义链表节点结构体,包含数据域和指针域。
2、实现链表的初始化函数,创建头节点。
3、销毁链表函数,遍历链表释放节点内存。
4、清空链表函数,遍历链表删除节点但保留头节点。
5、判断链表是否为空,检查头节点的指针域是否为空。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一顺序表与链表一、实验目的1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。
二、实验预习说明以下概念1、线性表:2、顺序表:3、链表:三、实验内容和要求1、阅读下面程序,在横线处填写函数的基本功能。
并运行程序,写出结果。
#include<stdio.h>#include<malloc.h>#define ERROR 0#define OK 1#define INIT_SIZE 100 /*初始分配的顺序表长度*/#define INCREM 5 /*溢出时,顺序表长度的增量*/typedef int ElemType; /*定义表元素的类型*/typedef struct Sqlist{ElemType *slist; /*存储空间的基地址*/int length; /*顺序表的当前长度*/int listsize; /*当前分配的存储空间*/}Sqlist;int InitList_sq(Sqlist *L); /* */int CreateList_sq(Sqlist *L,int n); /* */int ListInsert_sq(Sqlist *L,int i,ElemType e);/* */ int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/int ListDelete_sq(Sqlist *L,int i); /*删除第i个元素*/int ListLocate(Sqlist *L,ElemType e); /*查找值为e的元素*/int InitList_sq(Sqlist *L){L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(!L->slist) return ERROR;L->length=0;L->listsize=INIT_SIZE;return OK;}/*InitList*/int CreateList_sq(Sqlist *L,int n){ElemType e;int i;for(i=0;i<n;i++){printf("input data %d",i+1);scanf("%d",&e);if(!ListInsert_sq(L,i+1,e))return ERROR;}return OK;}/*CreateList*//*输出顺序表中的元素*/int PrintList_sq(Sqlist *L){int i;for(i=1;i<=L->length;i++)printf("%5d",L->slist[i-1]);return OK;}/*PrintList*/int ListInsert_sq(Sqlist *L,int i,ElemType e){int k;if(i<1||i>L->length+1)return ERROR;if(L->length>=L->listsize){L->slist=(ElemType*)realloc(L->slist,(INIT_SIZE+INCREM)*sizeof(ElemType)); if(!L->slist)return ERROR;L->listsize+=INCREM;}for(k=L->length-1;k>=i-1;k--){L->slist[k+1]= L->slist[k];}L->slist[i-1]=e;L->length++;return OK;}/*ListInsert*//*在顺序表中删除第i个元素*/int ListDelete_sq(Sqlist *L,int i){}/*在顺序表中查找指定值元素,返回其序号*/int ListLocate(Sqlist *L,ElemType e){}int main(){Sqlist sl;int n,m,k;printf("please input n:"); /*输入顺序表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create Sqlist:\n");InitList_sq(&sl);CreateList_sq(&sl,n);printf("\n2-Print Sqlist:\n");PrintList_sq(&sl);printf("\nplease input insert location and data:(location,data)\n");scanf("%d,%d",&m,&k);ListInsert_sq(&sl,m,k);printf("\n3-Print Sqlist:\n");PrintList_sq(&sl);printf("\n");}elseprintf("ERROR");return 0;}●运行结果●算法分析2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。
删除算法代码:●运行结果●算法分析查找算法代码:●运行结果●算法分析3、阅读下面程序,在横线处填写函数的基本功能。
并运行程序,写出结果。
#include<stdio.h>#include<malloc.h>#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct LNode{ /*线性表的单链表存储*/ElemType data;struct LNode *next;}LNode,*LinkList;LinkList CreateList(int n); /* */void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/int GetElem(LinkList L,int i,ElemType *e); /* */LinkList CreateList(int n){LNode *p,*q,*head;int i;head=(LinkList)malloc(sizeof(LNode)); head->next=NULL;p=head;for(i=0;i<n;i++){q=(LinkList)malloc(sizeof(LNode)); printf("input data %i:",i+1);scanf("%d",&q->data); /*输入元素值*/q->next=NULL; /*结点指针域置空*/p->next=q; /*新结点连在表末尾*/p=q;}return head;}/*CreateList*/void PrintList(LinkList L){LNode *p;p=L->next; /*p指向单链表的第1个元素*/while(p!=NULL){printf("%5d",p->data);p=p->next;}}/*PrintList*/int GetElem(LinkList L,int i,ElemType *e){LNode *p;int j=1;p=L->next;while(p&&j<i){p=p->next;j++;}if(!p||j>i)return ERROR;*e=p->data;return OK;}/*GetElem*/int main(){int n,i;ElemType e;LinkList L=NULL; /*定义指向单链表的指针*/printf("please input n:"); /*输入单链表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create LinkList:\n");L=CreateList(n);printf("\n2-Print LinkList:\n");PrintList(L);printf("\n3-GetElem from LinkList:\n");printf("input i=");scanf("%d",&i);if(GetElem(L,i,&e))printf("No%i is %d",i,e);elseprintf("not exists");}elseprintf("ERROR");return 0;}●运行结果●算法分析4、为第3题补充插入功能函数和删除功能函数。
并在主函数中补充代码验证算法的正确性。
插入算法代码:●运行结果●算法分析删除算法代码:●运行结果●算法分析以下为选做实验:5、循环链表的应用(约瑟夫回环问题)n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:用一个无头结点的循环单链表来实现n个元素的存储。
●算法代码6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。
提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至p==null 为至,既完成了对整个链表元素的删除相同值。
●算法代码四、实验小结五、教师评语。