实验二 线性表(顺序存储)

实验二线性表(顺序存储)
一、实验目的
1. 了解线性表的逻辑结构特性,以及这种特性在
计算机内的两种存储结构。

2. 重点是线性表的基本操作在两种存储结构上的实现;本次实验以顺序存储的操作为侧重点;并进一步学习结构化的程序设计方法。

二、实例
1. 线性表的顺序存储表示(结构)及实现。

阅读下列程序请注意几个问题:
(1)关于线性表的顺序存储结构的本质是:在逻辑上相邻的两个数据元素a i-1, a i,在存储地址中也是相邻的,既地址连续。

不同的教材有不同的表示,有的直接采用一维数组,这种方法有些过时。

有的采用含‘动态分配’一维数组的结构体,这种方法过于灵活抽象(对读者要求过高)。

我们采用的是含‘静态’一维数组和线性表长的结构体:
typedef struct
{ ElemType a[MAXSIZE]; /* 一维数组子域 */
int length; /* 表长度子域 */
}SqList; /* 顺序
存储的结构体类型 */
(2)本程序是一个完整的、子函数较多的源程
序。

目的为学生提供一个示范,提供顺序存储表示的
资料,供学生参考。

比如,主函数中简单“菜单设计”
(do-while循环内嵌套一个 switch结构)技术。

在学
习数据结构的初级阶段,并不强要求学生一定使用
“菜单设计”技术,同学们可以在main()函数中直接
写几个简单的调用语句,就象前面的复数处理程序中
的main()一样。

但是随着学习的深入,尽早学会使用
“菜单设计”技术,会明显提高编程和运行效率。

[源程序]
(略)
三、实验题
1. 一个线性表有n个元素(n<MAXSIZE, MAXSIZE指
线性表的最大长度),且递增有序。

现有一元素x要
插入到线性表的适当位置上,并保持线性表原有的顺
序不变。

设计程序实现。

要求:采用顺序存储表示实
现;
提示:
请按照如下顺序实现本题功能:
第一步:创建顺序表,并输出原始数据
第二步:排序,输出排好序的线性表
第三步:输入要插入的元素x
第四步:将x插入已排序的线性表中,使线性表仍然有序
第五步:输出最终结果
要求:
1、70分程序
//事先直接给定有序表
#include<stdio.h>
#define MAXSIZE 50
typedef struct
{
int a[MAXSIZE];
int length;
}List;
void main()
{
List L;
int i,j;
int x;
L.length=10;
for(i=0;i<10;i++)
L.a[i]=2*i;
printf("事先给定的有序表为(当前表长为10):\n");
for(i=0;i<L.length;i++)
printf("%4d",L.a[i]);
printf("\n请输入一个数x");
scanf("%d",&x);
for(i=9;i>=0;i--)
{
if(x<L.a[i])
L.a[i+1]=L.a[i];
else
{L.a[i+1]=x;
//printf("%d",L.a[i]);
++L.length;
break;}
}
for(i=0;i<L.length;i++)
printf("%4d",L.a[i]);
}
2、80分程序:
//事先直接给定有序表,用函数实现数据元素x的插入
#include<stdio.h>
#define MAXSIZE 50
typedef struct
{
int a[MAXSIZE];
int length;
}List;
void Insert(List *L,int x);
void main()
{
List L;
int i,j;
int x;
L.length=10;
for(i=0;i<10;i++)
L.a[i]=2*i;
printf("事先给定的有序表为(当前表长为10):\n");
for(i=0;i<L.length;i++)
printf("%4d",L.a[i]);
printf("\n");
//以下程序段请填空完成:现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。

printf("请输入要插入的元素x:");
scanf("%d",&x);
Insert(&L,x);
}
//请完成Insert()函数
3、100分程序:
//按步骤完成全部功能,并用函数实现
#include<stdio.h>
#define MAXSIZE 50
typedef struct
{
int a[MAXSIZE];
int length;
}List; //请注意该顺序表的结构
void Create(List *L);
void Sort(List *L);
void Display(List L);
void Insert(List *L,int x);
main()
{
int i,x;
List L;
printf("1、创建线性表(初始化和尾部插入)\n");Create(&L);
Display(L);
printf("2、对线性表进行排序\n");Sort(&L);
Display(L);
printf("3、请输入要插入的元素:");scanf("%d",&x);
printf("4、将x插入到有序表中\n");Insert(&L,x);
Display(L);
}
void Create(List *L)
{
//请填空完成创建无序链表的函数
void Sort(List *L)
{
int i,j,t;
for(i=0;i<L->length-1;i++) //冒泡排序,若采用其他排序方法,可加分
for(j=0;j<L->length-i-1;j++)
if(L->a[j]>L->a[j+1])
{
t=L->a[j];L->a[j]=L->a[j+1];L->a[j+1]=t;
}
}
void Display(List L)
{
//请完成显示顺序表的函数
}
void Insert(List *L,int x)
{
//请完成往有序表L中插入元素x的函数,使顺序表仍然有序
四、要求
1、可以要求分组完成,组内成员不可超过3人,第一人为满分(根据程序所得的分数),第二人减去5分,第三人减去10分
2、独立完成的为满分,鼓励大家独立完成
3、下课前提交源程序,文件名为组内同学的名字(区分先后顺序)
4、实验报告在一周内上交,可三人一组(实验报告作为资料保存,不做打分依据)。

合集下载

线性表的基本操作

线性表的基本操作

实验二线性表的基本操作一、实验目的1.掌握用C++/C语言调试程序的基本方法。

2.掌握线性表的顺序存储和链式存储的基本运算,如插入、删除等.二、实验要求1.C++/C完成算法设计和程序设计并上机调试通过.2.撰写实验报告,提供实验结果和数据。

3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。

三、实验内容:1。

分析并运行以下各子程序的主要功能。

程序1:顺序存储的线性表和运算#include<stdio。

h>#define MAXSIZE 100int list[MAXSIZE];int n;/*insert in a seqlist*/int sq_insert(int list[], int *p_n, int i, int x){int j;if (i〈0 || i>*p_n) return(1);if (*p_n==MAXSIZE) return(2);for (j=*p_n+1; j〉i; j——)list[j]=list[j-1];list[i]=x;(*p_n)++;return(0);}/*delete in a seq list*/int sq_delete(int list[], int *p_n, int i){int j;if (i〈0 || i>=*p_n) return(1);for (j = i+1; j〈=*p_n; j++)list[j-1] = list[j];(*p_n)—-;return(0);}void main(){int i,x,temp;printf(”please input the number for n\n”);printf("n=”);scanf("%d",&n);for (i=0; i<=n; i++){printf(”list[%d]=",i);scanf(”%d",&list[i]);}printf(”The list before insertion is\n”);for (i=0; i<=n; i++) printf(”%d ",list[i]);printf(”\n”);printf(”please input the position where you want to insert a value\nposition=”);scanf(”%d",&i);printf(”please input the value you want to insert。

实验2 线性表顺序存储

实验2 线性表顺序存储

实验2 线性表顺序存储实验类型:验证性要求:必做学时:2实验目的:(1)掌握线性表的特点(2)掌握线性表顺序存储结构的基本运算。

(3)掌握线性表的创建、插入、删除和显示线性表中元素等基本操作。

实验内容:(1)用结构体描述一个顺序表。

(2)创建顺序表;在顺序表中插入元素、删除元素;显示顺序表中所有元素等基本操作。

(3)用if 语句设计一个选择式菜单。

源程序:#define MAXSIZE 100 //MAXSIZE 为线性表可能的最大长度#include <stdio.h>typedef struct{int data[MAXSIZE];int last;} SeqList; //线性表定义void CreatSqlist(SeqList &L,int n) //建立一个顺序存储的线性表{ int i;if(n<0||n>MAXSIZE)printf("n的值不正确,请重新输入\n");else{for(i=0;i<n;i++)scanf("%d",&L.data[i]);L.data[i]=n;}}void Output(SeqList L) //输出顺序表L{ int i;if(st<0)printf("线性表不存在\n");else{for(i=0;i<L.data[i];i++)printf("%d",&L.data[i]);}}int Length(SeqList L) //求线性表的长度{if(st<0)printf("线性表不存在\n");return 0;}int Search(SeqList L, int x)//查找函数。

返回L中第1个与x相等的数据元素的位置(从0算起),否则返回值为0{int i=0;while(i<=st&&L.data[i]!=x)i++;if(i>st)return -1;elsereturn i;}int Insert(SeqList &L, int x,int i)//在线性表L中第i个数据元素之前插入一个数据元素x{ int j;if(st==MAXSIZE-1){printf("位置出错!");return 0;}for(j=st;j>=i-1;j--)L.data[j+1]=L.data[j];L.data[i-1]=x;st++;return 1;}int Delete(SeqList &L,int i) //删除线性表L中第i个数据元素{ int j;if(i<1||i>st+1){printf("不存在第i个元素\n");return 0;}for(j=1;j<=st;j++)L.data[j-1]=L.data[j];st--;return 1;}void main(){int choice,j=1,n,x,k,i;SeqList l;while(j){printf("\n");printf("\n\t\t 线性表顺序存储 ");printf("\n\t\t********************************");printf("\n\t\t* 1----建立顺序表 *");printf("\n\t\t* 2----输出顺序表 *");printf("\n\t\t* 3----在顺序表中查找 *"); printf("\n\t\t* 4----向顺序表中插入元素 *");printf("\n\t\t* 5----删除顺序表中的元素 *");printf("\n\t\t* 6----求顺序表长度 *");printf("\n\t\t* 0----返回 *");printf("\n\t\t 请选择菜单号0---6:");scanf("%d",&choice);switch(choice){case 1: {printf("输入元素值,构建顺序表:\n");printf("请输入顺序表元素的个数: ");scanf("%d",&n);CreatSqlist(l, n); //建立长度为n的顺序表l Output(l); //输出表lbreak;}case 2: Output(l); printf("\n");break;case 3: {printf("请输入要查找的元素值: ");scanf("%d",&x);k=Search(l,x);printf("要查找的元素的定位:%d\n",k);printf("\n");break;}case 4: {printf("输入要插入元素的位置及其值: ");scanf("%d",&i);scanf("%d",&x);Insert(l, x, i);Output(l); //输出插入元素后的表l printf("\n");break;}case 5: {printf("输入要删除元素的位置: "); scanf("%d",&i); Delete(l,i);Output(l); //输出删除元素后的表l break;}case 6: {printf("线性表长度为: ");k=Length(l);printf("%3d\n",k);break;}case 0: j=0;break;default:printf("\n\t\t 菜单选择错误!请重输."); }}}运行结果:。

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

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

实验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. 以线性表的各种操作(建立、插入、删除等)的实现为重点;3. 掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;二、实验内容:1.输入一组整型数据,建立顺序表。

2.实现该线性表的删除。

3、实现该线性表的插入。

4.实现线形表中数据的显示。

5.实现线性表数据的查找和定位5、编写一个主函数,调试上述算法。

三、实验原理、方法和手段1.根据实验内容编程,上机调试、得出正确的运行程序。

2. 编译运行程序,观察运行情况和输出结果。

3. 写出实验报告(包括源程序和运行结果)。

四、实验条件运行Visual stadio 2010的微机一台五、实验步骤(程序清单):// 实验一.cpp : 定义控制台应用程序的入口点。

//#include"stdafx.h"#include<iostream>#include<string.h>#include<stdlib.h>using namespace std;typedef int ElemType;struct List{ElemType *list;int size;int MaxSize;};void InitList(List &L,int n) //初始化线性表{L.MaxSize =n+5;L.list=new ElemType [L.MaxSize];if(L.list==NULL){ cout<<"动态可分配的存储空间已用完,退出运行!"<<endl;exit(1);}L.size=0;}void InputList(List &L) //输入元素{L.size =L.MaxSize-5;for(int i=0;i<L.size;i++){cout<<"请输入第"<<i+1<<"个元素:"<<endl;cin>>L.list[i];}}void FindList(List &L) //查找位置{if(L.size==0){cout<<"线性表为空,查找失败!"<<endl;return;}else{int item;Find:cout<<"请输入要查找的元素:";cin>>item;int i;for(i=0;i<L.size;i++)if(L.list[i]==item){item=L.list[i];cout<<"查找成功!您所查找的数据"<<item<<" 在第"<<i+1<<"个位置"<<endl;break;}if(i>=L.size){cout<<"您所查找的数据不存在!"<<endl;Find2:cout<<"是否继续查找?(y/n):";char c[100];cin>>c;if(strlen(c)==1){if(c[0]=='y')goto Find;else if(c[0]!='y'&&c[0]!='n'){cout<<"您输入的操作无效!";goto Find2;}else return;}else{cout<<"您输入的操作无效!请重新选择:";goto Find2;}}}}void DisplayList(List &L) //按位置查找元素{if(L.size ==0){cout<<"线性表为空,查找失败!"<<endl;return;}else{int pos;Display:cout<<"请输入您要查找元素的位置:";cin>>pos;if(pos<1||pos>L.size){cout<<"您输入的位置无效!"<<endl;Display2:cout<<"是否继续按位置查找?(y/n):";char c[100];cin>>c;if(strlen(c)==1){if(c[0]=='y')goto Display;else if(c[0]!='y'&&c[0]!='n'){cout<<"您输入的操作不合法!";goto Display2;}else return;}else{cout<<"您输入的操作不合法!";goto Display2;}}elsecout<<"您要查找的第 "<<pos<<" 个数据为 "<<L.list[pos-1]<<endl;}}void ClearList(List &L) //清空线性表{if(L.list!=NULL){ delete [ ]L.list;L.list=NULL;}L.MaxSize=0;L.size=0;cout<<"清空成功!"<<endl;}void InsertList(List &L) //插入一个元素{if(L.size==0){cout<<"线性表为空,插入失败!"<<endl;return;}else{Insert:cout<<"请选择要插入的方式:按有序插入请输入0 按位置插入请输入位置值:";int pos;cin>>pos;cout<<"请输入要插入的元素:";ElemType item;cin>>item;if(pos<-1||pos>L.size+1){cout<<"位置值无效!"<<endl;Insert2:cout<<"是否继续插入?(y/n):";char c[100];cin>>c;if(strlen(c)==1){if(c[0]=='y')goto Insert;else if(c[0]!='y'&&c[0]!='n'){cout<<"您输入的操作无效!";goto Insert2;}else return;}else{cout<<"您输入的操作无效!";goto Insert2;}}int i;if(pos==0){ for(i=0;i<L.size;i++)if(item<L.list[i]) break;pos=i+1;}else if(pos==-1) pos=L.size+1;if(L.size==L.MaxSize){int k=sizeof(ElemType);L.list=(ElemType*)realloc(L.list,2*L.MaxSize*k);if(L.list==NULL){cout<<"动态可分配的存储空间已用完,退出运行!"<<endl;exit(1);}L.MaxSize=2*L.MaxSize;}for(i=L.size-1;i>=pos-1;i--)L.list[i+1]=L.list[i];L.list[pos-1]=item;L.size++;cout<<"插入成功!"<<endl;}}void DisplayAllList(List &L) //显示线性表数据{if(L.size ==0)cout<<"线性表不存在,请先创建!"<<endl;else{cout<<"Size="<<L.size<<" MaxSize="<<L.MaxSize<<endl;for(int i=0;i<L.size;i++)cout<<L.list[i]<<" ";cout<<endl;}}void DeleteList(List &L) //删除一个元素{if(L.size==0){cout<<"线性表为空,删除无效!"<<endl;return;}Delete:cout<<"请选择要删除的方式:删除指定元素请输入0 按位置删除请输入位置值:";int pos;cin>>pos;ElemType item;if(pos<0||pos>L.size){cout<<"位置值无效!"<<endl;Delete2:cout<<"是否继续删除?(y/n):";char c[100];cin>>c;if(strlen(c)==1){if(c[0]=='y')goto Delete;else if(c[0]!='y'&&c[0]!='n'){cout<<"您输入的操作不合法!";goto Delete2;}return;}else{cout<<"您输入的操作不合法!";goto Delete2;}}int i;if (pos==0){cout<<"按查找删除,请输入要删除的元素:";cin>>item;for(i=0;i<L.size;i++ )if(item==L.list[i]) break;if(i==L.size){cout<<"按查找删除,没有找到您要删除的元素! "<<endl; Delete3:cout<<"是否继续按查找删除?(y/n):";char c[100];cin>>c;if(strlen(c)==1){if(c[0]=='y')goto Delete;else if(c[0]!='y'&&c[0]!='n'){cout<<"您输入的操作不合法!";goto Delete3;}else return;}else{cout<<"您输入的操作不合法!";goto Delete3;}}pos=i+1;}else if(pos==-1)pos=L.size;item=L.list[pos-1];cout<<"您要删除的元素 "<<L.list[pos-1]<<"已删除成功!"<<endl;for(i=pos;i<L.size ;i++)L.list[i-1]=L.list [i];L.size--;if(float(L.size)/L.MaxSize<0.4&&L.MaxSize>10){int k=sizeof(ElemType);L.list=(ElemType*)realloc(L.list,L.MaxSize*k/2);L.MaxSize=L.MaxSize/2;}}void menu(){List t;InitList(t,0);menu:cout<<"欢迎进入线性表管理系统:"<<endl;cout<<" 1. 创建一个线性表"<<endl;cout<<" 2. 查找元素位置"<<endl;cout<<" 3. 按位置查找元素"<<endl;cout<<" 4. 插入一个元素"<<endl;cout<<" 5. 删除一个元素"<<endl;cout<<" 6. 清空该线性表"<<endl;cout<<" 7. 显示该线性表"<<endl;cout<<" 0. 退出系统"<<endl;menu2:cout<<"请输入你想要执行的操作:";char n[100];cin>>n;if(strlen(n)==1){if(n[0]<'0' || n[0]>'7'){cout<<"您输入的操作不合法,请重新选择!"<<endl;goto menu2;}}else{cout<<"您输入的操作不合法,请重新选择!"<<endl;goto menu2;}switch(n[0]){case'1':cout<<"请输入您所创建线性表元素的个数:";int m;cin>>m;InitList(t,m);InputList(t);cout<<endl;goto menu;case'2':FindList(t);cout<<endl;goto menu;case'3':DisplayList(t);cout<<endl;goto menu;case'4':InsertList(t);cout<<endl;goto menu;case'5':DeleteList(t);cout<<endl;goto menu;case'6':ClearList(t);cout<<endl;goto menu;case'7':DisplayAllList(t);cout<<endl;goto menu;case'0':break;default:cout<<"您输入的操作有误,请重新输入:";goto menu2;}}int _tmain(int argc, _TCHAR* argv[]){menu();}六、调试及运行:1.在未创建一个线性表前,选择其它操作会提示“线性表为空,操作打败”的提示,如图2.选择操作【1】.创建一个线性表,并输入11,22,33,44.如图3.选择操作【7】,显示线性表,便于查找元素位置。

建立一个顺序表,表中元素为学生,每个学生信息包含姓名、学号和成绩三部分,对该表实现输出、插入、删除、

建立一个顺序表,表中元素为学生,每个学生信息包含姓名、学号和成绩三部分,对该表实现输出、插入、删除、

云南大学物理实验教学中心实验报告课程名称:计算机软件技术基础实验项目:实验二、线性表(顺序存储)及其应用学生姓名:学号:学院系级专业成绩指导教师:实验时间:年日时分至时分实验地点:实验类型:教学(演示□验证□综合█设计□)学生科研□课外开放□测试□其它□一、实验目的:掌握顺序表的建立及基本操作。

二、问题:建立一个顺序表,表中元素为学生,每个学生信息包含姓名、学号和成绩三部分,对该表实现:①输出、②插入、③删除、④查找功能,并计算出平均成绩和总成绩。

三、程序的编写与调试1、原程序:#include <iostream>using namespace std;typedef struct{ long double num; char name[10]; int score; } STUDENT; class sq_LList{ private:int mm;int nn;STUDENT *v;public:sq_LList(int);void prt_sq_LList();void ins_sq_LList(int, STUDENT);void del_sq_LList(int);void sea_num_sq_LList(int);voidvoid cal_sq_LList(int);};/*输出*/sq_LList ::sq_LList(int m){ mm=m;v=new STUDENT [mm];v[0].num=970156; strcpy(v[0].name,"张小明"); v[0].score=87; v[1].num=970157; strcpy(v[1].name,"李小青"); v[1].score=96;v[2].num=970158; strcpy(v[2].name,"刘华");v[2].score=85; v[3].num=970159; strcpy(v[3].name,"王伟");v[3].score=93; v[4].num=970160; strcpy(v[4].name,"李启明"); v[4].score=88;nn=5;}void sq_LList ::prt_sq_LList(){ int i;for(i=0; i<nn; i++){ cout<<"学号: "<<v[i].num<<" 姓名: "<<v[i].name<<" "<<"分数: "<<v[i].score<<endl;}}/*插入*/void sq_LList ::ins_sq_LList(int i, STUDENT b){ int k;if(nn==mm){cout<<"overflow"; return ;}if(i>nn) i=nn+1;if(i<1) i=1;for(k=nn; k>=i; k--)v[k]=v[k-1];v[i-1]=b; nn=nn+1;}/*删除*/void sq_LList ::del_sq_LList(int i){ int k;if(nn==0){cout<<"underflow"<<endl; return ;}if((i<1)||(i>nn)){cout<<"Not this element in the list!"<<endl; return ;}for(k=i; k<nn; k++)v[k-1]=v[k];nn=nn-1;}/*按学号查找*/void sq_LList ::sea_num_sq_LList(int i){ int k,t ;____t=0;for(i=0;i<nn;i++){ if(v[i].num==k){ t=t+1;cout<<"学号: "<<v[i].num<<" 姓名: "<<v[i].name<<" "<<"分数: "<<v[i].score<<endl;}}if(t==0)cout<<"No this student in the list!"<<endl;}/*按姓名查找*/void sq_LList ::sea_name_sq_LList(int i, char y[]){ int t;____t=0;for(i=0;i<nn;i++){ if(strcmp(y,v[i].name)=0){t=t+1cout<<"学号: "<<v[i].num<<" 姓名: "<<v[i].name<<" "<<"分数: "<<v[i].score<<endl;}}if(t==0) cout<<"No this student in the list!"<<endl }/*计算*/void sq_LList ::cal_sq_LList(int m){ int i;float sum,avr;{ sum=0;for(i=0;i<nn;i++){sum=sum+v[i].score;avr=sum/(i+1);}}cout<<"总分:"<<sum<<endl;cout<<"平均分:"<<avr<<endl;}int main(){ int mx; sq_LList s1(100);while (1){ cout<<"1.输出 2.插入 3.删除 4.查找 5.计算 0.退出\n";cout<<"输入0-5:";cin>>mx;switch(mx){ case 1: s1.prt_sq_LList(); break;case 2: int i; STUDENT b;cout<<"输入插入点位置和插入元素值:";cin>>i>>b.num>>>>b.score;s1.ins_sq_LList(i,b); s1.prt_sq_LList(); break; case 3: cout<<"请输入删除学生的位置:";cin>>i;s1.del_sq_LList(i);s1.prt_sq_LList(); break; case 4: int main(){ int mx;while (1){cout<<"1.按学号查找 2.按姓名查找 0.返"<<endl;cout<<"输入0-2:";cin>>mx;switch (mx){casecout<<"请输入要查找学生的学号:";s1.sea_num_sq_LList(i); break;casecout<<"请输入要查找学生的姓名:";s1.sea_name_sq_LList(); break;case 0: cout<<"返回"<<endl; return ;}}return 0;} break;case 5: s1.cal_sq_LList(); break;case 0: cout<<"程序结束"<<endl; return 0;}}return 0;2、正确程序:#include <iostream>using namespace std;typedef struct{ long double num; char name[10]; int score; } STUDENT; class sq_LList{ private:int mm;int nn;STUDENT *v;public:sq_LList(int);void prt_sq_LList();void ins_sq_LList(int, STUDENT);void del_sq_LList(int);void sea_num_sq_LList(int);void sea_name_sq_LList();void cal_sq_LList(int);/*输出*/sq_LList ::sq_LList(int m){ mm=m;v=new STUDENT [mm];v[0].num=970156; strcpy(v[0].name,"张小明"); v[0].score=87; v[1].num=970157; strcpy(v[1].name,"李小青"); v[1].score=96;v[2].num=970158; strcpy(v[2].name,"刘华");v[2].score=85; v[3].num=970159; strcpy(v[3].name,"王伟");v[3].score=93; v[4].num=970160; strcpy(v[4].name,"李启明"); v[4].score=88;nn=5;}void sq_LList ::prt_sq_LList(){ int i;for(i=0; i<nn; i++){ cout<<"学号: "<<v[i].num<<" 姓名: "<<v[i].name<<" "<<"分数: "<<v[i].score<<endl;}}/*插入*/void sq_LList ::ins_sq_LList(int i, STUDENT b){ int k;if(nn==mm){cout<<"overflow"; return ;}if(i>nn) i=nn+1;if(i<1) i=1;for(k=nn; k>=i; k--)v[k]=v[k-1];v[i-1]=b; nn=nn+1;}/*删除*/void sq_LList ::del_sq_LList(int i){ int k;if(nn==0){cout<<"underflow"<<endl; return ;}if((i<1)||(i>nn)){cout<<"Not this element in the list!"<<endl; return ;}for(k=i; k<nn; k++)v[k-1]=v[k];nn=nn-1;}/*按学号查找*/void sq_LList ::sea_num_sq_LList(int i){ int k,t ;cin>>k;t=0;for(i=0;i<nn;i++){ if(v[i].num==k){ t=t+1;cout<<"学号: "<<v[i].num<<" 姓名: "<<v[i].name<<" "<<"分数: "<<v[i].score<<endl;}}if(t==0)cout<<"No this student in the list!"<<endl;}/*按姓名查找*/void sq_LList ::sea_name_sq_LList(){ char y[10]; int i,t;cin>>y;t=0;for(i=0;i<nn;i++){ if(strcmp(y,v[i].name)==0){t=t+1;cout<<"学号: "<<v[i].num<<" 姓名: "<<v[i].name<<" "<<"分数: "<<v[i].score<<endl;}}if(t==0) cout<<"No this student in the list!"<<endl; }/*计算*/void sq_LList ::cal_sq_LList(int m){ int i;float sum,avr;{ sum=0;for(i=0;i<nn;i++){sum=sum+v[i].score;avr=sum/(i+1);}}cout<<"总分:"<<sum<<endl;cout<<"平均分:"<<avr<<endl;}int main(){ int mx; sq_LList s1(100);while (1){ cout<<"1.输出 2.插入 3.删除 4.查找 5.计算 0.退出\n";cout<<"输入0-5:";cin>>mx;switch(mx){ case 1: s1.prt_sq_LList(); break;case 2: int i; STUDENT b;cout<<"输入插入点位置和插入元素值:";cin>>i>>b.num>>>>b.score;s1.ins_sq_LList(i,b); s1.prt_sq_LList(); break; case 3: cout<<"请输入删除学生的位置:";cin>>i;s1.del_sq_LList(i);s1.prt_sq_LList(); break; case 4:{ int mx;while (1){cout<<"1.按学号查找 2.按姓名查找 0.返"<<endl;cout<<"输入0-2:";cin>>mx;switch (mx){case 1: cout<<"请输入要查找学生的学号:";s1.sea_num_sq_LList(i); break;case 2: cout<<"请输入要查找学生的姓名:";s1.sea_name_sq_LList(); break;case 0: cout<<"返回"<<endl; return 0;}}return 0;} break;case 5: s1.cal_sq_LList(i); break;case 0: cout<<"程序结束"<<endl; return 0;}}return 0;}四、实验总结通过此次试验,我对线性表(顺序存储)有了全面的认识,知道了什么是线性表,以及线性表有什么作用;并学会了如何根据要求建立一个实际的线性表,包括线性表的输出、插入、删除、查。

《线性表的顺序存储》实验报告

《线性表的顺序存储》实验报告

《线性表的顺序存储》实验报告1.需解决的的问题利用顺序表,设计一组输入数据。

2.数据结构的定义typedefstruct{ElemType *elem;int length;intlistsize;}SqList;3.程序的结构图4.函数的功能1)初始化一个空顺序表voidInitSqList(SqList *L){L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L->elem) exit(OVERFLOW);L->length=0;L->listsize=LIST_INIT_SIZE;}2)输入元素voidPushSqList(SqList *L){inti;printf("input the length of the list:");scanf("%d",&L->length);printf("input the sqlist:");for(i=0;i<L->length;i++){printf("input the %dth number:",i+1);scanf("%d",&L->elem);}}3)在指定位置插入一个指定的元素voidInsertSqList(SqList *L,inti,ElemType x){ElemType *newbase;intn,m;if(i<1||i>L->length+1){printf("ERROR!");}if(L->length>=L->listsize){newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));if(!newbase) exit(OVERFLOW);L->elem=newbase;L->listsize+=LISTINCREMENT;}else{for(n=L->length;n>=i;n--){++L->length;L->elem[n]=L->elem[n-1];}L->elem[i-1]=x;printf("the list is:");for(m=0;m<L->length+1;n++)printf("%d",L->elem[n]);}}4)删除指定位置的元素voidDelSqList(SqList *L,inti){ElemType *p,*q;ElemType x;int n;if(i<1||i>L->length)printf("ERROR!");p=&(L->elem[i-1]);x=*p;for(q=p;q<&(L->elem[L->length-1]);q++)*q=*(q+1);L->length--;printf("the element which is delete is %d",x);printf("the list is:");for(n=0;n<L->length-1;n++)printf("%d",L->elem[n]);}5)将顺序表中所有的元素颠倒voidChangeoverSqList(SqList *L){SqList S;inti,j;if(L->length==L->listsize)S.elem=(ElemType*)malloc(L->length*sizeof(ElemType));if(!S.elem) exit(OVERFLOW);else{for(i=0;i<L->length;i++)S.elem[i]=L->elem[L->length-i-1];for(i=0;i<L->length;i++)L->elem[i]=S.elem[i];}printf("the list is:");for(j=0;j<L->length;i++)printf("%d",L->elem[i]);}6)按顺序输出表中元素voidPrintSqList(SqList *L){inti;for(i=0;i<L->length;i++)printf("%d ",L->elem[i]);}7)摧毁顺序表voidDestroySqList(SqList *L){if(L->elem) free(L->elem);}8)清空顺序表voidClearSqList(SqList *L){L->length=0;}9)查找指定位置的元素,并返回该元素的值intGetElem(SqList *L,inti){ElemType x;if(i<1||i>L->length+1) {printf("ERROR!");}else{x=L->elem[i-1];printf("the elem is %d",x);}}5.输入/输出数据1)创建一个顺序表,先输入表长度,然后输入数据2)选择菜单,进行不同操作选‘1’,在指定位置插入指定元素选‘2’,删除指定位置的元素选‘3’,颠倒顺序表中元素的顺序选‘4’,按顺序输出表中的元素选‘5’,摧毁顺序表选‘6’,清空线性表选‘7’,输出当前顺序表的长度选‘8’,输出指定位置的元素选‘9’,退出该程序6.总结这个实验让我更好的掌握了在线性表的顺序存储中如何初始化,如何进行输入输出的处理,以及各种常用功能是怎样实现的。

数据结构实验报告-线性表的顺序存储

学 号
姓 名
专业班级
实验地点
指导教师
实验时间
一、实验目的及要求
本次实验目的是通过上机练习,熟悉和掌握课堂所讲授的基本知识点。要求上机以前要认真复习课堂教学内容。完成教师带领实验,完成线性表的顺序存储实验。
二、实验设备(环境)及要求
计算机;学生不许把食物带到机房吃;不许上网做与实验无关的内容;不许同学之间聊天;保持实验室安静卫生。下课把键盘,座椅放回原处。
Integer length;/*当前线性表长度,线性表中现有元素个数*/
Integer listsize;/*当前分配的存储量以下定义线性表的操作*/
Integer InitList(Class_List *SqList)
/*构造一个空的线性表*/
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Integer;
typedef char *String;
typedef struct
{
Integer number;
String name[10];
Integer age;
String interest[50];
完成一个有多于3个学生的线性表。并且显示学生信息。删除其中一个学生。然后再打印显示。
Source.cpp
#include"header.h"
void main()
{
Class_List xinji2013;
InitList(&xinji2013);
Student st;
Integer i,n=2,w,q,e;
三、实验内容与步骤

数据结构实验二 线性表

数据结构实验二线性表数据结构实验二线性表一、实验目的本实验旨在帮助学生掌握线性表的基本概念、构造和基本操作,以及通过实际编程实现线性表的功能。

二、实验内容本实验包括以下几个部分:⑴线性表的定义和基本概念介绍线性表的定义,以及线性表中的元素、长度等基本概念。

⑵线性表的顺序存储结构介绍线性表的顺序存储结构的原理和实现方式,包括顺序表的定义、顺序表的初始化、插入和删除等操作。

⑶线性表的链式存储结构介绍线性表的链式存储结构的原理和实现方式,包括链表的定义、链表的插入和删除等操作。

⑷线性表的应用介绍线性表的应用场景和实际应用,如多项式的表示和运算等。

三、实验步骤⑴实验准备准备实验所需的编程环境和开发工具,如C语言编译器、集成开发环境等。

⑵实验设计根据实验要求和目标,设计实现线性表的相关功能,包括定义线性表、初始化线性表、插入和删除元素等。

⑶编码实现根据实验设计,编写程序代码实现线性表的功能。

⑷调试测试对编写的程序进行调试和测试,确保程序的正确性和可靠性。

⑸实验总结总结实验过程中遇到的问题和解决方案,对实验结果进行分析和评价。

四、实验注意事项⑴遵守实验守则在进行实验过程中,要遵守实验守则,注意安全和人身财产的保护。

⑵注意程序的健壮性在编写程序时,要考虑到各种异常情况的处理,保证程序的健壮性。

⑶注意代码的可读性和可维护性编写代码时,要注意代码的可读性和可维护性,使其易于阅读和修改。

⑷注意实验文档的完整性实验报告应包含所有实验内容的详细说明和实验过程的总结分析。

附件:本文档无附件。

法律名词及注释:本文档不涉及法律名词及注释。

数据结构实验报告二线性表的顺序存储

实验报告二线性表的顺序存储班级: 2010XXX 姓名: HoogLe 学号: 2010XXXX 专业: XXXX*****************一、实验目的:(1)掌握顺序表的基本操作的实现方法。

(2)应用顺序表的基本算法实现集合A=AUB算法。

(3)应用顺序表的基本算法实现两有序顺序表的归并算法。

二、实验内容:1、线性表顺序存储结构的基本操作算法实现(要求采用类模板实现)[实现提示] (同时可参见教材p5822-p60页算法、ppt)函数、类名称等可自定义,部分变量请加上学号后3位。

库函数载和常量定义:(代码)#include<iostream>using namespace std;const int MaxSize=100;(1)顺序表存储结构的定义(类的声明):(代码)template <class datatype> //定义模板类SeqListclass SeqList{public:SeqList( ); //无参构造函数SeqList(datatype a[ ], int n); //有参构造函数~SeqList(){}; //析构函数为空int Length(); //求线性表的长度datatype Get(int i); //按位查找,取线性表的第i个元素int Locate(datatype item); //查找元素itemvoid Insert(int i, datatype item); //在第i个位置插入元素itemdatatype Delete(int i); //删除线性表的第i个元素void display(); //遍历线性表,按序号依次输出各元素private:datatype data[MaxSize]; //存放数据元素的数组int length; //线性表的长度};(2)初始化顺序表算法实现(不带参数的构造函数)/**输入:无*前置条件:顺序表不存在*功能:构建一个顺序表*输出:无*后置条件:表长为0*/实现代码:template <class datatype>SeqList<datatype>:: SeqList( ){length=0;}(3)顺序表的建立算法(带参数的构造函数)/**输入:顺序表信息的数组形式a[],顺序表长度n*前置条件:顺序表不存在*功能:将数组a[]中元素建为长度为n的顺序表*输出:无*后置条件:构建一个顺序表*/实现代码:template <class datatype>SeqList<datatype>:: SeqList(datatype a[], int n) {if (n>MaxSize){cout<<"数组元素个数不合法"<<endl;}for (int i=0; i<n; i++)data[i]=a[i];length=n;}(4)在顺序表的第i个位置前插入元素e算法/**输入:插入元素e,插入位置i*前置条件:顺序表存在,i要合法*功能:将元素e插入到顺序表中位置i处*输出:无*后置条件:顺序表插入新元素,表长加1*/实现代码:template <class datatype>void SeqList<datatype>::Insert(int i, datatype item) {int j;if (length>=MaxSize){cout<<"溢出"<<endl;}if (i<1 || i>length+1){cout<<"i不合法!"<<endl;}for (j=length; j>=i; j--)data[j]=data[j-1];data[i-1]=item;length++;}(5)删除线性表中第i个元素算法/**输入:要删除元素位置i*前置条件:顺序表存在,i要合法*功能:删除顺序表中位置为i的元素*输出:无*后置条件:顺序表册除了一个元素,表长减1*/实现代码:template <class datatype>datatype SeqList<datatype>::Delete(int i){int item,j;if (length==0){cout<<"表为空,无法删除元素!"<<endl;}if (i<1 || i>length){cout<<"i不合法!"<<endl;}item=data[i-1];//获得要删除的元素值for (j=i; j<length; j++)data[j-1]=data[j]; //注意数组下标从0记length--;return item;}(6)遍历线性表元素算法/**输入:无*前置条件:顺序表存在*功能:顺序表遍历*输出:输出所有元素*后置条件:无*/实现代码:template<class datatype>void SeqList<datatype>::display(){if(length==0){cout<<"表为空,无法输出!"<<endl;}for(int i=0;i<length;i++){cout<<data[i]<<" ";}}(7)获得线性表长度算法/**输入:无*前置条件:顺序表存在*功能:输出顺序表长度*输出:顺序表长度*后置条件:无*/实现代码:template <class datatype>int SeqList<datatype>::Length(){return Length;}(8)在顺序线性表中查找e值,返回该元素的位序算法/**输入:查询元素值e*前置条件:顺序表存在*功能:按值查找值的元素并输出位置*输出:查询元素的位置*后置条件:无*/实现代码:template <class datatype>int SeqList<datatype>::Locate(datatype item){for (int i=0; i<length; i++)if (data[i]==item)return i+1 ;//下标为i的元素等于item,返回其序号i+1return 0; //查找失败}(9)获得顺序线性表第i个元素的值/**输入:查询元素位置i*前置条件:顺序表存在,i要合法*功能:按位查找位置为i的元素并输出值*输出:查询元素的值*后置条件:无*/实现代码:template <class datatype>datatype SeqList<datatype>::Get(int i){if (i<0||i>length){cout<<"i不合法!"<<endl;}else return data[i-1];}(10)判表空算法/**输入:无*前置条件:无*功能:判表是否为空*输出:为空返回1,不为空返回0*后置条件:无*/实现代码:template <class datatype>bool SeqList<datatype>::Empty(){if (length==0){return 1;}else{return 0;}}(11)求直接前驱结点算法/**输入:要查找的元素e,待存放前驱结点值e1*前置条件:无*功能:查找该元素的所在位置,获得其前驱所在位置。

实验报告

实验一线性表的顺序实现一、实验目的:(1)掌握线性表的顺序存储结构的定义及C语言实现。

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

二、实验要求:(1)复习课本中有关线性表的知识;(2)用C语言完成算法和程序设计并上机调试通过;(3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。

三、实验内容1、顺序表的建立2、顺序表的插入3、顺序表的删除4、顺序表的遍历实验二线性表的链式实现一、实验目的:(1)掌握线性表的链式存储结构——单链表的定义及C语言实现。

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

二、实验要求:(1)复习课本中有关线性表的知识;(2)用C语言完成算法和程序设计并上机调试通过;(3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。

三、实验内容1、单链表的建立2、单链表的插入3、单链表的删除4、单链表的合并5、删除单链表中的重复值实验三栈(队列)的实现一、实验目的:(1)熟悉栈(队列)的特点及栈(队列)的基本操作,如入栈、出栈(入队、出队)等。

(2)掌握栈(队列)的基本操作在栈(队列)的顺序存储结构和链式存储结构上的实现;二、实验要求:(1)复习课本中有关栈(队列)的知识;(2)用C语言完成算法和程序设计并上机调试通过;(3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。

三、实验内容:编写一个程序实现顺序栈(队列)的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈(队列)(2)插入元素(3)删除栈顶(队头)元素(4)取栈顶(队头)元素(5)遍历顺序栈(队列)(6)置空顺序栈(队列)(7)完成数制转换实验四、二叉树的基本操作的实现一、实验目的:(1)掌握二叉树链表的结构和二叉树的建立过程;(2)掌握二叉树的基本操作,加深对二叉树的理解,逐步培养解决实际问题的编程能力。

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