线性表逆置(顺序表)实验报告

合集下载

实验报告一

实验报告一
如果创建的是带头节点的线性表,在进行输入、删除、插入操作时,均应在第二个开始操作。
在进行非递减有序线性链表的创建时,如果随机读入数据并不是需要的非递减线性链表。
解决方法:人为的控制读入的数据的顺序,如果运用头插法,则应先插入大的,再插入小的;如果用尾插法,则应先插入小的,然后插入大的。
当进行删除、插入操作时,应该先连接,然后再断开原有的。
{
if (p->next->data<q->next->data)
{ s = p->next;p->next=s->next;}
else
{ s = q->next;q->next = s->next;}//先连接再释放
s->next = c->next;
c->next = s;
}
while (p->next)
实验报告
《数据结构与算法》实验报告
题目:
日期
2012年10月21日
班级
20111121
学号
2011112136
姓名
史彭飞
成绩
实验环境:
WindowsXP
VC++6.0
实验内容与完成情况:
1.设有一个顺序表A,包含n个元素,要求写出一个将该表逆置的算法,并只允许在原表的存储空间外再增加一个附加的工作单元。
}nodetype;
nodetype *create()// create创建创造
{
elemtype d;
nodetype h=NULL,*s,*t;
int i=1;
printf(“建立一个单链表\n”);
while (1)

顺序表实验报告

顺序表实验报告

顺序表实验报告
摘要:
一、实验背景及目的
二、实验对象与方法
三、实验结果与分析
四、实验总结与建议
正文:
一、实验背景及目的
随着科技的不断发展,顺序表在各种领域的应用越来越广泛。

为了进一步了解顺序表的性能和特点,本实验对顺序表进行了相关测试。

实验旨在通过对比分析,评估顺序表在不同条件下的表现,为后续研究与应用提供参考依据。

二、实验对象与方法
1.实验对象:某品牌顺序表产品
2.实验方法:
(1)根据实验需求,制定实验方案,明确实验步骤与评价标准;
(2)将顺序表产品置于不同环境下,如高温、低温、湿度等,观察其性能变化;
(3)通过数据记录与分析,评估顺序表在不同环境下的稳定性、可靠性和适用性。

三、实验结果与分析
1.顺序表在不同环境下的性能表现:
(1)在高温环境下,顺序表表现稳定,数据传输速率较快;
(2)在低温环境下,顺序表仍能正常工作,性能略有下降;
(3)在湿度较大的环境下,顺序表出现一定程度的性能波动,但整体表现良好。

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

顺序表设计实验报告

顺序表设计实验报告

顺序表设计实验报告
顺序表是一种常见的线性表数据结构,它是将记录按一定的关系放入线性排列的存储空间,使其可以通过位置关系查找任意一个记录的结构。

本次实验的目的是熟悉顺序表的基本操作,通过编写程序实现对顺序表增加元素操作、删
除元素操作、查找元素操作、遍历元素操作等操作的实现。

在设计实现通用顺序表的程序时,可以将顺序表定义为模板表类,方便使用者可以将任何类型的变量定义为顺序表,无需重新编程。

并且在实现顺序表操作时,需要考虑到内存的分配和释放,以及某些特殊条
件下的处理,可以从中体会到C++程序中艰巨的任务实现。

实验总体来说是非常有趣的,从中学习到了C++实现顺序表操作的基本原理和常见问题的处理方案,以及须注意的一些特殊条件,同时也有助于培养对于面向对象编程的思维。

总之,本次实验是一次宝贵的学习经历,不仅让我加深了对于顺序表的理解,也提高了自己的编程能力,实现了艰苦的任务。

顺序表实验报告

顺序表实验报告

实验报告实验项目名称实验一线性表的操作所属课程名称数据结构实验类型验证实验实验日期2010-11-19院系数学与信息科学学院实验一线性表的操作一.实验目的1、掌握用上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等简单操作在顺序存储结构上的运算。

二.实验环境硬件:计算机、256M以上内存,40G以上硬盘;软件:Windows XP , C++三.实验内容线性表基本操作的实现:构造一空线性表,将线性表置空,对线性表进行判空,求线性表的长度,查询线性表的第i个数据元素的值,查询要查询元素的上个元素的值,查询要查询元素的下个元素的值,删除线性表中的某个元素,将某元素插入线性表,对线性表进行查访并返回一特定的值。

给出两个线性表将其合并成一个线性表,销毁线性表。

四.实验步骤1、本实验的程序及头文件如下:SqlistMain.cpp#include"iostream.h"#include"stdio.h"#include"malloc.h"#include"stdlib.h"#include"SqListOperation.h"#include"function.h"#include "SqList.h"void main(){SqList L1,L2,L3;SqList *La=&L1,*Lb=&L2,*Lc=&L3;ElemType e;int m;InitList_Sq(La);InitList_Sq(Lb);cout<<"请输入线性表a"<<endl;EnterList_Sq(La);cout<<"输出线性表a"<<endl;PrintSqList(La);cout<<"输出线性表a长:"<<ListLength(La)<<endl;cout<<"验线性表a是否空表(空为1,不空为0):"<<ListEmpty(La)<<endl;cout<<"输入查询线性表a中元素的位置:";cin>>m;cout<<"输出线性表a中第m个元素:"<<GetElem(La,m)<<endl;cout<<"输入要查询元素的上个元素:";cin>>m;cout<<"输出性表a中第m个元素上个元素:"<<PriorElem(La,m)<<endl;cout<<"输入要查询元素的下个元素:";cin>>m;cout<<"输出线性表a中第m个元素下个元素:"<<NextElem(La,m)<<endl;cout<<"输入插入元素e及其位置m:";cin>>m>>e;ListInsert_Sq(La,e,m);cout<<"输出插入元素后的线性表a:"<<endl;PrintSqList(La);cout<<"输入删除元素位置m:";cin>>m;cout<<"除线性表a中第"<<m<<"个元素并输出其值:"<<ListDelete_Sq(La,m)<<endl;cout<<"输出删除元素后的线性表a:"<<endl;PrintSqList(La);cout<<"输入线性表b"<<endl;EnterList_Sq(Lb);cout<<"输出线性表b"<<endl;PrintSqList(Lb);cout<<"给线性表La按递增排序并输出:"<<endl;Sort_Increase(La);PrintSqList(La);cout<<"给线性表La按递增排序并输出:"<<endl;Sort_Increase(Lb);PrintSqList(Lb);cout<<"把线性表a和线性表b按非递减排列归并到线性表c,并输出线性表c:"<<endl;MergeList(La,Lb,Lc);PrintSqList(Lc);cout<<"删除线性表Lc"<<endl;ClearList(Lc);DestroyList(Lc);cout<<"输出删除线性表Lc后的表长:"<<ListLength(Lc)<<endl;}Function.hStatus InitList_Sq(SqList *L);Status DestroyList(SqList *L);Status ClearList(SqList *L);Status ListEmpty(SqList *L);int ListLength(SqList *L);Status GetElem(SqList *L,int i,ElemType *e);ElemType GetElem(SqList *L,int i);int LocateElem(SqList *L,ElemType e,Status (*compare)(ElemType a,ElemType e));Status PriorElem(SqList *L,ElemType cur_e,ElemType *pre_e);ElemType PriorElem(SqList *L,ElemType cur_e);Status NextElem(SqList *L,ElemType cur_e,ElemType *next_e);ElemType NextElem(SqList *L,ElemType cur_e);Status ListInsert_Sq(SqList *L,int i,ElemType e);Status ListDelete_Sq(SqList *L,int i,ElemType *e);ElemType ListDelete_Sq(SqList *L,int i);void PrintSqList(SqList *L);Status ListTraverse(SqList *L,Status (*visit)(ElemType *a));Status EnterList_Sq(SqList *L);Status compare(ElemType a,ElemType e);Status visit(ElemType *a);Status Union(SqList *La,SqList *Lb);Status MergeList(SqList *La,SqList *Lb,SqList *Lc);//Status MergeList_Sq(SqList *La,SqList *Lb,SqList *Lc);Status Sort_Increase(SqList *L);Status Sort_Reduce(SqList *L);SqlistOperation.h#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OK 1#define ERROR 0#define TURE 1#define FALSE 0#define OVERFLOW 0#define INFEASIBLE 0typedef int Status;typedef int ElemType;typedef struct{ElemType *elem;int length;int listsize;}SqList;const int n=10;Sqlist.h//初始条件:已申明线性表类型为SqListStatus InitList_Sq(SqList *L){//构造一个空的顺序表L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L->elem) exit(ERROR);//存储分配失败L->length=0;//空表长度为零L->listsize=LIST_INIT_SIZE;//初始存储容量return OK;}//InitList_SqStatus EnterList_Sq(SqList *L){//初始条件:已存在空的顺序表//操作结果:给顺序表输入元素,并记录元素个数int i,m;ElemType *newbase;cout<<"输入所需输入线性表元素的个数"<<endl;cin>>m;newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(Ele mType));if(!newbase) exit(OVERFLOW);//存储分配失败L->elem=newbase;//新基址L->listsize+=LISTINCREMENT;//增加存储容量cout<<"依次输入所需元素:"<<endl;for(i=0;i<m;i++){cin>>L->elem[i];L->length++;}return OK;}Status DestroyList(SqList *L){//初始条件:顺序线性表L已存在。

线性表逆置(顺序表)实验报告

线性表逆置(顺序表)实验报告
vi()的形参加'&',表明可通过调用vi()改变元素的值*/
ElemType *p;
int i;
p=L.elem;
for(i=1;i<=L.length;i++)
vi(p++);
printf("\n");
return OK;
}
/*逆置链表的程序*/
void change(SqList *L) /*逆置算法*/
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/
{
scanf("%d",&e);
i=ListInsert(&L,j,e);
}
}prLeabharlann ntf("逆置前的表:L= "); /*输出表L的内容*/
ListTraverse(L,print);
change(&L);
printf("逆置后的表:L= "); /*输出新表L的内容*/
ListTraverse(L,print);
{
ElemType e;
int L_len;
int i;
L_len=ListLength(*L); /*求线性表的长度*/
for(i=0;i<=L_len/2;i++)

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

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

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

二、实验环境本次实验使用的编程语言为 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 语言项目。

线性表的基本操作及应用实验(单链表的逆置)

线性表的基本操作及应用实验(单链表的逆置)

实验环境
Windows XP
实验目的与要求:
实验总结: 实践才能出真知,在通过了上机操作后,才发现了许多在平时上理论课的没有想到的方方面面,编写 程序是发现很多语法的错误,以及很多英语单词的记不熟,记错,程序函数错用等等,我想需要在以 后多多练习,才能逐步解决这些问题。 签名: 2013 年 11 月 14 日 要求学生深入了解链表和顺序结构的特性,巩固对这两种结构方法的掌握,并能解决一定的 实际问题。
while(i != -1) { p = (L *)malloc(sizeof(L)); p->data = i; if(head == NULL) q = head = p; else q->next = p; q = p;
//*********** 学号 *********** #include <stdio.h> #include <stdlib.h> typedef struct L { int data; struct L *next; } L; //创建链表 L *CreatList(void) { int i; L *head, *p, *q; head = NULL; printf("请输入您要输入的数据(输入-1 结束):\n"); scanf("%d", &i); } }
实验内容:
1.定义数据类型。 2.实现顺序表和链表的生成函数。
评语与成绩:
3.实现线性表的基本操作。 4. 利用链表的基本操作实现单链表的就地逆置。
ቤተ መጻሕፍቲ ባይዱ
教师签名: 年


实验步骤: (算法描述、源程序、操作步骤和方法) //***********单链表的逆置*********** //***********班级*********** //********** 姓名 ***********

实验报告.线性表的顺序表示和实现

实验报告.线性表的顺序表示和实现
--L.length;//表长减1
return OK;
}
void main()
{Sqlist L; int i; InitList_Sq(L); //构造一个空的线性表L
for (i=0;i<L.listsize;i++)
{scanf("%d",&L.elem[i]);
++L.length;}//输入数据
if(!L.elem) exit(OVERFLOW); //存储分配失败
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE; //初始存储容量
return OK;
}
Status ListInsert_Sq(Sqlist &L,int i, ElemType e){
for(i=0;i<L.listsize;i++)printf("%d ",*(L.elem+i));
//输出表中的数据
printf("\n");
ElemType e;scanf("%d""%d",&i,&e);
ListInsert_Sq(L,i,e);
//在线性表L中第i个元素之前插入元素e
for(i=0;i<L.length;i++)
要不然就会出现很多错误,得不到自己想要的结果。
第二点:要熟练的掌握有关C语言的知识,要充分明白算法与程序的区别,在
编写程序的过程中要保持清醒的头脑,时刻注意那些容易出错的地
方。
第三点:每次进行删除算法之后表长都要减一。否则会造成数据冗余,浪费

线性表实验报告

线性表实验报告

线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。

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

三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。

在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。

线性表有两种存储结构:顺序存储结构和链式存储结构。

顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。

其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。

链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。

其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。

四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。

1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。

实现顺序表的初始化函数,将表的长度初始化为 0。

实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。

实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。

实现顺序表的遍历函数,输出表中的所有元素。

2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。

实现链表的创建函数,创建一个空链表。

实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。

实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

线性表的基本运算及多项式的算术计算

线性表的基本运算及多项式的算术计算

实验报告
(/ 学年第一学期)
课程名称数据结构A
实验名称线性表的基本运算及多项式的算术计算实验时间年月日指导单位
指导教师
学生姓名班级学号
学院(系) 专业
实验报告
○2删除表中所有元素值等于x的元素:
思路:遍历顺序表,没搜索到一次x,就将其后所有结点前移,考虑到x连续存在的情况,将所有结点前移之后,i自减,再循环进行。

代码:
template <class T>
bool SeqList<T>::DeleteX(const T &x)
流程图:
cout<<endl<<"起始: ";
a.Output(cout);
a.Reverse();
cout<<"逆置后:";
a.Output(cout);
a.DeleteX(k);
cout<<"删除后:";
a.Output(cout);
return 0;
}
(3)测试用例和结果:
输入顺序表长度为10:
输入十个数分别为1 3 5 5 6 8 4 2 5 9 :输入要删除的元素 5 :
实验报告流程图:
(2)完整代码:
#include <iostream>
using namespace std;
class Term
{
输入5x^5+4x^3:

输入4x^5+2x^3,并求出多项式的和:选择多项式相乘的功能:
输入4x^3+3x^2:
输入5x^5+6x^3+2x^2, 输出多项式的乘积:。

线性表的顺序表示及实现实验报告

线性表的顺序表示及实现实验报告
scanf("%d",&c);
ListDelete(&fibo,c,&item);
PrintList(fibo);
}
实验步骤
1、WIN-TC开发环境安装与配置
1)首先在网上下载WIN-TC的版本;
2)下载完成后进行安装,安装路径默认就可以了,一路next就ok了;
3)打开WIN-TC会出现如下界st(SqList fibo)
{
int i;
for(i=0;i<fibo.length;i++) printf("%d\t",fibo.items[i]);
printf("\n");
return 1;
}
main()
{
int i;
int a,b,c;
int data[10];
DataType item;
{
printf("cha ru bu he fa");
return 0;
}
for(i=fibo->length-1;i>=pos-1;i--)
fibo->items[i+1]=fibo->items[i];
fibo->items[pos-1]=item;
fibo->length++;
return 1;
DataType items[LISTSIZE];
int length;
}SqList;
int ListDelete(SqList *fibo,int pos,DataType *item)
{
int i;
if(ListEmpty(*fibo))

实验一线性表操作实验报告

实验一线性表操作实验报告

实验一_线性表操作_实验报告实验一:线性表操作一、实验目的1.理解线性表的基本概念和特点。

2.掌握线性表的基本操作,包括插入、删除、查找等。

3.通过实验,提高动手能力和解决问题的能力。

二、实验原理线性表是一种较为常见的数据结构,它包含零个或多个数据元素,相邻元素之间有前后关系。

线性表具有以下特点:1.元素之间一对一的顺序关系。

2.除第一个元素外,每个元素都有一个直接前驱。

3.除最后一个元素外,每个元素都有一个直接后继。

常见的线性表有数组、链表等。

本实验主要针对链表进行操作。

三、实验步骤1.创建链表:首先创建一个链表,并给链表添加若干个节点。

节点包括数据域和指针域,数据域存储数据,指针域指向下一个节点。

2.插入节点:在链表中插入一个新的节点,可以选择在链表的头部、尾部或中间插入。

3.删除节点:删除链表中的一个指定节点。

4.查找节点:在链表中查找一个指定数据的节点,并返回该节点的位置。

5.遍历链表:从头节点开始,依次访问每个节点的数据。

四、实验结果与分析1.创建链表结果:我们成功地创建了一个链表,每个节点都有数据域和指针域,数据域存储数据,指针域指向下一个节点。

2.插入节点结果:我们成功地在链表的头部、尾部和中间插入了新的节点。

插入操作的时间复杂度为O(1),因为我们只需要修改指针域即可。

3.删除节点结果:我们成功地删除了链表中的一个指定节点。

删除操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要删除的节点。

4.查找节点结果:我们成功地在链表中查找了一个指定数据的节点,并返回了该节点的位置。

查找操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要查找的节点。

5.遍历链表结果:我们成功地遍历了整个链表,并访问了每个节点的数据。

遍历操作的时间复杂度为O(n),因为我们可能需要遍历整个链表。

通过本次实验,我们更加深入地理解了线性表的基本概念和特点,掌握了线性表的基本操作,包括插入、删除、查找等。

线性表实验报告

线性表实验报告
//输出单链表
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);

顺序表的操作实验报告

顺序表的操作实验报告

顺序表的操作实验报告一、实验目的。

1. 了解顺序表的基本概念和操作方法;2. 掌握顺序表的插入、删除、查找等操作;3. 熟悉顺序表的存储结构和实现方式。

二、实验内容。

1. 实现顺序表的基本操作,包括插入、删除、查找等;2. 对比顺序表和链表的优缺点;3. 分析顺序表的存储结构和实现方式。

三、实验原理。

顺序表是一种线性表的存储结构,它的特点是元素之间的逻辑顺序和物理顺序一致,即在内存中连续存储。

顺序表的基本操作包括插入、删除、查找等。

1. 插入操作,在顺序表的某个位置插入一个元素,需要将插入位置后的所有元素向后移动一个位置,然后将新元素插入到指定位置。

2. 删除操作,删除顺序表中的某个元素,需要将删除位置后的所有元素向前移动一个位置,然后将最后一个元素删除。

3. 查找操作,在顺序表中查找某个元素,需要遍历整个顺序表,逐个比较元素的值,直到找到目标元素或者遍历完整个表。

四、实验步骤。

1. 实现顺序表的基本操作,包括插入、删除、查找等;2. 编写测试用例,验证顺序表的功能和正确性;3. 对比顺序表和链表的优缺点,分析其适用场景;4. 分析顺序表的存储结构和实现方式,总结其特点和应用场景。

五、实验结果与分析。

1. 实现了顺序表的基本操作,包括插入、删除、查找等,功能正常;2. 经过测试用例验证,顺序表的功能和正确性得到了验证;3. 对比顺序表和链表的优缺点,发现顺序表的插入、删除操作效率较低,但查找操作效率较高,适合静态查找;4. 分析顺序表的存储结构和实现方式,发现其适用于元素数量较少且频繁查找的场景。

六、实验总结。

通过本次实验,我们深入了解了顺序表的基本概念和操作方法,掌握了顺序表的插入、删除、查找等操作。

同时,我们对比了顺序表和链表的优缺点,分析了顺序表的存储结构和实现方式,加深了对顺序表的理解和应用。

在今后的学习和工作中,我们将根据实验结果的分析,合理选择顺序表或链表作为数据结构,以满足不同场景下的需求。

顺序表的操作实验报告

顺序表的操作实验报告

顺序表的基本操作一、实验目的1、复习C++语言程序设计中的知识。

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

3、熟悉线性表的基本运算在两种存储结构上的实现。

4、掌握顺序表的存储结构形式及其描述和基本运算的实现。

5、熟练掌握动态链表结构及有关算法的设计二、实验内容实现顺序表的建立、取元素、修改元素、插入、删除等顺序表的基本操作。

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

三、实验步骤、调试及输出结果(—) . 数据结构与核心算法的设计描述:#include <stdio.h>#include <stdlib.h>/*顺序表的定义:*/#define ListSize 100typedef struct{int elem[ListSize]; /*向量elem用于存放表结点*/int length; /*当前的表长度*/}SeqList;/*顺序表的建立:*/void CreateList(SeqList *L,int n){int i;printf("please input n numbers:\n");for(i=1;i<=n;i++)scanf("%d",&L->elem[i]);L->length=n;}/*顺序表的打印:*/void PrintList(SeqList *L,int n){int i;printf("the sqlist is\n");for(i=1;i<=n;i++)printf("%d ",L->elem[i]);printf("\n");}/*顺序表的查找:*/int LocateList(SeqList *L,int x){int i;i=1;while (((L->elem[i])!=x) &&(i<=10)) ++i;if ((L->elem[i])==x) return(i);else return(0);}/*顺序表的插入:*/void InsertList(SeqList *L,int x,int i) {int j;if (i<1 ||i>L->length+1)printf("no insert position!\n"); else{for(j=L->length;j>=i;j--)L->elem[j+1]=L->elem[j];L->elem[i]=x;L->length++;}}/*顺序表的删除:*/void DeleteList(SeqList *L,int i){int j;if (i<1 ||i>L->length)printf("no delete position!\n");else{for(j=i;j<=(L->length)-1;j++)L->elem[j]=L->elem[j+1];L->length--;}}void main(){SeqList L;int i,x;int n=10; /*当前顺序表的长度*/L.length=0;CreateList(&L,n); /*建立顺序表*/PrintList(&L,L.length); /*输出顺序表*/ printf("input the research element:");scanf("%d",&x);i=LocateList(&L,x); /*顺序表查找*/printf("the research position is %d\n",i);printf("input the position of insert:");scanf("%d",&i);printf("input the value of insert:");scanf("%d",&x);InsertList(&L,x,i); /*顺序表插入*/PrintList(&L,L.length); /*输出顺序表*/ printf("input the position of delete:");scanf("%d",&i);DeleteList(&L,i); /*顺序表删除*/PrintList(&L,L.length); /*输出顺序表*/ }(二). 调试及输出结果测试数据:1、输入n个数;2、输出顺序列表;3、顺序表的查找;4.顺序表的插入;5、顺序表的删除;数据测试如下截图:四、实验讨论与总结:通过这次写实验报告,我深切的理解了这门课的本质。

数据结构线性表的顺序表示和实现的实习报告

数据结构线性表的顺序表示和实现的实习报告

数学与计算科学学院实验报告实验项目名称线性表的顺序表示与实现所属课程名称数据结构实验类型验证型__________实验日期___________________________班级----------------------------学号____________________________姓名____________________________成绩----------------------------实验概述:【实验目的】1线性表的逻辑结构特征1.1以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。

1.2有且仅有一个开始结点,没有直接前驱,且仅有一个直接后继;有且仅有一个终结结点,没有直接后继,且仅有一个直接前驱。

1.3其余内部结点都有且仅有一个直接前驱和一个直接后继。

2掌握线性表的基本操作在顺序存储结构上的实现。

【实验原理】1顺序表的特点1.1逻辑位置上相邻和物理位置上相邻1.2是一种随机存储结构,其存储位置可以用一简单直观的公式表示2顺序表的类C语言表示:#define LIST_INIT_SIZE 9 II线性表存储空间的初始分配量#define LISTINCREMENT? II线性表存储空间的分配增量typedef struct{ElemType * elem;//存储空间基址int len gth;II 当前长度int listsize;II 当前分配的存储容量(以sizeof ( ElemType)为单位)}SqList;【实验环境】VC++6.0、【实验内容】【实验方案】编写主函数,调用顺序表的初始化建空表,插入和删除算法,调试运行得出结果【实验过程】(实验步骤、记录、数据、分析)*(p+1)=*p;*q=e;++L .len gth; return OK;}Status ListDelect_Sq(SqList &L,int i,ElemType &e) {if((i<1)||(i>L.length)) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L .len gth-1;for(++p;p<=q;++p)*(p-1)=*p;--L .len gth;return OK;}void main(){SqList L;int i;In itList_Sq(L); for(i=0;i<LIST_INIT_SIZE;i++){scan f("%d",&L.elem[i]); L.len gth++;} for(i=0;i<L .len gth;i++) prin tf("%d ",L .elem[i]);prin tf("\n");ElemType e;sca nf("%d%d", &i,& e);ListI nsert_Sq(L,i,e);for(i=0;i<L .len gth;i++)prin tf("%d",L.elem[i]);prin tf("\n");sca nf("%d",&i);ListDelect_Sq(L,i,e);for(i=0;i<L .len gth;i++) prin tf("%d ",L .elem[i]);prin tf("\n");}2. 调试第一次出现的错误:C214:<: syntax error : missing befcre ***: Eienriipe^ : nlssirtg storage-class or specifiers CZFhl : ' elpn 11 : mi^ini| ?>Lordt|i?-tla^^ ur Lypt? spt?tiFiers C2146: 5i|ritax error : missing ' ;' before identif ier ' InitList _Sq C2591: 1Status * : missing storage-class or type ^pocifier£ error C130*ure»p&cted pnd oF Fil® found原因:由于许多变量未定义,以及没有头文件与宏定义所以错误许多,还有更多错 误没有显示出来3. 将以下语句编入程序中:#include "stdio.h" #inelude "stdlib.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define LIST_INIT_SIZE 9#define LISTINCREMENT 2 typedef int ElemType; typedef int Status;4. 调试第二次出现以下错误:.cpp(9£) : error C2965; *ncMbase" : Ufidrcl^rrd identifier■ eppe 蓟 :trror 02^0; : Cdniml cutivcrt fruin 'ibl *ftv 'inL rpi rirprprpt c^^T r J c-^ryi p r cr Funrttnn^^ryip r^«;r.cpp(3S> : error '-' : cannot convert fram 'int 1 ta 1int **pe to pointer type requires i pinterprrt cast, C style cast or functioncast:umJecltireij iJentifii?r :cannot convert +rom "int 备* to or Function-style cjst ;uiideLldreL iJetitifier :cannnr cflruprt 卡ram -i nr *■ tn cast oi* Punction-ft^lc c^stcpp■ - error cpp<^) ■ -error cpp(3) ■ errorcpp(6) - 启■cpp(e ■ ■■ errorcpp(8)■■ ■aFatal .) : t-rrtirC?965: .cpp)(Ji1 > : errorC2JPiU : * =' reinterpretoast, a C-st^le 工: trror CZ905: p".rp pl 即2》:frrur cpiuin : ' = ■ reinterpretcast, 2 C-'inL 'inr -^es a reinterpret cast * a C-style cast or function-style cast us _cpp(52) :error C2018: unknown character * 0xa1* us _cpp<52) : error C2 018: unknown character 'Qxa!*a reinterpretcast, a C^style cast or function^style cast fvs.cppCSS) : error C2100:illegal indirection Fus.cpp(55) : error C2100: illegal indirection Fus.cpp(55) : error原因:是在每个算法中有许多变量未定义,导致许多错误 5.再将语句:int *newbase;int *q; int *p;写入插入算法中; 将语句:int *p; int *q;写入删除算法中;6. 调试第三次显示没有错误:Compiling … asFvs ・(7ppasfus.obj - & error(s), 0 warning(s) 7. 运行第一次显示结果为:FUS.cpp(52) fus .cpp(S2) FUS .cpp(52) fU5.cpp(52) Fvs«cpp(52) 丽scpp(53) error error error error error error C2 018: C2EMB : C2018: C2 01«: unknown unknovjn unknovm unkin om character ch^ract^r character character• Oxal 1■'0xa1' 'Oxal 1C210O: illegal C2^40: indirection・:cannot convertfrom *int *pto 'int ' "es a reinterpret cast, a C^style cast or Function-st^le cast ^asFus _cpp02) tasfiis >cpp(42) ^asFus.cpp(42) ^asfus>cpp(U3) 需弓fu 与 _cpp<51) IQS F US _C PPCE1) idsFus .cpp (51 j idsFu^ >cpp(51) ^asfu^.cpp(51) error error error error error □ rr or error error err or C21OO: illegal indirectioin C21oo : illegal indirectionC2196: 1=' : left operand must be 1-ualueC210C: illegalC2018: C20i8:C2918: C2C18: unknown unicnoun unknown unknownC244C :' indirection character 10xa11character '* character '0xa1* character 'Oxa1*:cannot conuert from 'int to * int' C2106: • : left operand must be 1-ualueuunt xyui auxutt. i 忖丄Compiling ____asfvs.cppasfus.ob j - Q error(s)r0 warning(s)13.运行第四次显示结果为:*H:\De bug時临恚或咗序表尹W实現芒灼耳请输入您想构建的顺序表(元素为9个)=1 2 3 4 E 6 7 S 9您构建的顺序表杲:■£22456789请输入您想在第几个元素位置前插入元素二18输入的数字错误.(只乘U下瞅重新输入符合要求的数字的机会)常入的数字错误.(只剩Ft枕重新输入符合要求的数字的机会){青输入您想插入的数:6183形成的新顺序表为;彳7 4 4 C 仇 ~(曲4 £."5 Q o睛输入您想删除的是第几个元素:13输入的数字诸误.(只剩下2次重新输入符合要求的数字的机会)易入的数字错误,(只剩下丄次重新输入符合要求的数字的机会)电除的数为:協咸的新顺序表为=1 2 3 4 5 6183 ? 8 9Press ani^ y to comtinue1 刑这样那么程序就完整了,清晰明了,用户运行的时候也容易知道自己要输入什么了【实验结论】(结果)i 曲%谍性義的1驚表示与实现心b L 口 |屈*3^附录1源程序\n",p);附录2:实验报告填写说明1.实验项目名称:要求与实验教学大纲一致。

线性表逆置(顺序表)实验报告

线性表逆置(顺序表)实验报告

实验一:线性表逆置(顺序表)实验报告(一)问题的描述:实现顺序表的逆置算法(二)数据结构的设计:顺序表是线性表的顺序存储形式,因此设计如下数据类型表示线性表:typedef struct{ElemType *elem; /* 存储空间基址*/int length; /* 当前长度*/int listsize; /* 当前分配的存储容量(以sizeof(ElemType) 为单位) */}SqList;(三)函数功能、参数说明及概要设计:1.函数Status InitList(SqList *L) 功能说明:实现顺序表L 的初始化算法设计:为顺序表分配一块大小为LIST_INIT_SIZE 的储存空间2.函数int ListLength(SqList L) 功能说明:返回顺序表L 长度算法设计:返回顺序表中的length 变量3.函数Status ListInsert(SqList *L,int i,ElemType e)功能说明:将元素e插入到顺序表L中的第i个节点算法设计:判断顺序表是否已满,已满则加空间,未满则继续,将元素e插入到第i个元素之前,并将后面的元素依次往后移4.函数Status ListTraverse(SqList L,void(*vi)(ElemType*))功能说明:依次对L 的每个数据元素调用函数vi()算法设计:依次对L 的每个数据元素调用函数vi()5.函数void Exchange(SqList *L)功能说明:实现顺序表L 的逆置算法设计:用for 循环将顺序表L 中的第i 个元素依次与第( i+length )个元素交换6.函数void print(ElemType *c)功能说明:打印元素 c算法设计:打印元素 c2.(四)具体程序的实现/* 程序名 */#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc() 等 */#include<limits.h> /* INT_MAX 等 */#include<stdio.h> /* EOF(=A Z 或 F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在 math.h 中已定义 OVERFLOW 的值为3,故去掉此行 */typedef int Status; /* Status 是函数的类型 ,其值是函数结果状态代码,如 OK 等 */ typedef int Boolean; /* Boolean 是布尔类型 ,其值是 TRUE 或 FALSE */typedef int ElemType;/* 线性表的动态分配顺序存储结构 */#define LIST_INIT_SIZE 10 #define LISTINCREMENT 2typedef struct{ElemType *elem;int length;int listsize; // }SqList; /* 顺序表示的线性表的基本操作 */Status InitList(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; /* 初始存储容量 */ return OK;}// 线性表存储空间的初始分配量// 线性表存储空间的分配增量 // 存储空间基址 // 当前长度当前分配的存储容量 (以 sizeof(ElemType) 为单位 )Status DestroyList(SqList *L){ /* 初始条件:顺序线性表L 已存在。

数据结构线性表的顺序表示和实现的实习报告

数据结构线性表的顺序表示和实现的实习报告

数学与计算科学学院实验报告实验项目名称线性表的顺序表示与实现所属课程名称数据结构实验类型验证型实验日期班级学号姓名成绩2.调试第一次出现的错误:原因:由于许多变量未定义,以及没有头文件与宏定义所以错误许多,还有更多错误没有显示出来3.将以下语句编入程序中:#include "stdio.h"#include "stdlib.h"#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define LIST_INIT_SIZE 9#define LISTINCREMENT 2typedef int ElemType;typedef int Status;4.调试第二次出现以下错误:原因:是在每个算法中有许多变量未定义,导致许多错误5.再将语句:int *newbase;int *q;int *p;写入插入算法中;将语句:int *p;int *q;写入删除算法中;6.调试第三次显示没有错误:7.运行第一次显示结果为:8.但运行后的界面显得很单调;要是忘记下一个算法是什么就容易输入出错,也不适合大众使用;因此为了将程序优化,所以在主函数中增加以下输入输出语句和条件语句;为了让程序更加严谨,因此还加入一些循环语句。

int i,p,q;p=2,q=2;printf("请输入您想构建的顺序表(元素为%d个):\n",LIST_INIT_SIZE);printf("您构建的顺序表是:\n");printf("请输入您想在第几个元素位置前插入元素:\n",LIST_INIT_SIZE);while((i<=0||i>L.length)&&p>=0){printf("输入的数字错误,(只剩下%d次重新输入符合要求的数字的机会)\n",p);--p;if(p<0){printf("原因:您输入数字错误过多,程序终止运行\n");return ERROR;}scanf("%d",&i);}printf("请输入您想插入的数:\n");printf("形成的新顺序表为:\n");printf("请输入您想删除的是第几个元素:\n");while((i<=0||i>L.length)&&q>=0){printf("输入的数字错误,(只剩下%d次重新输入符合要求的数字的机会)\n",q);--q;ListInsert_Sq(L,i,e);printf("形成的新顺序表为:\n");for(i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");printf("请输入您想删除的是第几个元素:\n");scanf("%d",&i);while((i<=0||i>L.length)&&q>=0){printf("输入的数字错误,(只剩下%d次重新输入符合要求的数字的机会)\n",q);--q;if(q<0){printf("原因:您输入数字错误过多,程序终止运行\n");return ERROR;}scanf("%d",&i);}ListDelect_Sq(L,i,e);printf("删除的数为:\n");printf("%d\n",e);printf("形成的新顺序表为:\n");for(i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");return 0;}10. 调试第四次显示没错误:11.运行第二次显示结果为:12.运行第三次显示结果为:13.运行第四次显示结果为:这样那么程序就完整了,清晰明了,用户运行的时候也容易知道自己要输入什么了【实验结论】(结果)附录1:源程序附录2:实验报告填写说明1.实验项目名称:要求与实验教学大纲一致。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
功能说明:依次对L的每个数据元素调用函数vi()
算法设计:依次对L的每个数据元素调用函数vi()
5.函数void Exchange(SqList *L)
功能说明:实现顺序表L的逆置
算法设计:用for循环将顺序表L中的第i个元素依次与第(i+length)个元素交换
6.函数void print(ElemType *c)
3.函数Status ListInsert(SqList *L,int i,ElemType e)
功能说明:将元素e插入到顺序表L中的第i个节点
算法设计:判断顺序表是否已满,已满则加空间,未满则继续,将元素e插入到第i个元素之前,并将后面的元素依次往后移
4.函数Status ListTraverse(SqList L,void(*vi)(ElemType*))
if(!newbase)
exit(OVERFLOW);//存储分配失败
(*L).elem=newbase;//新基址
(*L).listsize+=LISTINCREMENT; //增加存储容量
}
q=(*L).elem+i-1;// q为插入位置
for(p=(*L).elem+(*L).length-1;p>=q;--p) //插入位置及之后的元素右移
功能说明:打印元素c
算法设计:打印元素c
2.
(四)具体程序的实现
/*程序名*/
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等*/
#include<limits.h> /* INT_MAX等*/
#include<stdio.h> /* EOF(=^Z或F6),NULL */
typedef struct
{
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
/*顺序表示的线性表的基本操作*/
Status InitList(SqList *L) /*算法2.3 */
{//初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数
return L.length;
}
Status ListInsert(SqList *L,int i,ElemType e) //算法2.4
{ //初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
{ /*操作结果:构造一个空的顺序线性表*/
(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!(*L).elem)
exit(OVERFLOW); /*存储分配失败*/
(*L).length=0; /*空表长度为0 */
(*L).listsize=LIST_INIT_SIZE; /*初始存储容量*/
实验一:线性表逆置(顺序表)实验报告
(一)问题的描述:
实现顺序表的逆置算法
(二)数据结构的设计:
顺序表是线性表的顺序存储形式,因此设计如下数据类型表示线性表:
typedef struct
{
ElemType *elem; /*存储空间基址*/
int length; /*当前长度*/
int listsize; /*当前分配的存储容量(以sizeof(ElemType)为单位) */
ElemType *newbase,*q,*p;
if(i<1||i>(*L).length+1)// i值不合法
return ERROR;
if((*L).length>=(*L).listsize)//当前存储空间已满,增加分配
{
newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int ElemType;
/*线性表的动态分配顺序存储结构*/
#define LIST_INIT_SIZE 10//线性表存储空间的初始分配量
#define LISTINCREMENT 2//线性表存储空间的分配增量
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
/*函数结果状态代码*/
#define TRUE 1
return OK;
}
Status DestroyList(SqList *L)
{ /*初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L */
free((*L).elem);
(*L).elem=NULL;
(*L).length=0;
(*L).listsize=0;
return OK;
}
int ListLength(SqList L)
*(p+1)=*p;
*q=e;//插入e
++(*L).length;//表长增1
return OK;
}
Status ListTraverse(SqList L,void(*vi)(ElemType*))
#define FALSE 0#define OK 1#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/
}SqList;
(三)函数功能、参数说明及概要设计:
1.函数Status InitList(SqList *L)
功能说明:实现顺序表L的初始化
算法设计:为顺序表分配一块大小为LIST_INIT_SIZE的储存空间
2.函数intListLength(SqList L)
功能说明:返回顺序表L长度
算法设计:返回顺序表中的length变量
相关文档
最新文档