实验二 线性表(顺序存储)
- 格式:doc
- 大小:23.50 KB
- 文档页数:9
实验二线性表的基本操作一、实验目的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实验目的:(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.总结这个实验让我更好的掌握了在线性表的顺序存储中如何初始化,如何进行输入输出的处理,以及各种常用功能是怎样实现的。
数据结构实验二线性表数据结构实验二线性表一、实验目的本实验旨在帮助学生掌握线性表的基本概念、构造和基本操作,以及通过实际编程实现线性表的功能。
二、实验内容本实验包括以下几个部分:⑴线性表的定义和基本概念介绍线性表的定义,以及线性表中的元素、长度等基本概念。
⑵线性表的顺序存储结构介绍线性表的顺序存储结构的原理和实现方式,包括顺序表的定义、顺序表的初始化、插入和删除等操作。
⑶线性表的链式存储结构介绍线性表的链式存储结构的原理和实现方式,包括链表的定义、链表的插入和删除等操作。
⑷线性表的应用介绍线性表的应用场景和实际应用,如多项式的表示和运算等。
三、实验步骤⑴实验准备准备实验所需的编程环境和开发工具,如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)掌握二叉树的基本操作,加深对二叉树的理解,逐步培养解决实际问题的编程能力。
线性表的顺序存储结构实验报告总结一、需求分析⒈本程序中,要求输入到表A,B中的元素是整形的,并且要按非递增顺序输入,否则系统会给出“出错信息”。
输出结果应该是一个不含有重复元素的非递增的表。
⒉本程序以用户和计算机的对话方式执行,即在计算机演示界面上显示“提示信息”后,由用户在键盘上输入相应的信息;相应的输入数据和运算结果显示在其后。
⒊程序执行的命令包括:(1)构造线性表A (2)构造线性表B (3)检验表A,B是否非递减有序(4)求表A与B的合并(5)删除表中值相同的多余元素(6)结束。
4.测试数据(1)A=123(2)A=9 5 0 -2B=1050-1-3-5 -10二、概要设计⒈为实现上述算法,需要线性表的抽象数据类型:ADT Stack {数据对象:D={ai:|ai∈ElemSet,i=1…n,n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…n}基本操作:init(list *L)操作结果:构造一个空的线性表L。
InputList(List *L)初始条件:线性表L已经存在操作结果:人工输入了一张表。
CheckList(List *L)初始条件:线性表L已经存在操作结果:判断L是否非递增有序,若为否,则重新输入。
MergeList(List *La,List *Lb,List *Lc)初始条件:非递增线性表La,Lb已经存在操作结果:合并La,Lb得到Lc,Lc仍按非递增有序排列。
DeleteSame(List *L)初始条件:非递增线性表L已经存在操作结果:删除了L中值相同的元素。
PrintList(List L)初始条件:线性表L已经存在操作结果:打印出表L。
}ADT List2. 本程序有三个模块:⑴主程序模块void main(){初始化;do{接受命令;显示结果;}while(执行完毕)}⑵线性表单元模块:实现线性表抽象数据类型;⑶结点结构单元模块:定义线性表中的结点结构。
实验一顺序存储线性表的基本运算一、实验目的1、掌握线性表的定义、顺序存储的方法及基本操作。
2、2掌握将算法在VC++6.0语言环境下实现的过程。
二、实验原理利用线性表的顺序存储结构完成一个班级的一个学期的所有课程成绩的管理,要求实现增加、删除学生的成绩记录等运算。
三、实验仪器和设备1、PC微机2、Microsoft VC++6.0四、预习要求1、复习线性表的定义、线性表的顺序存储结构的定义以及顺序存储线性表的增加、删除元素的算法。
2、掌握顺序存储线性表的C语言的实现。
五、实验内容及步骤编写程序如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define Max_length 3typedef struct{int xh; /*学号*/char name[35]; /*姓名*/int c1,c2,c3; /*三门课程成绩*/} Element;/*删除第i个学生的记录算法*/int Delete_list(int i,Element s[ ] ,int *n_pointer){int j,n;n=*n_pointer;if((i<1) ||(i>n))return(0);for (j=i+1;j<=n;j++){/*移动*/s[j-1].xh=s[j].xh;// strcopy(s[j-1].name,s[j].name);s[j-1].name,s[j].name;s[j-1].c1=s[j].c1;s[j-1].c2=s[j].c2;s[j-1].c3=s[j].c3;}n--;*n_pointer=n;return (1);}/*查找学号为x的算法*/int Locate_list (Element s[ ], int n, int x){int i;for(i=1;i<=n;i++)if (s[i].xh==x)return (i);return (0);}/*修改学号为i的学生的记录函数*/int Change_list (int i, Element s[ ] ){if( (i<1) || (i>Max_length +1) ) return (0);printf ("Input data for updating :\n");scanf ("%d%s%d%d%d",s[i].xh,s[i].name,s[i].c1,s[i].c2,s[i].c3);return (1);}/*打印已建立的数据记录,n是记录总数*/void printf_list (Element s[ ],int n){int i;if(n>Max_length) return ;printf ("XH Name C1 C2 C3 \n");printf("--------------------------------------------\n");for(i=1;i<=n;i++)printf ("%4d%10s%7d%7d%7d\n",s[i].xh,s[i].name,s[i].c1,s[i].c2,s[i].c3); }/*在第i个记录的后面插入一个学生的记录算法*/int Insert_list (int i,Element s[ ],int *n_pointer){/*n_pointe存放已输入的最大记录数*/int j,n;n=*n_pointer;if((n== Max_length) || (i<1) || (i>n+1)) return (0);for(j=n;j>=1;j--) s[j+1]=s[j]; /*移动*/printf("Input Data for inserting (XH Name C1 C2 C3) \n");scanf("%d%s%d%d%d",&s[i].xh,&s[i].name,&s[i].c1,&s[i].c2,&s[i].c3);n++;*n_pointer=n;return (1);}void main ( ){int i, records=0;Element s[Max_length];/*创建线性表*/for (i=1;i<=Max_length;i++)Insert_list ( i, s, &records);/*创建线性表*/printf_list (s, records); /*显示学生记录内容*/}上机调试、运行源程序。
实验二-顺序存储的线性表实验报告宁波大红鹰学院实验报告实验名称:实验二顺序存储的线性表学院:信息工程学院专业:信息管理与信息系统年级:2012级小组成员1:于益锋学号:1211060544 职责:编程和报告设计小组成员2:学号:职责:小组成员3:学号:职责:实验时间:年月日实验类型:综合性实验地点:XX—405 成绩:指导教师签字:实验报告基本内容要求:一、实验目的和要求;二、实验内容和原理;三、主要仪器设备;四、操作方法与实验步骤;五、实验数据记录和处理;六、实验结果与分析;七、讨论、心得一、实验目的1.复习并掌握算法设计的要点2.了解线性表的逻辑结构特性,以及这种特性在计算机内的两种存储结构。
3. 重点是线性表的基本操作在两种存储结构上的实现;本次实验以顺序存储的操作为侧重点;并进一步学习结构化的程序设计方法。
二、实验内容1、课堂讨论1)数据结构是抽象的一种组织,是由数据类型组织成的。
数据类型是组成数据结构的元素。
2)线性结构是最简单最常用的一种数据结构,线性结构的特点是结构中的元素之间满足线性关系,按这个关系可以把所有元素排成一个线性序列.线性表,串,栈和队列都属于线性结构.而非线性结构是指在该类结构中至少存在一个数据元素,它具有两个或者两个以上的前驱或后继.如树和二叉树等3)目的是评价算法的效率,通过评价可以选用更加好更加适合的算法来完成4) O(m*n);O(n²)三、主要仪器设备计算机四、实验步骤(将2、3的源程序粘贴进来)2.#include<stdio.h>#define MAXSIZE 20typedef struct{int a[MAXSIZE];int length;}SeqList;int main(){int i=0,x;int min;printf("请输入原始数据(输入0表示结束):\n");while(1){scanf("%d",&x);if(x==0)break;else L.a[i]=x;i++;}L.length=i;min=L.a[0];for(i=1;i<L.length;i++)if(min>L.a[i])min=L.a[i];printf("这%d个数中最小的数为:%d\n",L.length,min); }3.#include<stdio.h>#define MAXSIZE 20typedef struct{int a[MAXSIZE];int length;}SeqList;int main(){int i=0,j,x;int min;printf("请输入原始数据(输入0表示结束):\n");while(1){scanf("%d",&x);if(x==0)break;else L.a[i]=x;i++;}L.length=i;printf("请输入需要删除的元素:");scanf("%d",&x);for(i=0;i<L.length;i++)if(L.a[i]==x){for(j=i;j<L.length-1;j++)L.a[j]=L.a[j+1];L.length--;i--;}printf("删除元素后的顺序表为:\n");for(i=0;i<L.length;i++)printf("%d",L.a[i]);}五、实验结果(写出1的题目及答案,粘贴2、3的截图。
实验二线性表(顺序存储)一、实验目的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 50typedef 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 50typedef 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要插入到线性表的适当位置上,并保持线性表原有的顺序不变。
线性表的顺序存储结构实验报告总结一、目的1.做实验的目的加深对线性表的理解,学会定义线性表的存储结构,掌握线性表的基本操作。
2.撰写实验报告的目的对本次实验情况进行总结,加强对实验内容的理解,对实验过程有一-个系统的认识,从中获得本次试验的经验,并对实验结果进行适当的分析,加深对栈和队列的理解和认识。
二、内容1.说明实验次数及实验内容本次实验用一次实验课时完成实验内容:节点定义:typedef struct node{int idx: int age: struct node *next:}Node, *List;本次实验的对象的存储内容包括功D和AGE,所以定义了如上的结构体,idx用于存储ID号,age用于存储年龄,next用于形成链式结构,Node定义了该类型的一一个节点,List定义了该类型的--个链表。
(1)、编写函数CreateList ()和PrintList(),从给定数组创建链表,打印链表。
int idx[8] = {1,2,3,4,5,6, 7,8}:int age[8] = {15, 18, 13, 22, 50, 18, 30, 20} :List CreatList(int idx[],int age[], int 1en) {}int PrintList(List L) {}(2)、编写函数DeleteNode(List L, int delete_ age),完成以下操作。
int DeleteNodeAge(List L, intdelete_ age) {}该函数传入List L,可以直接修改链表的节点,建议返回值为int 或void类型,无需为List类型,3,题同上。
2.1删除年龄为18的成员,打印链表。
2.2删除年龄为20的成员,打印链表。
2.3删除年龄为15的成员,打印链表。
2.4 (可选)删除年龄为21的成员(因无此成员,报错) ,打印链表。
.(3)、编写函数Inser tNodeByIdx(List L, Node nd),完成以下操作。
数据结构实验二线性表数据结构实验二线性表1. 实验目的1.1 理解线性表的概念和特性1.2 学习线性表的顺序存储结构和链式存储结构1.3 掌握线性表的基本操作:初始化、插入、删除、查找、修改、遍历等1.4 熟悉线性表的应用场景2. 实验内容2.1 线性表的顺序存储结构实现2.1.1 定义线性表结构体2.1.2 初始化线性表2.1.3 插入元素2.1.4 删除元素2.1.5 查找元素2.1.6 修改元素2.1.7 遍历线性表2.2 线性表的链式存储结构实现2.2.1 定义链表节点结构体2.2.2 初始化链表2.2.3 插入元素2.2.4 删除元素2.2.5 查找元素2.2.6 修改元素2.2.7 遍历链表3. 实验步骤3.1 实现顺序存储结构的线性表3.2 实现链式存储结构的线性表3.3 编写测试程序,验证线性表的各种操作是否正确3.4 进行性能测试,比较两种存储结构的效率差异4. 实验结果与分析4.1 执行测试程序,检查线性表的操作结果是否正确4.2 对比顺序存储结构和链式存储结构的性能差异4.3 分析线性表的应用场景,总结线性表的优缺点5. 实验总结5.1 总结线性表的定义和基本操作5.2 回顾实验中遇到的问题和解决方法5.3 提出对线性表实现的改进方向和思考附件:请参考附件中的源代码和实验报告模板。
法律名词及注释:1. 版权:指对某一作品享有的法律上的权利,包括复制权、发行权、改编权等。
2. 法律责任:指违反法律或合同规定所承担的责任。
3. 保密义务:指个人或组织根据法律、法规、合同等规定需要承担的保密责任。
4.知识产权:指人们在社会实践中所创造的智力劳动成果所享有的权利,包括专利权、著作权、商标权等。
实验一线性表的顺序存储实验一、实验目的1、掌握用Visual C++6.0上机调试顺序表的基本方法2、掌握顺序表的基本操作,插入、删除、查找等算法的实现二、实验内容1、顺序表基本操作的实现[问题描述] 当我们要在顺序表的第i个位置上插入一个元素时,必须先将顺序表中第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
[基本要求] 要求生成顺序表时,可以键盘上读取元素,用顺序存储结构实现存储。
实验代码:#include<stdio.h>#include<stdlib.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10//-----------定义顺序表-----------typedef struct{int *base;int length;int listsize;}Sqlist;//-----------初始化顺序表-------------Sqlist InitList_Sq(){Sqlist L;L.base=(int *)malloc(LIST_INIT_SIZE*sizeof(int));if(!L.base){printf("初始化失败!");exit(0);}L.length=0;L.listsize=LIST_INIT_SIZE;return L;}//--------顺序储存----------void write(Sqlist *L,int elem){if(L->length<L->listsize){L->base[L->length++]=elem;}else{printf("存储已满!");exit(0);}}//--------------插入--------------void Insert_Sq(Sqlist *L,int position,int element){int *p,*q;if(position<1||position>L->length+1){printf("插入位置非法!");exit(0);}if(L->length>=L->listsize){int *newbase=(int*)realloc(L->base,(L->listsize+LISTINCREMENT)*sizeof(int)); if(!newbase) exit(0);L->base=newbase;L->listsize+=LISTINCREMENT;}q=&(L->base[position-1]);for(p=&(L->base[L->length-1]);p>=q;--p){*(p+1)=*p;}*q=element;L->length++;}//-----------删除指定位置元素------------void delete_Sq(Sqlist *L,int position){int i=0;if(position<1||position>L->length){printf("非法操作!");exit(0);}printf("成功删除base[%d]=%d",position,L->base[position]); for(i=position;i<L->length-1;i++){L->base[i]=L->base[i+1];}L->length--;}//------------随机访问-----------int getElem(Sqlist *L,int position){return L->base[position-1];}//----------打印数据-------------void showData(Sqlist *L){int i=0;for(i=0;i<L->length;i++){if(i%5==0)printf("\n");printf("%d ",L->base[i]);}printf("\n");}//-----------主函数-----------void main(){int i=0,a,b;Sqlist list,*l;list=InitList_Sq();l=&list;for(i=0;i<list.listsize/5;i++){write(l,i+1);}a=getElem(l,8);b=getElem(l,13);printf("base[8]=%d,base[13]=%d",a,b);showData(l);printf("length=%d,listsize=%d\n",list.length,list.listsize); Insert_Sq(l,7,3);showData(l);printf("length=%d,listsize=%d\n",list.length,list.listsize); }。
实验二线性表(顺序存储)
一、实验目的
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、实验报告在一周内上交,可三人一组(实验报告作为资料保存,不做打分依据)。