实验报告 数据结构 线性表的合并

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

if(!(Lc->elem)) exit(-1); pa_last=La.elem+La.length-1; pb_last=Lb.elem+Lb.length-1; while((pa<=pa_last)&&(pb<=pb_last)){
if(*pa<=*pb) *pc++=*pa++; else *pc++=*pb++; } while(pa<=pa_last) *pc++=*pa++; while(pb<=pb_last) *pc++=*pb++; }
} printf("表 La 为:\n"); for(i=1;i<=La.length;i++)
printf("e[%d]=%d\t",i-1,La.elem[i-1]); printf("\nLength: %d\n\n",La.length); /*-----------创建 Lb------------*/ if(InitList_sq(&Lb))
老师在课堂上讲的以及书本上的知识能够理解,但是一旦上机进行实验时, 自己采用刚学的知识点编写程序时却感到十分棘手,有时表现在想不到适合 题意的算法,有时表现在算法想出来后,只能将书本上原有的程序段誊写到 自己的程序中再加以必要的连接以完成程序的编写,希望自己能够在接下来 的学习中对这些问题进行改正

2.主要存储结构及定义
用动态分配的的一维数组来描述顺序存储结构,其具体定义如下:
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的存储增量
typedef struct{
ElemType *elem; //存储空间基址
MergeList(La,Lb,&Lc); printf("表 Lc 为:\n"); for(i=1;i<=Lc.length;i++)
printf("e[%d]=%d\t",i-1,Lc.elem[i-1]); printf("\nLength: %d\n\n",Lc.length); getchar(); getchar(); }
while(pa<=pa_last) *pc++=*pa++; while(pb<=pb_last) *pc++=*pb++; }
main() { sqlist La,Lb,Lc; 第一步:创建 La,向 La 输入数据 InitList_sq(&La); 第二步:创建 Lb,向 Lb 输入数据 InitList_sq(&Lb); 第三步:将 La 和 Lb 合并为 Lc,并将 Lc 输出 MergeList(La,Lb,&Lc); }
{ scanf("%d",&e) ; if(ListInsert_Sq(&Lb,i,e)!=1) break;
} printf("表 Lb 为:\n"); for(i=1;i<=Lb.length;i++)
printf("e[%d]=%d\t",i-1,Lb.elem[i-1]); printf("\nLength: %d\n\n",Lb.length); printf("按任意键继续\n"); getchar(); getchar(); /*-----------创建 Lc------------*/ if(InitList_sq(&Lc))
void MergeList(sqlist La,sqlist Lb,sqlist *Lc){ int *pa,*pb,*pc; int *pa_last,*pb_last; pa=La.elem;pb=Lb.elem; Lc->listsize=Lc->length=La.length+Lb.length; pc=Lc->elem=(int *)malloc((Lc->listsize)*sizeof(int));
pa_last=La.elem+La.length-1; pb_last=Lb.elem+Lb.length-1; while((pa<=pa_last)&&(pb<=pb_last)){
if(*pa<=*pb) *pc++=*pa++; else *pc++=*pb++; } 第三步:La 和 Lb 中还有剩余元素,则将剩余元素插入到 Lc 中
{ printf("创建顺序线性表 Lc 成功\n"); printf("Lc 当前的长度 Lc.Length: %d\n",Lc.length);Baidu Nhomakorabeaprintf("Lc 当前的存储容量 Lc.Listsize: %d\n\n",Lc.listsize);
} else printf("出错!\n");
5.调试主要问题及解决方案
问题 序号
类型
问题描述
01 调用 函数调用出错
02 指针 指针使用各式错误
03 逻辑 逻辑混乱
解决办法 修改实参列表 改为正确格式 梳理逻辑,改正代码
调试 过程
实验 总结
本次实验的收获、体会、经验、问题和教训: 通过本次实验,我总结了数据结构这门课程学习过程中的一些问题。虽然
{
printf("创建顺序线性表 Lb 成功\n"); printf("Lb 当前的长度 Lb.Length: %d\n",Lb.length); printf("Lb 当前的存储容量 Lb.Listsize: %d\n\n",Lb.listsize);
} else printf("出错!\n"); printf("请输入要插入 Lb 的数据元素的个数 n="); scanf("%d",&n); printf("请输入数据元素\n"); for(i=1;i<=n;i++)
实验 内容
Status MergeList(sqlist La,sqlist Lb,sqlist *Lc) { 第一步:给 Lc 分配存储空间
pa=La.elem;pb=Lb.elem; Lc->listsize=Lc->length=La.length+Lb.length; pc=Lc->elem=(int *)malloc((Lc->listsize)*sizeof(int)); 第二步:遍历 La 和 Lb 中的元素,并比较大小,将较小的元素插入 Lc 中
4.主要功能函数算法流程 Status InitList_sq(sqlist &L);
{ 第一步:分配存储空间 L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); 第二步:初始表长和存储容量 L->length=0; L->listsize=LIST_INIT_SIZE; }
int ListInsert_Sq(sqlist *L,int i,int e){ int *newbase,*p,*q; if(i<1||i>L->length+1) return 0; if(L->length>=L->listsize){ newbase=(int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int)); if(!newbase) exit(-1); L->elem=newbase; L->listsize=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 1; }
main() { sqlist La,Lb,Lc; int i,e,n; /*-----------创建 La------------*/ if(InitList_sq(&La))
{ printf("创建顺序线性表 La 成功\n"); printf("La 当前的长度 La.Length: %d\n",La.length); printf("La 当前的存储容量 La.Listsize: %d\n\n",La.listsize);
} else printf("出错!\n"); printf("请输入要插入 La 的数据元素的个数 n="); scanf("%d",&n); printf("请输入数据元素\n"); for(i=1;i<=n;i++)
{ scanf("%d",&e) ; if(ListInsert_Sq(&La,i,e)!=1) break;
int InitList_sq(sqlist *L){ L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); if(!L->elem) exit(0); L->length=0; L->listsize=LIST_INIT_SIZE; return 1; }
Status ListInsert_Sq(sqlist *L,int i,int e) { 第一步:判断存储空间是否不足,不足则增加分配
if(L->length>=L->listsize) newbase=(int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int)); 第二步:插入 e,并进行元素右移 q=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; *q=e; }
int length;
//当前长度
int listsize;
//当前分配的存储容量
}sqlist;
3.各函数及说明 Status InitList_sq(sqlist &L); //构造一个空的线性表 Status ListInsert_Sq(sqlist &L,int i,ElemType e); //在顺序线性表 L 中第 i 个元素之前插入元素 e Status MergeList(sqlist La,sqlist Lb,sqlist &Lc;); //已知顺序线性表 La 和 Lb 的元素按值非递减排列 //归并 La 和 Lb 得到新的顺序表 Lc,Lc 的元素也按值非递减排列
程序 代码
见附页
附页 #include "stdio.h" #include "stdlib.h" #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10
typedef struct{ int *elem; int length; int listsize; }sqlist;
辽宁工程技术大学上机实验报告
作者邮箱:2904305706@qq.com
实验名称
实验 目的
线性表的合并
1、掌握顺序表的基本操作 2、实现线性表的合并
成绩 教师
C 语言程序开发环境 Visual C++ 6.0
实验 准备
实验 内容
1.问题分析及结构选择 结构选择:根据实验要求,本实验采用线性表的顺序存储结构。 问题分析:先创建空表 La ,Lb, Lc,再对其进行初始化并分配存储空间。 向 La 和 Lb 中输入数据元素,开始遍历 La 和 L b 中的元素,并比较大小, 将较小的元素插入 Lc 中,遍历结束后,若 La 和 Lb 中还有剩余元素,则 将剩余元素插入到 Lc 中,即实现了 La 和 Lb 的合并。
相关文档
最新文档