北航计算机软件技术基础实验报告1——线性表的插入与删除资料

合集下载

线性顺序表的插入与删除(实验报告)

线性顺序表的插入与删除(实验报告)

一、实验目的和要求通过对顺序表的编程练习,加强对顺序表的特点、顺序存储结构及其基本运算的理解和掌握。

提前了解实验相关的c语言的知识。

使用C语言根据相应算法编写一个程序,实现建立线性顺序表、插入和删除等基本操作。

要求仔细阅读下面的内容,编写一个C程序,上机调试通过,并观察其结果,写出实验报告书。

二、实验内容和原理内容:建立一个容量10的顺序表,在其中插入3个元素,然后作删除运算。

原理:在第i个元素前插入元素,从第i个元素开始到最后一个元素均向后移动一个位置,然后将新元素插入到第i个位置,将线性表的长度加1。

删除第i个元素,从第i+1个元素开始到最后一个元素均向前移动一个位置,然后将线性表的长度减1。

三、主要仪器设备计算机一台四、实验主程序#include<stdio.h>#include<stdlib.h>struct List{int size;int n;int *head;};void init(struct List *pl,int size){pl->size=size;pl->n=0;pl->head=malloc(size*sizeof(int)); }void in(int i,int val,struct List *pl){int k;if(pl->n==pl->size){printf("list is full.\n");return;}if(i>pl->n)i=pl->n+1;if(i<1)i=1;for(k=pl->n-1;k>=i-1;--k)pl->head[k+1]=pl->head[k];pl->head[i-1]=val;++pl->n;}void out(int i,struct List *pl){int k;if(pl->n==0){printf("list is empty.\n");return;}if(i<1||i>pl->n){printf("this element is not in the list.\n");return;}for(k=i;k<=pl->n;++k)pl->head[k-1]=pl->head[k];--pl->n;return;}void print(const struct List *pl) {int i;for(i=0;i!=pl->n;++i)printf("%d ",pl->head[i]);printf("\n");}int main(void){int i;struct List list;init(&list,10);for(i=0;i!=5;++i)in(i+1,i,&list);print(&list);in(1,5,&list);print(&list);in(10,4,&list);print(&list);in(5,50,&list);print(&list);out(1,&list);print(&list);out(list.n,&list);print(&list);out(3,&list);print(&list);getchar();return 0;}实验结果五、实验心得通过实验学习,我理解了线性顺序表的插入与删除的算法,了解到线性顺序表的插入与删除得效率低下,感到受益匪浅。

实验一 线性表的插入和删除

实验一 线性表的插入和删除

实验一线性表的插入和删除一、实验目的1、掌握用Turbo C上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。

二、实验内容线性表基本操作的实现当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。

若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。

程序实现:typedef Null 0;typedef int datatype;#define maxsize 1024;typedef struct{ datatype data[maxsize];int last;}sequenlist;int insert(L, x, i)sequenlist *L;int i;{ int j;if ((*L).last= =maxsize-1){ printf(“overflow”);return Null;}elseif ((i<1)‖(i>(*L).last+1){ printf(“error”);return Null;}else{ for(j=(*L).last; j>=i-1; j--) (*L).data[j+1]=(*L).data[j]; (*L).data[i-1]=x;(*L).last=(*L).last+1;}return(1);}int delete(L,i)sequenlist *L;int i;{ int j;if ((i<1)‖(i>(*L).last+1)){printf (“error”);return Null;}else{ for(j=i, j<=(*L).last; j++)(*L).data[j-1]=(*L).data[j];(*L).data - -;}return(1);}void creatlist( ){ sequenlist *L;int n, i, j;printf(“请输入n个数据\n”); scanf(“%d”,&n);for(i=0; i<n; i++){ printf(“data[%d]=”, i);scanf (“%d”, (*L).data[i]);}(*L).last=n-1;print f(“\n”);}printout (L)sequenlist *L;{ int i;for(i=0; i<(*L).last; i++){ printf(“data[%d]=”, i);printf(“%d”, (*L).data[i]);}}main( ){ sequenlist *L;char cmd;int i, t;clscr( );printf(“i, I…..插入\n”);printf(“d,D…..删除\n”);printf(“q,Q……退出\n”);do{ do{cmd =getchar( );}while((cmd!=‘d’)‖(cmd!=‘D’)‖(cmd!=‘q’)‖(cmd!=‘Q’)‖(cmd!=‘i’)‖(cmd!=‘I’));switch (cmd){ case ‘i’,‘I’; scanf(&x);scanf(&i);insert(L, x, i);printout(L);break;case ‘d’,‘D’; scanf(&i);delete(L, i);printout(L);break;}}while ((cmd!=‘q’)&&( cmd!=‘Q’));}。

11021199实验一 线性表的插入与删除实验报告

11021199实验一 线性表的插入与删除实验报告

// 使用数组建立线性表类 class LinerList {
private: int d[1001]; int n,nl,m;
public: void initList(int mn) {
n = mn; nl = 1; }
// 初始化线性表
void insert(int a)
//向线性表中插入整数 a
要在原线性表中删除一个元素 b(在本实验中,保证 b 在线性表中),且仍保持线性表 的顺序存储结构,可以从线性表的第一个元素开始,往后逐个与新元素相比较,直到发现一 个元素与新元素相等。然后从当前位置的下一个元素开始,将后面所有元素都往前移动一个 位置,直到线性表的最后一个位置为止。显然,删除一个元素之后,线性表的长度减小了 1。 其算法如下。
(1) 定义一个有序(非递减)线性表,其最大容量为 1000,初始时为空。 (2) 从由 1 产生的数据文件中依次取前 N 个随机整数,陆续插入到此线性表中,
并要求在每次插入后保持线性表的有序性。最后将此有序线性表打印输出。 (3) 在由(2)产生的线性表中,依在 1 中产生的次序逐个将元素删除,直至表空 为止。 3. 以 N=100 及 N=400 分别运行 2 的程序,并比较它们的运行时间。 4. 编写一个程序,用插入排序依次将 1 中产生的 1000 个随机整数链接成有序链表(不 改变原随机数在存储空间中的顺序)。
fout<<data[i]<<endl;
//向文件输出
//cout<<data[i]<<endl;
//向标准输出输出
}
//step 3 以 1000 个随机数为数据源向线性表中插入 100 个数据 LinerList l1,l2; startt = clock(); //初始计时 l1.initList(110); for(i=1;i<=100;i++)

线性表的插入和删除(数据结构)

线性表的插入和删除(数据结构)

电子信息工程学系实验报告——适用于计算机课程课程名称:Array实验项目名称:线性表的插入和删除实验时间: 2012、3、班级:计应102 姓名:学号:实验目的:熟悉掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,并熟悉其各自的优缺点及适用性。

实验环境:C—Free5.0实验内容及过程:题目1:编写程序实现下列的要求:(1) 设数据元素为整数,实现这样的线性表的顺序存储表示。

(2) 键盘输入10个数据元素,利用顺序表的基本操作,建立该表。

(3) 利用顺序表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。

(4) * 若数据元素为学生成绩(含姓名、成绩等字段),重新编程,实现上面的要求。

要求尽可能少地修改前面的程序来得到新程序。

(这里用于比较的字段为分数)题目2:编写程序实现下列的要求:(1) 设学生成绩表中的数据元素为学生成绩(含姓名、成绩字段),实现这样的线性表的链式存储表示。

(2) 键盘输入若干个数据元素(用特殊数据来标记输入数据的结束),利用链表的基本操作(前插或后插算法),建立学生成绩单链表。

(3) 键盘输入关键字值x,打印出表中所有关键字值<=x的结点数据。

(用于比较的关键字字段为分数)。

(4) 输入关键字值x,删除表中所有关键字值<=x的结点。

(用于比较的关键字字段为分数)。

实验结果及分析:题目一:(4):题目二:实验心得:通过这次的实验,对线性表和单链表的创建和修改有了初步的认识,和同学的讨论互相弥补了不足,相信在未来的学习中会有更大的收获。

附录:题目一代码:#include "stdio.h"#include "conio.h"typedef int datatype;struct seqlist{int maxnum;int n;datatype *element;};typedef struct seqlist *Pseqlist;Pseqlist creatnulllist_seq(int m) /* 建立空的顺序表*/{Pseqlist p=(Pseqlist)malloc(sizeof(struct seqlist));if(p!=NULL){p->element=(datatype *)malloc(sizeof(datatype)*m);if(p->element!=NULL){p->maxnum=m;p->n=0;}else free(p);}printf("out of space");return NULL;}Pseqlist init_seq(Pseqlist p,int n) /* 初始化空的顺序表,即填充数据,顺序表的实际元素个数n 由参数提供*/{int i;printf("input the element of seqlist:");for(i=0;i<n;i++)scanf("%d",&p->element[i]);p->n=n;return(p);}int insertpost_seq(Pseqlist p,int i,datatype x) /* 在i之后插入一个元素x */{int j;if(p->n>=p->maxnum){printf("overflow");return(0);}if(i<0 || i>p->n ){printf("not exist");return(0);}for(j=p->n-1; j>=i+1; j--)p->element[j+1]=p->element[j];p->element[i+1]=x;p->n++;return(1);}void print(Pseqlist p) /* 打印顺序表中的元素*/{int i;for(i=0;i<p->n;i++)int FinMax(Pseqlist p){int max=p->element[0];int i;for(i=1;i<p->n;++i){if(max<p->element[i])max=p->element[i];}return max;}int FinMin(Pseqlist p){int min=p->element[0];int i;for(i=1;i<p->n;++i){if(min>p->element[i])min=p->element[i];}return min;}main(){Pseqlist p;int m,n,i,x,k;printf("input the size of seqlist m:"); /* 输入顺序表的最大空间m,建立空的顺序表*/ scanf("%d",&m);p=creatnulllist_seq(m);printf("input the real number of seqlist n(n<m):"); /* 输入顺序表的实际长度n,初始化顺序表*/ scanf("%d",&n);p=init_seq(p,n);/* 输出插入之前顺序表的元素*/ print(p);printf("\n");printf("input i,x:");scanf("%d%d",&i,&x); /* k的值用来表示是否插入成功*/k=insertpost_seq(p,i,x);if(k==1) print(p); /* 如果插入成功,输出插入之后顺序表的元素*/ printf("\nmax:%d,min:%d\n",FinMax(p),FinMin(p));}题目一的(4)的代码:#include "stdio.h"#include "conio.h"//typedef int datatype;typedef struct student{int score;char name[30];}datatype;struct seqlist{int maxnum;int n;datatype *element;};typedef struct seqlist *Pseqlist;Pseqlist creatnulllist_seq(int m) /* 建立空的顺序表*/{Pseqlist p=(Pseqlist)malloc(sizeof(struct seqlist));if(p!=NULL){p->element=(datatype *)malloc(sizeof(datatype)*m);if(p->element!=NULL){p->maxnum=m;p->n=0;return(p);}else free(p);}printf("out of space");return NULL;}Pseqlist init_seq(Pseqlist p,int n) /* 初始化空的顺序表,即填充数据,顺序表的实际元素个数n 由参数提供*/{int i;printf("输入10个分数:输入10个名字:");for(i=0;i<n;i++)scanf("%d%s",&p->element[i].score,p->element[i].name);return(p);}int insertpost_seq(Pseqlist p,int i,datatype x) /* 在i之后插入一个元素x */ {int j;if(p->n>=p->maxnum){printf("overflow");return(0);}if(i<0 || i>p->n ){printf("not exist");return(0);}i-=2;for(j=p->n-1; j>=i+1; j--)p->element[j+1]=p->element[j];p->element[i+1]=x;p->n++;return(1);}int FinMax(Pseqlist p){int max=p->element[0].score;int i;for(i=1;i<p->n;++i){if(max<p->element[i].score)max=p->element[i].score;}return max;}int FinMin(Pseqlist p){int min=p->element[0].score;int i;for(i=1;i<p->n;++i){if(min>p->element[i].score)min=p->element[i].score;}return min;void print(Pseqlist p) /* 打印顺序表中的元素*/{int i;for(i=0;i<p->n;i++)printf("姓名:%s 分数:%d",p->element[i].name,p->element[i].score);}main(){Pseqlist p;int m,n,i,x,k;datatype aa;printf("input the size of seqlist m:"); /* 输入顺序表的最大空间m,建立空的顺序表*/scanf("%d",&m);p=creatnulllist_seq(m);printf("input the real number of seqlist n(n<m):"); /* 输入顺序表的实际长度n,初始化顺序表*/ scanf("%d",&n);p=init_seq(p,n);/* 输出插入之前顺序表的元素*/ print(p);printf("\n");printf("input i,x.score,:");scanf("%d%d%s",&i,&aa.score,); /* k的值用来表示是否插入成功*/ k=insertpost_seq(p,i,aa);if(k==1) print(p);/* 如果插入成功,输出插入之后顺序表的元素*/printf("\n%d %d",FinMax(p),FinMin(p));printf("分别是最大的和最小的数据");getch();}题目二代码:/* 线性表的单链表表示:类型和界面函数定义*/#include <stdio.h>/* 定义链接表元素类型。

线性表数据结构实验报告

线性表数据结构实验报告

数据结构实验报告实验名称:实验1-线性表学生姓名:班级:班内序号:15学号:日期:2014年11月14日1.实验要求并完成线性表的基本功能。

线性表存储结构(五选一):1、带头结点的单链表2、不带头结点的单链表3、循环链表4、双链表5、静态链表线性表的基本功能:1、构造:使用头插法、尾插法两种方法2、插入:要求建立的链表按照关键字从小到大有序3、删除4、查找5、获取链表长度6、销毁7、其他:可自行定义编写测试main()函数测试线性表的正确性。

2. 程序分析及关键算法分析1头插法:1在堆中建立新节点//Node<T>*s=new Node<T>2将a[i]写到新节点的数据域//s->data=a[i]3修改新节点的指针域//s->next=front->next4修改头结点的指针域,并将新的节点加入链表fornt->next=stemplate<class T>void Linklist<T>::Insert(int i, T x) //插入操作{Node<T>*p = front;if (i != 1)p = Get(i-1);if (p){Node<T>*s = new Node<T>;s->data = x;s->next = p->next;p->next = s;}else throw"插入位置错误";}时间复杂度O(n)2尾插法1在推中新建一个节点Node <T>*new Node<T>2将a[i]写到新节点的数据域s->data=a[i3将新节点加入链表r->next=s4修改尾指针r=stemplate<class T>void Linklist<T>::rLinklist(T a[], int n) //尾插法{front = new Node<T>;Node<T>*r = front;for (int i = 0; i<n; i++){Node<T>*s = new Node<T>;s->data = a[i];r->next = s;r = s;}r->next = NULL;}时间复杂度O(n)3删除函数从第一个结点开始,查找第i-1个元素,设为p指向该结点;设q指向第i个元素:q=p->next;摘链:p->next=q->next;保存q元素的数据:x=q->data;释放q元素:delete q;template<class T> //删除操作T Linklist<T>::Delete(int i){Node<T>*p = front;if (i != 1)p = Get(i - 1);Node<T>*q = p->next;p->next=q->next;T x = q->data;delete q;return x;}时间复杂度O(n)4插入分析从第一个结点开始,查找p所指结点的前一个结点,设q指向该结点;在堆中建立新结点:Node<T>*s=new Node<T>;将x写入到新结点的数据域:s->data=x;修改新结点的指针域s->next=p;:修改q结点的指针域,将新结点加入到链表中:q->next=s;template<class T>void Linklist<T>::Insert(int i, T x) //插入操作{Node<T>*p = front;if (i != 1)p = Get(i-1);if (p){Node<T>*s = new Node<T>;s->data = x;s->next = p->next;p->next = s;}else throw"插入位置错误";}时间复杂度O(n)5按值查找算法分析初始化工作指针p和计位器j:p=front->next,j=1;当p不为空时做以下循环:while(p);P指向下一结点:p=p->next;J加1:j++;返回j:return j;template <class T>int Linklist<T>::Locate(T x) //按值查找{Node<T>*p = front->next;int j = 1;while (p){if (p->data == x)return j;p = p->next;j++;}return -1;}时间复杂度O(n)6按位查找算法分析初始化工作指针p和计数器j:p=front->next,j=0;循环一下操作直到p为空或j等于i:while(p==NULL||j==i);P指向下一结点:p=p->next;J加1:j++;返回p:return p;template<class T> //按位查找Node<T>*Linklist<T>::Get(int i){Node<T>*p = front->next;int j = 1;while (p&&j != i){p = p->next;j++;}return p;}时间复杂度O(n)2.1 存储结构单链表:结构示意图3. 程序运行结果条件:数组已知。

软件技术基础实验报告——线性表的操作

软件技术基础实验报告——线性表的操作

《软件开发技术基础》实验报告姓名:XXXXX学号:XXXXXXXx班级:XXXXXXX指导教师:实验名称:实验一线性表的操作班级学号姓名第周星期、节成绩实验目的:参照给定的线性表顺序表类和链表类的程序样例,验证给出的线性表的常见算法实验内容:参照给定的线性表顺序表类和链表类的程序样例,验证给出的线性表的常见算法实验要求:(1)将程序输入计算机,编译运行。

(2)程序的实际功能与上述所列功能不完全相符,调试程序,找出问题所在,并纠正。

实验原理具体写出线性表的生成、插入、删除和查找运算的算法描述(形式语言或程序流程图表示出来)。

实验步骤:写出调试、查找程序中问题的思路和步骤。

实验结果:写出修改前后的运行结果。

附:源程序和输入对应数据以及对应输出结果。

#include "string.h"#include "stdio.h"#define MAXNUM 200#define TRUE 1#define FALSE 0typedef struct{char name[20];char telno[20];}TelRecord;typedef struct{TelRecord records[MAXNUM];int len;}SqTelPad;void AddRecord(SqTelPad * sqlist); void DeleteRecord(SqTelPad * sqlist); void DispRecord(SqTelPad * sqlist); void InitSqTelPad(SqTelPad * sqlist); void main(){char selectitem[5];int refreshflag;SqTelPad mytelpad;refreshflag = FALSE;InitSqTelPad(&mytelpad);do{printf("********************************\n");printf("* *\n");printf("*telephone notepad *\n");printf("* *\n");printf("********************************\n");printf("1、add record \n");printf("2、delete record \n");printf("3、display record \n");printf("4、exit \n");scanf("%s",selectitem);while(selectitem[0]){switch(selectitem[0]){case '1':AddRecord(&mytelpad);refreshflag = TRUE;break;case '2':Deleterecord(&mytelpad);refreshflag = TRUE;break;case '3':DispRecord(&mytelpad);refreshflag = TRUE;break;case '4':return;}if(refreshflag==TRUE){refreshflag=FALSE;break;}else{scanf("%s",selectitem); }}while(1);}void AddRecord(SqTelPad * sqlist){int n;sqlist->len++;n=sqlist->len;printf("请输入新记录:Name and TelNo\n");scanf("%s%s",sqlist->records[n].name,sqlist->records [n].telno ); }void DeleteRecord(SqTelPad * sqlist){int i,j;char name[20];printf("请输入要删除记录的姓名\n");scanf("%s",name);i=j=0;for(i=0;i<=sqlist->len;i++)if(strcmp(sqlist->records[i].name,name)==0)break;if(i>sqlist->len)printf("no record\n");return;}for(j=i;j<sqlist->len;j++)sqlist->records[j]=sqlist->records[j+1];sqlist->len--;}void DispRecord(SqTelPad * sqlist){int i;for(i=0;i<=sqlist->len;i++)printf("%s,%s\n",sqlist->records[i].name,sqlist->records[i].telno); }void InitSqTelPad(SqTelPad * sqlist){sqlist->len=-1;}}。

数据结构--实验报告 线性表的基本操作

数据结构--实验报告 线性表的基本操作

数据结构--实验报告线性表的基本操作数据结构实验报告[引言]在本次实验中,我们将学习线性表的基本操作,包括插入、删除、查找等。

通过实践操作,加深对线性表的理解和掌握。

[实验目的]1.学习线性表的基本概念和操作。

2.熟悉线性表的插入、删除和查找等基本操作。

3.掌握线性表的实现方式及其相应的算法。

[实验内容]1.线性表的定义与表示1.1 线性表的定义1.2 线性表的顺序存储结构1.3 线性表的链式存储结构2.线性表的基本操作2.1初始化线性表2.2判断线性表是否为空2.3 插入操作2.3.1 在指定位置插入元素2.3.2 在表尾插入元素2.4 删除操作2.4.1 删除指定位置的元素2.4.2 删除指定值的元素2.5 查找操作2.5.1 按位置查找元素2.5.2 按值查找元素2.6 修改操作2.6.1修改指定位置的元素 2.6.2 修改指定值的元素2.7 清空线性表2.8 销毁线性表[实验步骤]1.初始化线性表1.1 创建一个空的线性表对象1.2 初始化线性表的容量和长度2.插入操作2.1在指定位置插入元素2.1.1 检查插入位置的合法性2.1.2 将插入位置后的元素依次后移2.1.3在指定位置插入新元素2.2 在表尾插入元素2.2.1 将表尾指针后移2.2.2 在表尾插入新元素3.删除操作3.1 删除指定位置的元素3.1.1 检查删除位置的合法性3.1.2 将删除位置后的元素依次前移3.1.3 修改线性表的长度3.2 删除指定值的元素3.2.1 查找指定值的元素位置3.2.2调用删除指定位置的元素操作4.查找操作4.1 按位置查找元素4.1.1 检查查找位置的合法性4.1.2 返回指定位置的元素4.2 按值查找元素4.2.1 从头到尾依次查找元素4.2.2 返回第一个匹配到的元素5.修改操作5.1修改指定位置的元素5.1.1 检查修改位置的合法性5.1.2修改指定位置的元素值5.2修改指定值的元素5.2.1 查找指定值的元素位置5.2.2调用修改指定位置的元素操作6.清空线性表6.1 设置线性表长度为07.销毁线性表7.1 释放线性表的内存空间[实验结果]使用线性表进行各种基本操作的测试,并记录操作的结果和运行时间。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实验报告实验名称线性表的插入与删除班级学号姓名成绩【实验过程】(实验步骤、记录、数据、分析)实验一:源代码:/*实验1:产生1000个0至999间的随机整数,并以产生的次序存入一个数据文件中。

*/#include<stdio.h>#include<stdlib.h>#include<math.h>int main(){long m = 65536, y = 0;int x, i;//定义一个文件类型的指针FILE *fp;//用fopen函数新建一个文件,失败则返回0if ((fp = fopen("D:\\data.txt", "w")) == NULL){fprintf(stderr, "Error opening file.");exit(0);}printf("The data has been output to D:\\data.txt!\n");printf("All data is as follows!\n\n");//递归创造1000个0~999之间的随机数for (i = 0; i<1000; i++){y = (2053 * y + 13849) % m;x = (int)(1000 * y / m);fprintf(fp, "%d\n", x);printf("%d:%d\t", i + 1, x);}//关闭文件fclose(fp);exit(1);}运行结果:实验二、实验三:源代码:/*实验2:编制一个程序,依次实现以下功能:1.定义一个有序非递减线性表,其最大容量为1000,初始时为空。

2.从由1产生的数据文件中依次取前N个随机整数陆续插入到此线性表中,并要求在每次插入后保持线性表的有序性。

最后将此有序线性表打印输出。

3.在由2产生的线性表中,依在1中产生的次序逐个将元素删除直至表空为止。

实验3:以N=100及N=400分别运行2的程序,并比较它们的运行时间。

*/#include<stdio.h>#include<stdlib.h>#include<time.h>#define N 1000void main(){//新建时钟变量,得到程序从开始运行到某时刻经过的时钟周期数clock_t start, finish;FILE *fp;int a[1000];int i, j, n, temp;double duration;//Part 1:创建一个有序线性表start = clock();if ((fp = fopen("D:\\data.txt", "r")) == NULL){fprintf(stderr, "Error opening file.");exit(0);}//判断插入顺序是否合理else if (n = N>1000){printf("Data overflow!Please try again!");exit(0);}//比较插入元素与有序表中元素位置并插入else for (n = 0; n<N; n++){fscanf(fp, "%d", &temp);if (n == 0)a[0] = temp;//将比a[i]大的数向后移动一格,将a[i]放入线性表else{for (i = n; (i>0) && (a[i - 1]>temp); i--)a[i] = a[i - 1];a[i] = temp;}}for (i = 0; i<n; i++)printf("%d\t", a[i]);fclose(fp);finish = clock();//计算程序运行时间duration = (double)(finish - start) / CLOCKS_PER_SEC;printf("\n\n");printf("A sorted linear list has been created!\n");printf("The length of it is %d.\n", n);printf("Time taken:%fs\n\n", duration);//Part 2:按创建顺序删除线性表start = clock();if ((fp = fopen("D:\\data.txt", "r")) == NULL){fprintf(stderr, "Error opening file.");exit(0);}//判断删除位置是否合理if (n == 0){printf("Data underflow!Please try again!");exit(0);}//在线性表中利用顺序查找法找到元素位置else for (; n>0; n--){fscanf(fp, "%d", &temp);for (i = 0; i<n&&a[i] != temp; i++);if (i >= n)printf("This element CANNOT be found!");//若要删除元素不是位于顺序表最后一位,则将后面的元素前移一位;若位于最后一位,直接令n--即可,不必再移动else if (i<n - 1)for (j = i; j<n; j++)a[j] = a[j + 1];else;}//打印清空后的顺序表实验二:(此图将原程序中for (; n>0; n--)改成了for (; n>20; n--),即删除至剩20个数据的线性表,目的为验证删除一些元素后线性表仍保持有序)实验三:1.N=100t1=0.005000s t2=0.001000s 2.N=400t1=0.049000s t2=0.001000s 实验四:源代码:实验4:编写一个程序,用插入排序依次将1中产生的1000个随机整数链接成有序链表,不改变原随机数在存储空间中的顺序。

*/#include<stdio.h>#include<stdlib.h>#define N 1000int main(){FILE *fp;int a[N][2];int H, i, k, x;if ((fp = fopen("D:\\data.txt", "r")) == NULL){fprintf(stderr, "Error opening file.");exit(0);}//定义头节点位置H = 0;fscanf(fp, "%d", &x);a[0][0] = x;//定义链表结束标志a[0][1] = -1;//逐一插入元素并与原链表内元素比较以确定位置for (k = 1; k<N; k++){fscanf(fp, "%d", &x);a[k][0] = x;//在链表头结点插入元素if (a[k][0]<a[H][0]){a[k][1] = H;H = k;}//在链表某一位置插入一个元素else{i = H;while ((a[i][1] != -1) && (a[a[i][1]][0]<x))i = a[i][1];a[k][1] = a[i][1];a[i][1] = k;}printf("A linked list containing %d numbers has beencreated!\n", N);printf("Its head pointer is %d,its value is %d.\n", H, a[H][0]);printf("The data is as follows.\n\n");i = H;//按大小顺序打印链表do{printf("%d\t", a[i][0]);i = a[i][1];} while (a[i][1] != -1);exit(1);}运行结果:【结论】(结果)1.实验1中利用函数递归的方法得到随机数的方法是可行的,要得到(0,a)之间的随机数只需加x i=INT(a*y i/m)语句即可。

2.实验2中利用插入排序法可以成功将一组无序数据按从小到大顺序排好并放入线性表中,利用顺序查找法可以成功找到、删除任意元素。

第四个结果图说明删除一些元素后线性表顺序保持不变3. 实验3中N=100时插入时间t1=0.005000s,清空时间t2=0.001000s;N=400时插入时间t1=0.049000s,清空时间t2=0.001000s。

当表中已经有n个数时,再插入一个数时,若比较i次,则需要移动i次(1<= i <=n)。

假设他们的概率相等,则平均需要比较 (n+1) / 2次,移动 (n+1) / 2次。

即顺序表中已经有n个数的时候,再进行插入排序运算的算法复杂度为O(n)。

那么假设题目要求一共读取N个数,则程序平均要执行(N+1)*N/2,即算法的时间复杂度为O(n^2)。

同理,删除这N个数的算法的时间复杂度也为O(n^2)。

在此程序中N=400时插入时间约为N=100时的10倍,基本符合,误差是由于运行时电脑环境及计时误差引起的4.实验4中用二维数组模拟静态链表成功实现了数据的插入及排序功能【小结】在完成这份实验报告后,感慨良多。

相关文档
最新文档