实验二、有序表的建立、插入与删除

合集下载

线性表的插入和删除运算

线性表的插入和删除运算

姓名:林涛班级:10信息学号:201010520134 实训题一线性表的插入和删除运算一、实验目的:1、掌握线性表顺序存储结构2、能熟练地利用顺序存储结构实现线性表的基本操作3、能熟练地掌握顺序存储结构中算法的实现二、实验内容:1、建立含有若干个元素的顺序表,并将结果在屏幕上输出2、对建立的顺序表实现插入和删除,并将结果在屏幕上输出3、对建立的链式线性表实现插入和删除,并将结果在屏幕上输出三、算法程序:1、顺序存储1)插入运算#include<iostream.h>#define elemtype intconst int maxsize=1000;class sequenlist{protected:elemtype a[maxsize];int len;public:void input(int n ){for(int i=1;i<=len;i++)cin>>a[i];len=n;cout<<endl;}void insert(elemtype x,int i){int j;if(len>=maxsize-1)cout<<"overflow"<<endl;else if((i<1)||(i>len+1))cout<<"position is not correct!"<<endl;else{for(j=len;j>=i;j--)a[j+1]=a[j];a[i]=x;len++;}}void print(){for(int i=1;i<=len;i++)cout<<a[i]<<"\n";cout<<endl;}};void main(){sequenlist L;elemtype x;int i,j,n;cout<<"请输入表中的元素个数:";cin>>n;cout<<"请输入"<<n<<"个元素,建立顺序表"<<endl;L.input(n);cout<<"请输入要插入的元素及位置:";cin>>x>>j;L.insert(x,j);L.print();}运行结果:2)删除运算#include<iostream.h>#define elemtype intconst int maxsize=1000;class sequenlist{protected:elemtype a[maxsize];int len;public:void input(int n){for(int i=1;i<=n;i++)cin>>a[i];len=n;cout<<endl;}void del (int i){int j;if((i<1)||(i>len))cout<<"position is not correct!"<<endl;else{for(j=i+1;j<=len;j++)a[j-1]=a[j];len--;}}void print(){for(int i=1;i<=len;i++)cout<<a[i]<<"\n";cout<<endl;}};void main(){sequenlist L;elemtype x,n;int i,j;cout<<"请输入表中的元素个数:";cin>>n;cout<<"请输入"<<n<<"个元素,建立顺序表"<<endl;L.input(n);cout<<"请输入要删除的元素位置:";cin>>j;L.del(j);L.print();}运行结果:2、链式存储1)头插法删除运算#include<iostream.h>#define elemtype intclass link{public:elemtype data;link *next;};class linklist{protected:link *head;public:link *hcreat(){ link *s,*p;elemtype i;cout<<"输入多个结点数值,为0时算法结束";cin>>i;p=new link;p->next=NULL;while(i){ s=new link;s->data=i;s->next=p->next;p->next=s;}return p;}void print(link *head){link *p;p=head->next;while(p->next!=NULL){cout<<p->data<<"->";p=p->next;}cout<<p->data;cout<<endl;}void del (link *head,elemtype x){link *p,*q;q=head;p=head->next;while((p!=NULL)&&(p->data!=x)){q=p;p=p->next;}if(p==NULL) cout<<"要删除的结点不存在!";else{q->next=p->next;delete(p);}}};void main(){elemtype x,y;link *p,*q;linklist a;p=a.hcreat();a.print(p);cout<<"请输入要删除的元素:";a.del (p,y);a.print(p);}运算结果:2)尾插法插入运算#include<iostream.h>#define elemtype intclass link{public:elemtype data;link *next;};class linklist{protected:link *head;public:link *hcreat(){ link *s,*p,*r;elemtype i;cout<<"输入多个结点数值,为0时算法结束";cin>>i;p=r=new link;p->next=NULL;while(i){s=new link;s->data=i;r->next=s;r=s;cin>>i;}r->next=NULL;}void print(link *head){link *p;p=head->next;while(p->next!=NULL){cout<<p->data<<"->";p=p->next;}cout<<p->data;cout<<endl;}link *Locate(link *head,elemtype x){link *p;p=head->next;while((p!=NULL)&&(p->data!=x))p=p->next;return p;}void insert(link *head,elemtype x,elemtype y) {link *p,*s;s=new link;s->data=y;if(head->next==NULL){head->next=s;s->next=NULL;}p=Locate(head,x);if(p==NULL)cout<<"插入位置非法!";else{s->next=p->next;p->next=s;}}};void main(){elemtype x,y;link *p,*q;linklist a;p=a.hcreat();a.print(p);cout<<"请输入插入位置的元素值:";cin>>x;cout<<"请输入待插入元素值:";cin>>y;a.insert(p,x,y);a.print(p);}运算结果:四、实验小结:在做实验的过程中,遇到了很多的困难,书上给出的程序在上机调试时总是会遇到很多错误。

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

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

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

提前了解实验相关的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;}实验结果五、实验心得通过实验学习,我理解了线性顺序表的插入与删除的算法,了解到线性顺序表的插入与删除得效率低下,感到受益匪浅。

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

线性表的插入与删除实验报告
3.在由(2)产生的线性表中,依在1中产生的次序逐个将元素删除,直至表空为止。
c)以N=100及N=400分别运行2的程序,并比较它们的运行时间。
d)编写一个程序,用插入排序依次将1中产生的1000个随机整数链接成有序链表(不改变原随机数在存储空间中的顺序)。
【实验过程】(实验步骤、记录、数据、分析)
台式机、windowsXP系统、用Turbo软件编程并运行系统。
实验内容:
【实验方案设计】
a)产生1000个0至999间的随机整数,并以产生的次序存入一个数据文件中。
b)编制一个程序,依次实现以下功能:
1.定义一个有序(非递减)线性表,其最大容量为1000,初始时为空。
2.从由1产生的数据文件中依次取前N个随机整数,陆续插入到此线性表中,并要求在每次插入后保持线性表的有序性。最后将此有序线性表打印输出。
3、运行第三个程序,屏幕上会输出100个数,有小到大排列,同时D盘会出现一个data3.txt文件。
【小结】
通过此次实验,对C语言进行了简单的复习与回顾,同时也对Turbo C有了更深的了解。更重要的是,这次实验中掌握了随机整数的产生、线性表的插入与删除、线性链表的插入排序这三方面的知识,了解了这三个程序的算法及具体程序内容。
实验报告
实验名称线性表的插入与删除
班级
学号
姓名
成绩
实验概述:
【实验目的及要求】
掌握线性表在顺序分配下的插入与删除运算;掌握线性表的链式存储结构;掌握插入排序的方法;并掌握一种产生随机数的方法。
【实验原理】
本实验主要是练习用C语言编程中的随机数产生、线性链表的插入与删除和线性表的插入顺序等。
【实验环境】(使用的软硬件)
fp=fopen("d:\\data.txt","r");

实验二 顺序表的基本操作

实验二 顺序表的基本操作

实验二顺序表的基本操作一、实验目的1、掌握顺序表的建立、数据元素的插入和删除、掌握数据元素的访问。

2、能够熟练的使用函数来实现顺序表的各种操作。

二、实验环境1、硬件:每个学生需配备计算机一台。

2、软件:Windows操作系统+Turbo C。

三、实验要求1、定义一顺序表的类型,并定义顺序表。

2、将教材中顺序表的建立、初始化、插入、删除等函数实现。

3、顺序表能够存储10名学生的基本信息(包括姓名、学号和成绩)。

4、由主函数按照用户要求对各个顺序表操作访问。

5、每次操作之前要有明确的说明,操作后要输出操作结果。

6、分析顺序表的插入、删除、查找的时间和空间复杂度。

四、实验内容1、在自己的U盘的“姓名+学号”文件夹中创建“实验2”文件夹,本次实验的所有程序和数据都要求存储到本文件夹中。

2、完成顺序表操作的如下函数:顺序表的建立、查找、插入与删除//顺序表的建立、查找、插入与删除,表元素为学生信息#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#define ListSize 100#define NameSize 18typedef struct{ long num;char Name[NameSize];}DataType;//结构定义typedef struct SeqList{ DataType sy[ListSize];int length;} SeqList;//插入元素void insertList(SeqList *list, long number, char * name ){ int i=list->length-1;if(i>=ListSize-1){ printf("表已满,不能增加新的项!\n");exit(0);}else{ while(i>=0 && list->sy[i].num>number){ strcpy(list->sy[i+1].Name,list->sy[i].Name);list->sy[i+1].num=list->sy[i].num;i--;}strcpy(list->sy[i+1].Name,name);list->sy[i+1].num=number;list->length++;}}//创建初始顺序表SeqList *createList(int size){ int i;long number;char name[NameSize];SeqList *list;list=(SeqList *)malloc(sizeof(SeqList));printf("请输入学生信息,按(学号姓名)顺序输入:\n");scanf("%ld",&number);list->sy[0].num=number;list->length=1;scanf("%s",list->sy[0].Name);i=1;while(i<size){ scanf("%ld",&number);scanf("%s",name);insertList(list,number,name);i++;}return list;}//打印顺序表中的现有元素void printList(SeqList *list){ int i=0;printf("目前顺序表中有%d个元素\n",list->length);while(i<list->length){ printf("学号:%15ld,",list->sy[i].num);printf("姓名:%s,",list->sy[i].Name);printf("\n");i++;}printf("\n");}//查找void searchList(SeqList *list, int e){ int i;i=list->length-1;while(list->sy[i].num!=e&&i>=0)i--;if(i>=0){ printf("要查找的学生信息为:");printf("学号:%15ld,",list->sy[i].num);printf("姓名:%s,",list->sy[i].Name);printf("\n");}elseprintf("找不到学号为%d的学生,该学生不在顺序表中,请核实后再查",e);}//删除元素void deleteList(SeqList *list, int e){ int i;i=list->length-1; //初始状态在表末尾while(list->sy[i].num!=e&&i>=0)i--;if(i>=0){ while(i<list->length-1){ strcpy(list->sy[i].Name,list->sy[i+1].Name);list->sy[i].num=list->sy[i+1].num;i++;}list->length--;}elseprintf("找不到学号为%d的学生,该学生不在顺序表中,请核实后再进行操作",e); }void main(){ long number;char name[NameSize];int no,e;int operate;SeqList *list;printf("请输入初始顺序表的元素个数:(小于%d)\n",ListSize);scanf("%d",&no);list=createList(no);printList(list);for(;;){ printf("请选择操作:查询(1),插入(2),删除(3),退出(0)\n");scanf("%d",&operate);switch(operate){ case 1:printf("查询元素,请输入需要查询的学号:\n");scanf("%d",&e);searchList(list,e);break;case 2:printf("插入元素,请输入要插入学生,按(学号姓名)顺序输入:\n");scanf("%ld",&number);scanf("%s",name);insertList(list,number,name);printList(list);break;case 3:printf("删除元素,请输入要删除的学生的学号:\n");scanf("%d",&e);deleteList(list,e);printList(list);break;case 0:exit(0);}}}。

顺序表的建立、输出、插入、删除

顺序表的建立、输出、插入、删除

顺序表的建⽴、输出、插⼊、删除1.顺序表的建⽴,⼀定要记得要分配内存,然后就把输⼊的数插⼊进去就可以了。

//建⽴顺序表Status InitList_Sq(SqList &L,int n){L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配内存if(!L.elem)exit(OVERFLOW);//判断是否溢出printf("请输⼊顺序表中元素:");for(int i=0;i<n;i++){scanf("%d",&L.elem[i]);}L.length=n;L.listsize=LIST_INIT_SIZE;return OK;}2.插⼊元素的时候,要判断位置是否有效,还要注意内存分配的问题,要判断,如果内存不够他插⼊新的元素就要重新分配内存,然后插⼊要从最后⼀个往下移,倒数第⼆个移到倒数第⼀个.......顺序不要弄反了。

//顺序表的插⼊Status InsertList_Sq(SqList &L,int i,ElemType e){if(i<1||i>L.length+1)return ERROR;//判断位置是否有效if(L.length>=L.listsize){//判断是否需要重新分配内存ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//重新分配内存,这⾥newbase对应的是elem,所以定义的时候必须是ElemType *newbase if(!newbase)exit(OVERFLOW);//重新分配完之后还要判断是否溢出L.elem=newbase;//把新的内存赋给L.elemL.listsize+=LISTINCREMENT;}ElemType *q=&(L.elem[i-1]);//定义⼀个指针指向需要插⼊的位置ElemType *p=&(L.elem[L.length-1]);//定义⼀个指针指向指针的末尾for(p;p>=q;p--){*(p+1)=*p;//就是把倒数第⼀赋给倒数第⼆,倒数第三赋给倒数第⼆......}*q=e;//最后吧需要插⼊的元素的值赋给qL.length++;//顺序表的长度加⼀return OK;}3.删除的时候还是要先判断删除的位置是否有效,然后就找到删除的位置,让他下⾯的元素依次往上赋值//顺序表的删除Status DeleteList_Sq(SqList &L,int i){if(i<1||i>L.length)return ERROR;//判断位置是否有效ElemType *p=&(L.elem[i-1]);//定义⼀个指针指向要删除位置ElemType *q=&(L.elem[L.length-1]);//定义⼀个指针指向顺序表的末尾for(p;p<=q;p++){*p=*(p+1);//将删除位置以下的元素依次向上赋值}L.length--;//顺序表的长度减⼀return OK;}4.总的代码为#include <stdio.h>#include<malloc.h>//分配内存的时候需要使⽤#include <iostream>//exit需要使⽤#define OK 1#define ERROR 0#define OVERFLOW -1//判断是否溢出的时候要使⽤#define LIST_INIT_SIZE 10#define LISTINCREMENT 100typedef int ElemType;typedef int Status;typedef struct{ElemType *elem;int length;int listsize;}SqList;//建⽴顺序表Status InitList_Sq(SqList &L,int n){L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配内存if(!L.elem)exit(OVERFLOW);printf("请输⼊顺序表中元素:");for(int i=0;i<n;i++){scanf("%d",&L.elem[i]);}L.length=n;L.listsize=LIST_INIT_SIZE;return OK;}//输出顺序表中的元素Status ExitList_Sq(SqList L){for(int i=0;i<L.length;i++){printf("%d ",L.elem[i]);}printf("\n");}//顺序表的插⼊Status InsertList_Sq(SqList &L,int i,ElemType e){if(i<1||i>L.length+1)return ERROR;//判断位置是否有效if(L.length>=L.listsize){//判断是否需要重新分配内存ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//重新分配内存,这⾥newbase对应的是elem,所以定义的时候必须是ElemType *newbaseif(!newbase)exit(OVERFLOW);//重新分配完之后还要判断是否溢出L.elem=newbase;//把新的内存赋给L.elemL.listsize+=LISTINCREMENT;}ElemType *q=&(L.elem[i-1]);//定义⼀个指针指向需要插⼊的位置ElemType *p=&(L.elem[L.length-1]);//定义⼀个指针指向指针的末尾for(p;p>=q;p--){*(p+1)=*p;//就是把倒数第⼀赋给倒数第⼆,倒数第三赋给倒数第⼆...... }*q=e;//最后吧需要插⼊的元素的值赋给qL.length++;//顺序表的长度加⼀return OK;}//顺序表的删除Status DeleteList_Sq(SqList &L,int i){if(i<1||i>L.length)return ERROR;//判断位置是否有效ElemType *p=&(L.elem[i-1]);//定义⼀个指针指向要删除位置ElemType *q=&(L.elem[L.length-1]);//定义⼀个指针指向顺序表的末尾for(p;p<=q;p++){*p=*(p+1);//将删除位置以下的元素依次向上赋值}L.length--;//顺序表的长度减⼀return OK;}int main(){SqList L;int n;printf("请输⼊顺序表中元素的个数:");scanf("%d",&n);InitList_Sq(L,n);//建⽴顺序表ExitList_Sq(L);int i;ElemType e;//顺序表的插⼊printf("请输⼊想插⼊的位置:");scanf("%d",&i);printf("请输⼊想插⼊的元素:");scanf("%d",&e);InsertList_Sq(L,i,e);ExitList_Sq(L);printf("请输⼊想删除的位置:");//顺序表的删除int m;scanf("%d",&m);DeleteList_Sq(L,m);ExitList_Sq(L);}5.实验结果。

顺序表的操作实验报告

顺序表的操作实验报告

实验二顺序表的操作实验报告班级xxxx 学号xxxx 姓名xxxx实验名称顺序表的操作实验目的掌握线性表的顺序存储结构的基本概念、基本操作和应用实验环境硬件环境:微型计算机软件环境:Windows 2000或以上版本,turboc2.0实验内容1.创建顺序表,顺序表的元素的值由用户从键盘输入。

2.在已经创建的顺序表中插入一个元素。

从键盘读入元素值和插入位置,在指定的位置前插入。

3.在已经创建的顺序表中删除一个元素。

从键盘读入欲删除的元素位置,在指定的位置删除元素。

实验步骤及结果线性表的插入线性表的删除#include <stdio.h>#define OK 1#define ERROR 0#define ElemType int#define LIST_INT_SIZE 100#define LISTINCREMENT 10typedef struct{ElemType *elem;int length;int listsize;}SqList;int InitList_Sq(SqList *L){L->elem=(ElemType*)malloc(LIST_INT_SIZE*sizeof(ElemType));if (!L->elem) return OK;L->length=0;L->listsize=LIST_INT_SIZE;return OK;}int ListInsert_Sq(SqList *L,int i,ElemType e){ElemType *p, *q, *newbase;if (i < 1 || i > L->length+1) return ERROR;if (L->length >= L->listsize){ newbase = (ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));#include <stdio.h>#define OK 1#define ERROR 0#define ElemType int#define LIST_INT_SIZE 100#define LISTINCREMENT 10typedef struct{ElemType *elem;int length;int listsize;}SqList;int InitList_Sq(SqList *L){L->elem=(ElemType*)malloc(LIST_INT_SIZE*sizeof(ElemType));if (!L->elem) return OK;L->length=0;L->listsize=LIST_INT_SIZE;return OK;}int ListDelete_Sq(SqList *L, int i, ElemTypee){ElemType *p, *q;if (i<1 || i>L->length) return ERROR;p = &(L->elem[i-1]);e = *p;q = L->elem+L->length-1;for (++p; p<=q; ++p) *(p-1) = *p;if (!newbase) return ERROR;L->elem = newbase;L->listsize += LISTINCREMENT; }q = &(L->elem[i-1]);for (p = &(L->elem[L->length-1]); p>=q;--p) *(p+1) = *p;*q = e;++L->length;return OK;}int main(){SqList *L;int i,e;if (! InitList_Sq(L)) return ERROR;printf("Please input the length of thelist(1-100) : ");scanf("%d",& L->length);for(i=0;i< L->length;i++)scanf("%d",& L-> elem[i]);printf("The old Sqlist is : \n");for(i=0;i< L->length;i++)printf("%d ",L-> elem[i]); printf("\nPlease input the location to insert(1 to L->length+1) : \n");scanf("%d",&i);while(i<1||i> L->length+1){printf("Please input the location toinsert (1 to 11) : \n ");scanf("%d",&i);}printf("Please input the integer to insert(eg,58) : ");scanf("%d",&e);if(ListInsert_Sq(L,i,e)){printf("The new Sqlist is : ");for(i=0;i< L->length;i++)printf("%d ",L-> elem[i]);}}--L->length;return OK;}int main(){SqList *L;int i,e;if (! InitList_Sq(L)) return ERROR; printf("Please input the length of thelist(1-100) : ");scanf("%d",&L->length);for(i=0;i< L->length;i++)scanf("%d",& L-> elem[i]);printf("The old Sqlist is : \n");for(i=0;i< L->length;i++)printf("%d ",L-> elem[i]); printf("\nPlease input the location to outsert (1 to L->length-1) : \n");scanf("%d",&i);while(i<1||i> L->length+1){printf("Please input the location to insert (1 to L.length-1) : \n ");scanf("%d",&i);}if(ListDelete_Sq(L,i,e)){printf("The new Sqlist is : ");for(i=0;i< L->length;i++)printf("%d ",L-> elem[i]);}}运行结果:运行时,它会提示“Please input the length of the list(1-100) :”我们就可以输入一个值为1-100中的任意一个数。

实验二:线性表的插入和删除

(1)设数据元素为整数,实现这样的线性表的顺序存储表示。
(2)键盘输入10个数据元素,利用顺序表的基本操作,建立该表。
(3)利用顺序表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。
(4)*若数据元素为学生成绩(含姓名、成绩等字段),重新编程,实现上面的要求。要求尽可能少地修改前面的程序来得到新程序。(这里用于比较的字段为分数)
printf("score is: ");
scanf("%f",&s);
if(s==0)
{
k=0;
p->next=NULL;
}
else
{
r=(node *)malloc(LEN);
strcpy(r->name,n);
r->score=s;
p->next=r;
p=r;
}
}
return(h);
}
void locate(node *L,float x)
数学学院2014~2015学年第一学期实验报告
班级:计算121学号:201210402136姓名:苏宏伟实验时间:2014年9月29日
实验
项目
线性表的插入和删除
所属
课程
算法与数据结构




熟悉掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,并熟悉其各自的优缺点及适用性。




题目1:
编写程序实现下列的要求:
教师
评语
(4)输入关键字值x,删除表中所有关键字值<=x的结点。(用于比较的关键字字段为分数)。
测试数据:自拟(数据不少于6个学生)

实验二 顺序表的操作、插入与删除

实验二顺序表的操作、插入与删除【实验目的】(1)熟悉数据移动是顺序表的操作特点。

(2)掌握顺序表中元素的移动、插入和删除操作的特点。

【实验内容】题1 设有一个用向量表示的线性表a[n],a[0]中不存放线性表的元素。

要求写出将其中元素逆置的函数,并只允许用a[0]作附加的工作单元。

题2 写出从线性表中删除元素值为x的结点的函数。

若该表中无此结点,则输出“无此结点”信息。

【实验要求】从键盘任意输入9个整数,依次存放在数组a[10]的元素a[1]~a[9]中,逆置后输出。

在题1的基础上,从键盘输入一个整数x,从a[1]开始访问数组a,完成题2。

【实验提示】题1 有以下两种方法:(1)将a[1]至a[n-1]前移1位,再将a[n-1]←a[0];接着a[1]至a[n-2]前移一位,再将a[n-2]←a[0];……。

(2)可用移动和插入,通过a[0]使元素a[1]和a[n-1]交换;再使a[2]和a[n-2]交换;如此继续至中点为止。

注意如何判断中点。

思考这两种方法的时间复杂度分别是多少。

题2 首先也要找到被删除元素的位置,然后将该位置以后的数据元素全部前移一个单元。

注意:当数组a中有重复的元素值且x与此值相等时,函数应能删除全部重复元素。

当有多个连续的相同值需要删除时,应都能删除。

#include<stdio.h>#define N 10void del(int x,int a[10]){int n=9,i,j;for(i=1;i<=n;i++){while(a[i]==x){for(j=i;j<n;j++)a[j]=a[j+1];n--;}}printf("结果是:");printf("%d\n",n);for(i=1;i<=n;i++)printf("%d ",a[i]);printf("\n");}int main(){int a[N],i,j,m,x;printf("请输入%d个数:\n",N-1);for(i=1;i<=N-1;i++)scanf("%d",&a[i]);printf("逆置结果:\n");if((N-1)%2==0) m=(N-1)/2;else m=(N-2)/2;for(i=1;i<=m;i++){a[0]=a[i];a[i]=a[N-i];a[N-i]=a[0];}for(i=1;i<=N-1;i++)printf("%d ",a[i]);printf("\n");printf("请输入要删除元素的值:");scanf("%d",&x);del(x,a);return 0;}。

顺序表的查找插入与删除实验报告

顺序表的查找插入与删除实验报告顺序表的查找、插入与删除实验报告《数据结构》实验报告一学院:班级:姓名:程序名学号:日期:一、上机实验的问题和要求:顺序表的搜寻、填入与删掉。

设计算法,同时实现线性结构上的顺序表的产生以及元素的搜寻、填入与删掉。

具体内容同时实现建议:1.从键盘输入10个整数,产生顺序表,并输入结点值。

2.从键盘输入1个整数,在顺序表搜寻该结点的边线。

若找出,输入结点的边线;若打听不到,则显示“找不到”。

3.从键盘输入2个整数,一个则表示欲填入的边线i,另一个则表示欲填入的数值x,将x挂入在对应位置上,输出顺序表所有结点值,观察输出结果。

4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。

二、源程序及注解:#include#include/*顺序表的定义:*/#include#definelistsize100/*表空间大小可根据实际需要而定,这里假设为100*/typedefintdatatype;/*datatype可以是任何相应的数据类型如int,float或char*/typedefstruct{datatypedata[listsize];/*向量data用作放置表中结点*/intlength;/*当前的表中长度*/}seqlist;voidmain(){seqlistl;inti,x;intn=10;/*欲建立的顺序表长度*/l.length=0;voidcreatelist(seqlist*l,intn);voidprintlist(seqlistl,intn);intlo catelist(seqlistl,datatypex);voidinsertlist(seqlist*l,datatypex,inti);voiddele telist(seqlist*l,inti);1createlist(&l,n);/*建立顺序表*/printlist(l,n);/*打印顺序表*/printf(\输入要查找的值:\scanf(\i=locatelist(l,x);/*顺序表查找*/printf(\输入要插入的位置:\scanf(\printf(\输入要插入的元素:\scanf(\insertlist(&l,x,i);/*顺序表插入*/printlist(l,n);/*打印顺序表*/printf(\输入要删除的位置:\scanf(\deletelist(&l,i);/*顺序表删除*/printlist(l,n);/*打印顺序表*/}/*顺序表的创建:*/voidcreatelist(seqlist*l,intn){inti;for(i=0;ilength=n;}/*顺序表的列印:*/voidprintlist(seqlistl,intn){inti;for(i=0;i/*顺序表的查找:*/intlocatelist(seqlistl,datatypex){inti=0;while(iif(i2/*顺序表的插入:*/voidinsertlist(seqlist*l,datatypex,inti){intj;if(i<1||i>l->length+1){printf(\插入位置非法\\n\exit(0);}if(l->length>=listsize){printf(\表空间溢出,退出运行\\n\exit(0);}for(j=l->length-1;j>=i-1;j--)l->data[j+1]=l->data[j];l->data[i-1]=x;l->length++;}/*顺序表的删除:*/voiddeletelist(seqlist*l,inti){intj;if(l->length==0){printf(\现行表为空,退出运行\\n\exit(0);}if(i<1||i>l->length){printf(\删除位置非法\\n\exit(0);}for(j=i;j<=l->length-1;j++)l->data[j-1]=l->data[j];l->length--;}3三、运行输出结果:四、调试和运行程序过程中产生的问题及采取的措施:4。

线性表的建立,插入与删除

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

二、实验要求1、设计对线性表进行链式存储操作的内容;2、写出相应程序;3、保存和打印出程序的运行结果,并结合程序进行分析。

三、实验内容线性表的建立,插入与删除算法:Status InitList_ Sq(SqList &L)Status ListInsert_ Sq(SqList &L, int i, Elemtype e){if(i<1||i>L.length+1) return ERROR;q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]); p>=q; --p)*(p+1)=*p;*q=e;++l.length;return OK;}//ListInsert_ Sq;Status ListDelete_ Sq(SqList &L, int i, Elemtype e){if(i<1||i>L.length+1) return ERROR;p=&(L.elem[i-1]);e=*pq=L.elem+L.length-1;for(++p;p<=q;++p)*(p-1)=*p;--L.length;return OK;}//ListDelete_ Sq;四、程序代码#include<stdlib.h>#include<stdio.h>typedef struct{int *elem;int length;}sqlist;void init(sqlist *L){L->elem=(int*)malloc(100*sizeof(int));L->length=0;}void read1(sqlist *L,int n){int i;printf("input n shu:");for(i=0;i<n;++i)scanf("%d",&L->elem[i]);L->length=n;}void print(sqlist L){int i;for(i=0;i<=L.length-1;++i)printf("%5d",L.elem[i]);printf("\n");}void insert(sqlist *L,int i,int e){int *p,*q;if(i<1||i>L->length+1)printf("error");else{q=&L->elem[i-1];for(p=&L->elem[L->length-1];p>=q;--p)*(p+1)=*p;*q=e;++L->length;}}void delist(sqlist *L,int i ,int *e){ int *p,*q;if(i<1||i>L->length)printf("error\n");else{q=&L->elem[i-1]; *e=*q;for(p=q;p<=&L->elem[L->length-1];++p)*(p)=*(p+1);--L->length;}}main(){sqlist L; int e;int i,n;init(&L);printf("input n;");scanf("%d",&n);read1(&L,n);print(L);printf("input i,e;"); printf("input i,e;");scanf("%d%d",&i,&e);insert(&L,i,e);printf("insert:");print(L);printf("input i;");scanf("%d",&i);delist(&L,i,&e); printf("delete:");print(L);getch();}五、结果及分析。

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

实验二、有序表的建立、插入与删除
一、实验目的
1、了解有序表的顺序存贮结构。

2、掌握有序表元素在内存中是怎样存贮的。

3、在有序表中实现如下操作:
(1)插入一个新元素到第i个位置。

(2)删除第i个位置的元素。

(3)存一个新元素到第i个位置。

二、实验要求:
要求实现:建表操作、插入新元素、删除第i个位置的元素。

写出实验原理、算法思想(流程图)、完整程序代码、输出结果验证。

⊙实验原理:
线性表是最常用的而且也是最简单的一种数据结构,线性表是N个数据元素的有限序列。

LOC(ai+1)=LOC(ai)+m。

其中m是存放每个元素所占的内存字数。

LOC(ai)=LO+m·(i-1)。

其中LO 是ai的地址,即首地址。

插入一个新元素到第i个位置,既把元素ai向后移一个位置,成为元素ai+1,把新元素放入到第i个位置,其他元素依次后移。

删除第i个元素就是把余后的元素依次向前移一个位置。

即:以元素ai+1,ai+2,···,依次取代ai,ai+1,···。

删除后的表长是n-1(n是原表长)。

⊙算法思想(流程图):见手稿
⊙完整程序代码:
1.插入新元素:
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define ElemType int
#define MAXSIZE 100
typedef struct
{ ElemType elem[MAXSIZE];
int last;
}SeqList;
int InsList(SeqList *L,int i,ElemType e)
{ int k;
if((i<1) || (i>L->last+2))
{ printf("the illegal position");
return(ERROR);
}
if(L->last>= MAXSIZE-1)
{ printf("the list is full");
return(ERROR);
}
for(k=L->last;k>=i-1;k--)
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e;
L->last++;
return(OK);
}
void main()
{ SeqList *l;
int p,q,r;
int i;
l=(SeqList*)malloc(sizeof(SeqList));
printf("please input the length of the list:");
scanf("%d",&r);
l->last = r-1;
printf("please input the data:\n");
for(i=0; i<=l->last; i++)
{ scanf("%d",&l->elem[i]);
}
printf("please input the inserted number place:\n");
scanf("%d",&p);
printf("please enter the new number:\n");
scanf("%d",&q);
InsList(l,p,q);
for(i=0; i<=l->last; i++)
{ printf("%d ",l->elem[i]);
}
}
输出结果验证:
2.删除第i个位置的元素:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define ElemType int
#define MAXSIZE 100
typedef struct
{ ElemType elem[MAXSIZE];
int last;
}SeqList;
int DelList(SeqList *L,int i,ElemType *e)
{ int k;
if((i<1)||(i>L->last+1))
{ printf("the illegal position!");
return(ERROR);
}
*e=L->elem[i-1];
for(k=i;i<=L->last;k++)
L->elem[k-1]=L->elem[k]; L->last--;
return(OK);
}
void main()
{ SeqList *l;
int p,r; int *q; int i;
l=(SeqList*)malloc(sizeof(SeqList));
q=(int*)malloc(sizeof(int));
printf("pleast input the length of the list:");
scanf("%d",&r);
l->last=r-1;
printf("pleast input the data:\n");
for(i=0;i<=l->last;i++)
{ scanf("%d",&l->elem[i]);
}
printf("please input the deleted number place:\n"); scanf("%d",&p);
printf("the deleted data:%d\n",*q);
}
输出结果验证:。

相关文档
最新文档