第一篇:数据结构--实验报告 线性表的基本操作
}(一)单链表的基本操作
#include
LinkList q=L;//使q指向表尾
} Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素 { LinkList p=L->next;int j=1;while(p&&jnext;++j;} for(int i=1;i<=n;i++){ p=new LNode;
cin>>p->data;p->next=NULL;q->next=p;q=p;} if(!p||j>i)return error;//第i个元素不存在
e=p->data;return ok;} Status LinkInsert(LinkList &L,int i,ElemType e)//插入 { LinkList p=L;int j=0;while(p&&j
s->data=e;s->next=p->next;//插入L中
p->next=s;return ok;}
Status ListDelete(LinkList &L,int i,ElemType &e)// 删除 { LinkList p=L;LinkList q;int j=0;while(p->next&&j p=p->next;++j;} if(!(p->next)||j>i-1)return error;//删除位置不合理 q=p->next;p->next=q->next;//删除并释放结点 e=q->data;delete(q);return ok; } void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){ //合并两个顺序链表 LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data) { pc->next=pa; pc=pa;pa=pa->next;} else { pc->next=pb; pc=pb; pb=pb->next;} } pc->next=pa?pa:pb;delete(Lb);} void show(LinkList L)//{ LinkList p;p=L->next;while(p){ cout< data<<“-->”;p=p->next;} cout< 显示 表长 3 p=p->next;} return i;} void xiugai(LinkList L)//修改 { int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<“请输入要修改的元素位置(0>i;GetElem(L,i,e);cout<<“该位置的元素:”< cin>>x; cout<<“请输入”< CreateList(list,x);break;case 2: cout<<“单链表显示如下:”< show(list);break;case 3: int s;cout<<“单链表的长度为:”< ListDelete(list,x,y); } break;case 8: hebing();break;case 9: exit(0);break;default : cout<<“输入有误,请重新输入”< 四、测试结果 1)顺序表 的测试结果 8 2)单链表的测试结果 五、心得体会 当听到老师说写数据结构实验报告时,我有点惊讶,才学了不到一个月,就要写实验报告。记得去年学习C++时,学了一个学期,程序设计用了三周,才完成的,这个实验报告居然要一周完成两个设计,觉得很难。但是现在一周过去了,我也写完了,自我感觉良好。 通过这次写实验报告,我深切的理解了这门课的本质。刚开始学这门课时,当时还不清楚这门课程的目的,现在,我真正的理解了:数据结构像是身体的骨骼,而C++是填充这骨骼的肉体,二者相结合才能使整个程序更加完整,健全。数据结构是个框架,模型,抽象数据类型中列举了各种操作,而所用的C++语言,将各种操作描述出来构成算法。数据结构+算法=程序设计。 在这次设计的过程中,我还遇到了,很多的问题。顺序表是按顺序存储的,用了一维数组来存储,又结合C++的程序设计,我又用了类,但是,在执行时出现了问题。后来问同学,指出我的错误,不过获益不少。我又重新整理思路,把顺序表的基本操作写好了。虽然走了很多弯路,但是让我认识到,一定要创新,大胆,不能按照旧的思路去干新的事情。 单链表写起来简单多了,这个很快就搞定了。但是细节上出了问题。比如说,有些变量的重复定义,有些变量又没有定义,在调用函数,就直接复制过来,没有改参数……通过修改,我深刻理解到:细节决定成败,在以后,不管做任何事情都要认真,细心。 这次的实验报告,让我受益匪浅,不仅有知识方面的,还有生活和精神上的。总之,我会继续我的兴趣编程,相信在编程的过程中,能不断的提高自己。 实验报告 课程名:数据结构 实验名:线性表及其操作 姓名: 班级: 学号: 撰写时间:2014.09.24 一 实验目的与要求 1.掌握线性表的实现 2.掌握线性表的基本操作的实现 二 实验内容 • 分别完成线性表的顺序表示及链式表示 • 在两种表示上, 分别实现一些线性表的操作, 至少应该包括 – 在第i个位置插入一个元素 – 删除第i个元素 – 返回线性表长 – 返回第i个元素的值 三 实验结果与分析 #include { printf(“%d, ”,(*p).value); p=(*p).next;//指针指向下一个结构体 } printf(“n”);} void Link(){ struct V*head;head=(struct V*)malloc(sizeof(struct V));//开辟一个长度为size的内存 (*head).value=-100;//表头为-100(*head).next=NULL;printf(“------------线性表链式表示------------n”); int i,n=10;struct V*p=head;printf(“10个数据:n”);for(i=0;i (*p).next=(struct V*)malloc(sizeof(struct V)); p=(*p).next; (*p).value=2*i; (*p).next=NULL;} PrintLink(head);//调用PrintLink函数 printf(“删除第四个数据:n”);int k=4;p=head;for(i=1;i p=(*p).next;} struct V*temp=(*p).next;//k表示插入和删除的位置 (*p).next=(*temp).next;free(temp);PrintLink(head);printf(“插入第十个数据:n”); k=10;p=head;for(i=1;i p=(*p).next;} temp=(*p).next;(*p).next=(struct V*)malloc(sizeof(struct V));(*(*p).next).value=-99;(*(*p).next).next=temp;PrintLink(head);} //---------线性表顺序表示-----------void seq1(){ int i,n=10,k=4;int a[10];//---------输出数组元素------------printf(“-------------线性表顺序表示---------n”);for(i=0;i a[i]=i;} printf(“数组元素为:n”);for(i=0;i printf(“%3d”,a[i]);} printf(“n”);//--------插入一个数组元素---------int m=n+1,j=12;//插入元素12 int b[20];for(i=0;i if(i { b[i]=a[i]; } else if(i==k) {b[i]=j;} else {b[i]=a[i-1];} } printf(“输出插入一个元素的数组:n”);for(i=0;i { if(i {c[i]=a[i];} else {c[i]=a[i+1];} } printf(“输出删除一个元素的数组:n”);for(i=0;i printf(“数组元素为:n”);for(i=1;i<=a[0];i++){a[i]=i;} for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-----在k位置插入一个元素------------for(i=a[0];i>=k;i--){a[i+1]=a[i];} a[k]=-100;++a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-------在k---------------for(i=0;i>k;i++){a[i]=a[i+1];} a[k]=-1;a[0]=n;--a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”); } int main(int argc,char *argv[]){ seq1();seq2();Link();return 0;} 图1:实验结果截图 实验分析:已在程序中按规定格式标注。 数据结构原理实验报告 学号: 姓名: 线性表 一、问题描述 1.实现ADT表 2.设表的Reverse运算将表中元素的次序反转。扩充用数组实现表的结构List,增加函数Reverse(L),将表L中元素的次序反转,并要求就地实现Reverse运算。 二、算法描述 从i=0开始,将表中第N个元素与N-i-1个元素调换即可 三、核心代码 void ReverseList(List L){ ListItem tmp;int i;for(i=0;i } tmp = L->table[i];L->table[i] = L->table[L->n-1-i];L->table[L->n-1-i] = tmp;} 四、运行结果 实验 一 线性表的基本操作实现及其应用 一、实验目的 1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。 2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。 二、实验内容 √ 1、单链表的表示与操作实现(*) 2、约瑟夫环问题 3、Dr.Kong的艺术品 三、实验要求 1、按照数据结构实验任务书,提前做好实验预习与准备工作。 2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。 3、严格按照数据结构实验报告模板和规范,及时完成实验报告。 四、实验步骤 (说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码) ㈠、数据结构与核心算法的设计描述 (程序中每个模块或函数应加注释,说明函数功能、入口及出口参数) 1、单链表的结点类型定义 /* 定义DataType为int类型 */ typedef int DataType; /* 单链表的结点类型 */ typedef struct LNode { DataType data;struct LNode *next;}LNode,*LinkedList; 2、初始化单链表 LinkedList LinkedListInit(){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 } 3、清空单链表 void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数} 4、检查单链表是否为空 int LinkedListEmpty(LinkedList L){ ….} 5、遍历单链表 void LinkedListTraverse(LinkedList L){ ….} 6、求单链表的长度 int LinkedListLength(LinkedList L){ ….} 7、从单链表表中查找元素 LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 } 8、从单链表表中查找与给定元素值相同的元素在链表中的位置 LinkedList LinkedListLocate(LinkedList L, DataType x){ …… } 9、向单链表中插入元素 void LinkedListInsert(LinkedList L,int i,DataType x){ // L 为带头结点的单链表的头指针,本算法 // 在链表中第i 个结点之前插入新的元素 x } 10、从单链表中删除元素 void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 } 11、用尾插法建立单链表 LinkedList LinkedListCreat(){ …… } ㈡、函数调用及主函数设计 (可用函数的调用关系图说明)㈢ 程序调试及运行结果分析 ㈣ 实验总结 五、主要算法流程图及程序清单 1、主要算法流程图: 2、程序清单 (程序过长,可附主要部分) 说明:以后每次实验报告均按此格式书写。 我在布置实验室时,仅给出实验名称、实验目的、实验内容及相关数据结构。 题目一程序参考框架 # include /* 单链表的结点类型 */ typedef struct LNode {ElemType data;struct LNode *next;} LNode,*LinkedList; /* 初始化单链表 */ LinkedList LinkedListInit(){ } /* 清空单链表 */ void LinkedListClear(LinkedList L){ } /* 检查单链表是否为空 */ int LinkedListEmpty(LinkedList L){ } /* 遍历单链表 */ void LinkedListTraverse(LinkedList L){ } int LinkedListLength(LinkedList L){ } LinkedList LinkedListGet(LinkedList L, int i){ } LinkedList LinkedListLocate(LinkedList L, ElemType x){ } void LinkedListInsert(LinkedList L, int i, ElemType x){LinkedList pre,p,s;int j;pre=L;j=1;p=L->next;while(pre&&jnext;j++;} if(pre==NULL){printf(“给的i值超过了表长”);exit(0);} s=(LNode *)malloc(sizeof(LNode));s->data=x;pre->next=s;s->next=p;} void LinkedListDel(LinkedList L,ElemType x){ LinkedList pre,p;int j;pre=L;j=1;p=L->next;while(p&&p->data!=x){pre=p;p=p->next;j++;} if(p==NULL){printf(“表中没有值为x的结点”);exit(0);} pre->next=p->next;free(p);} LinkedList LinkedListCreat(){ LinkedList L=LinkedListInit(),p,r;ElemType x;r=L;printf(“please input data,input-1 is endn”);scanf(“%d”,&x);while(x!=flag){p=(LinkedList)malloc(sizeof(LNode));p->data=x;r->next=p;r=p;scanf(“%d”,&x);} r->next=NULL;return L;} int scan(){int d;printf(“please input the operationn”);printf(“1.初始化 2.清空3.求链表长度4.检查链表是否为空n”);printf(“5.检查链表是否为满 6.遍历链表 7.从链表中查找元素n”);printf(“8.从链表中查找与给定元素值相同的元素在顺序表中的位置n”);printf(“9.向链表中插入元素10.从链表中删除元素n”);printf(“其他键退出。。。n”);scanf(“%d”,&d);return(d);} main(){int quit=0;int i;ElemType e;LinkedList L;while(!quit)switch(scan()){case 1: ….;break;case 2: ….;break;case 3: ….;break;case 4: ….;break;case 5:LinkedListTraverse(L);break;case 6: ….;break;case 7: ….;break;case 8: ….;break;case 9: ….;break;case 10: ….;break;default: quit=1;} return 0;} 线性表上机实习 1、实验目的 (1)熟悉将算法转换为程序代码的过程。 (2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。 (3)熟练掌握顺序表的基本运算:查找、插入、删除等,掌握顺序表的随机存取特性。(4)了解线性表的链式存储结构,熟练掌握线性表的链式存储结构的C语言描述方法。(5)熟练掌握线性链表(单链表)的基本运算:查找、插入、删除等,能在实际应用中灵活选择适当的链表结构。 2、实验要求 (1)熟悉顺序表的插入、删除和查找。(2)熟悉单链表的插入、删除和查找。 3、实验内容: ① 顺序表 (1)抽象数据类型定义 typedef struct { TypeData data[maxsize]; //容量为maxsize的静态顺手表 int n; //顺序表中的实际元素个数 }SeqList; //静态顺序表的定义 在本次实验中,首先建立一个空的静态顺序表,然后键盘输入数据存入表中,然后进入菜单选择界面,通过不同的数字输入,实现对顺序表,删除,插入,查找,显示等操作。 (2)存储结构定义及算法思想 在顺序表结构体的定义中,typedef int TypeData 为整型,存储结构如下: for(n=0;n cout<<“请输入线性表数据”< cin>>L.data[n]; //顺序将数据存入顺序表 } //其他存储与此类似,都是直接赋值与数组的某一位 插入版块子函数: void insert(SeqList &L) //插入数据 { int a,b,c,k; cout<<“请输入插入的数及其插入的位置”< cin>>a>>b; if(b<=0||b>(L.n+1)){cout<<“不能在该位置插入”< k=L.data[b-1];L.data[b-1]=a;c=L.n;L.n=L.n+1; while(c>b){ L.data[c]=L.data[c-1];c--; //通过循环,实现插入位置后的数据挨个往后移动一位 } L.data[b]=k;} 顺序表的插入与删除操作类似,在插入与删除后,都要循环调整后面数组的每一位元素,同时记录数据元素的长度的标示符也要跟着改变。显示操作是通过循环实现表中第一个元素到最后一个元素的输出,查找操作是直接取数组中的查找位输出。 (3)实验结果与分析 ② 单链表 (1)抽象数据类型定义 typedef struct node{ DataType data; //链表的数据类型 struct node *link; //链表的结点指针 }linknode,*linklist; //定义了结构体linklode和结构体指针linklist 在本次实验中,首先程序自己建立一个空的头结点,通过菜单的功能选择“添加链表数据”可自由添加链表的节点数及元素值。在菜单选择中,有“添加链数据”,“插入链表数据”,“删除链表数据”,“查找链表数据”和“显示链表数据”功能,选择不能的功能选择就能实现不同的操作。其中“添加链表数据”可反复批量输入链表数据。 (2)存储结构定义及算法思想 在单链表中,typedef int DataType;DataType data;定义链表存储数据位整型。存储结构如下: while(p->link!=NULL){ p=p->link; k++; //首先找到单链表的最后结点(如果是只有头结点 } 的单链表则直接跳过),以便后面接着输入数据第二篇:数据结构线性表实验报告
第三篇:福州大学数据结构实验报告-线性表
第四篇:《数据结构》 实验报告(附实例) ---实验一 线性表的基本操作实现
第五篇:数据结构线性表试验报告