数据结构实验报告.docx
- 文档编号:3661733
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:70
- 大小:819.16KB
数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(70页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
计算机学院软件学院
实验报告
学院:
计算机学院
课程名称:
数据结构
专业:
计算机应用技术
班级:
11级计算机专科1班
学号:
201113131121
姓名:
黄锡杏
指导教师:
李革
2012年12月10日
实验一顺序表基本操作的实现
一、实验目的
1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。
二、实验要求
1.预习C语言中结构体的定义与基本操作方法。
2.对顺序表的每个基本操作用单独的函数实现。
3.编写完整程序完成下面的实验内容并上机运行。
4.整理并上交实验报告。
三、实验内容
1.编写程序实现顺序表的下列基本操作:
(1)初始化顺序表SqList。
(2)将SqList置为空表。
(3)销毁SqList。
(4)在SqList中插入一个新的元素。
(5)删除SqList中的某一元素。
(6)在SqList中查找某元素,若找到,则返回它在SqList中第一次出现的位置,否则返回0。
(7)打印输出SqList中的元素值。
2、注意输出和输入数据的控制
四、实验步骤
1.编写头文件,定义数据类型,定义所需变量;分别写各个函数如ListInsern_Sq,ListDelete_Sq,LocateElem等函数。
2.编写主函数。
在主函数里构造空的线性表,然后利用ListInsert函数使用户初始化线性表。
然后调用函数操作,操作结果用PrintList_Sq打印出线性表的内容
3.运行程序,完整代码见下:
#include
#include
#include
#defineLIST_INIT_SIZE10
#defineLISTINCREMENT3
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR-1
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
typedefstruct
{
int*elem;
intlength;
intlistsize;
}SqList;
StatusInitlist_Sq(SqList&L)/*初始化顺序表*/
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
StatusDestroy_Sq(SqList&L)/*销毁顺序表*/
{
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
returnOK;
}
StatusClearlist_Sq(SqList&L)/*清空顺序表*/
{
L.length=0;
returnOK;
}
StatusListempty_Sq(SqListL)/*测试顺序表是否为空*/
{
if(L.length!
=0)
return(FALSE);
else
return(TRUE);
}
StatusListInsert_Sq(SqList&L,inti,ElemTypee)/*在第i个位置上插入一个元素*/
{
intj,*newbase;
if(i<1||i>L.length+1)
returnERROR;
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;
}
for(j=L.length;j>=i;--j)
L.elem[j]=L.elem[j-1];
L.elem[j]=e;
++L.length;
returnOK;
}
intLocateElem_Sq(SqListL,ElemTypee)/*返回元素e在顺序表中的位置*/
{
inti=1;
ElemType*p;
p=L.elem;
while(i<=L.length&&!
(*p==e))
{
i++;
p++;
}
if(i<=L.length)
returni;
returnFALSE;
}
StatusListDelete_Sq(SqList&L,inti,int&e)/*删除第i个位置上的元素*/
{
ElemType*p,*q;
if(i<1||i>L.length)returnERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
returnOK;
}
voidPrint_Sq(SqListL)/*输出顺序表*/
{
inti;
if(Listempty_Sq(L))
printf("\nSequentialList'slengthis%d.It'sempty!
",L.length);
else
printf("\nSequentialList'slengthis%d.Theseelementare:
",L.length);
for(i=0;i printf("%d",L.elem[i]); } voidmenu() { printf("\n"); printf("\n**************************\n"); printf("1-------PrinttheSequentialList.\n"); printf("2-------InsertadataintheSequentialList.\n"); printf("3-------DeleteadataintheSequentialList.\n"); printf("4-------Getaelement'slocationtintheSqList.\n"); printf("5-------CleartheSequentialList.\n"); printf("6-------Exit.\n"); printf("**************************\n"); printf("\n"); } voidmenuselect(SqListL) { intk,i,done=1; ElemTypee; while(done) { menu(); printf("Pleasechoose: "); scanf("%d",&k); getchar(); switch(k) { case1: Print_Sq(L); break; case2: { printf("\nInputthelocationanddatayouwanttoInsert: "); scanf("%d,%d",&i,&e); if(ListInsert_Sq(L,i,e)==ERROR)printf("Insertlocationisnotcorrect! \n"); break; } case3: { printf("\nInputthelocationyouwanttodeletedata: "); scanf("%d",&i); if(ListDelete_Sq(L,i,e)==ERROR) printf("Deletelocationisnotexit! \n"); else printf("\nDeletedatais%d.",e); break; } case4: { printf("\nInputthedatayouwanttofind: "); scanf("%d",&e); if(LocateElem_Sq(L,e)! =FALSE) printf("\nData%dlocationintheSequentialListis%d.",e,LocateElem_Sq(L,e)); else printf("\nData%disnotintheSequentialList.\n",e); break; } case5: Clearlist_Sq(L); break; case6: done=0; } } } voidmain() { ElemTypee; SqListLa; intn,i; system("CLS"); Initlist_Sq(La); printf("InputanumberoftheelementintheSequentialList(n<=%d): ",LIST_INIT_SIZE); scanf("%d",&n); printf("Entertheseelements: "); for(i=1;i<=n;i++) { scanf("%d",&e); ListInsert_Sq(La,i,e); } menuselect(La); getchar(); } 五、实验结果与讨论 1、运行结果 2、总结 1).函数指针的使用: 定义了e为指针,则应定义另外一个指针变量来访问顺序表的节点,进而修改。 2).使用函数system("CLS");需要包含一个头文件#include 3).用TypedefintElemType之后,定义数据类型直接用ElemType,这样需要改变数据类型是只需改变Typedef****ElemType即可,****为需要改变为什么类型的数据。 4).疑问: 在写ClearList_Sq函数时,直接使用memset函数会出错。 出错时提示,数据类型不一致。 5)体会 数据结构是个抽象的东西,对于刚刚接触的我来说,无疑是个挑战;开始的时候对着书本也难看懂,但后来经过请教老师朋友后,在加上自己的琢磨后对它有了点感觉,于是着手编写顺序表,开始时候对着书本来写是完全不行的,因为都是伪代码。 通过网上查找资料后,有更深的理解,最终达到了实验的效果! 实验二单链表基本操作的实现 一、实验目的 1、掌握链表的概念,学会对聊表进行操作。 2、加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。 二、实验要求 熟悉书本基本知识,并能运用相应的函数。 三、实验内容 1、编写链表基本操作函数 (1)、初始化链表CreateList(LinkList&L) (2)、向链表指定位置插入元素InsertList(LinkList&L) (3)、删除指定元素值的链表记录DeleteList(LinkList&L) (4)、查找链表中的元素Locate(LinkListL) (5)、求链表长度LengthList(LinkListL) (6)、删除重复结点Deleterepeat(LinkList&L) (7)、删除数值为偶数的结点DeleteEven(LinkList&L) (8)、变为循环链表Rotate(LinkList&L) (9)、分解成两个链表Divide(LinkList&L) (10)、输出链表PrintList(LinkListL) 2、在主函数中调用上述函数,实现相应的功能! 四、实验步骤 1、这是一个带头结点的线性链表,数据域存放整形数据,由用户输入。 头结点数据域存链表长度,所以程序中有个求链表长度的函数intLengthList(LinkListL);//求链表长度,L是指向头结点的指针,将长度值存入语句为: L->data=LengthList(L)。 2、编写主函数和各种操作函数,这些基本操作的实现算法都比较简单,有些跟书本上一样,有些需要自己稍作思考才能写出,具体程序见第三部分(程序源代码)。 3、程序源代码: #include #include typedefstructLNode//链表结点 { intdata; structLNode*next; }LNode,*LinkList; intover_flag=0;//主函数结束标识符 voidCreateList(LinkList&L);//创建链表 voidLocate(LinkListL);//查询数值 voidInsertList(LinkList&L);//插入数值 voidDeleteList(LinkList&L);//选择删除 voidDeleterepeat(LinkList&L);//删除重复结点 voidDeleteEven(LinkList&L);//删除数值为偶数的结点 voidRotate(LinkList&L);//变为循环链表 voidDivide(LinkList&L);//分解成两个链表 intLengthList(LinkListL);//求链表长度 voidPrintList(LinkListL);//输出链表 voidmain(void)//主函数 { charoperate; LinkListL; intn; for(n=0;n<40;n++) { printf("**********************************************************************\n"); printf("输入字符选择链表操作类型\nA: 创建B: 查询C: 插入D: 选择删除\nE: 删除重复F: 删除偶数G: 变为循环链表H: 分解为两个链表\n"); printf("**********************************************************************\n"); label: scanf("%c",&operate); switch(operate) { case'a': case'A': CreateList(L); break; case'b': case'B': Locate(L); break; case'c': case'C': InsertList(L);break; case'd': case'D': DeleteList(L); break; case'e': case'E': Deleterepeat(L); break; case'f': case'F': DeleteEven(L); break; case'g': case'G': Rotate(L);break; case'h': case'H': Divide(L); break; case'\n': gotolabel;//排除换行键的影响 default: printf("输入有误,请重新输入! \n"); break; } if(over_flag)return; } } voidCreateList(LinkList&L)//创建链表 { inttemp; printf("创建链表: \n请输入创建链表所需的整数值(以-1结束): "); L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; LinkListq=L; scanf("%d",&temp); while(temp! =-1) { LinkListp; p=(LinkList)malloc(sizeof(LNode)); p->data=temp; p->next=NULL; q->next=p; q=q->next; scanf("%d",&temp); } L->data=LengthList(L); PrintList(L); } voidLocate(LinkListL)//查询元素 { if(! L) printf("错误: 链表未创建! "); intelement; printf("查询数值: \n输入要查询的数值: "); scanf("%d",&element); LinkListp=L->next; inti=1; while(p) { if(p->data==element) { printf("找到了,它是链表的第%d个元素。 \n",i); return; } p=p->next; i++; } printf("找不到。 \n"); } voidInsertList(LinkList&L)//插入数值 { intx,i; printf("插入数值: \n输入要插入的数值和插入的位置: "); scanf("%d",&x); scanf("%d",&i); LinkListp=L; intj=0; while(p&&j { p=p->next; ++j; } if(! p||j>i-1) { printf("输入位置错误! "); return; } LinkLists=(LinkList)malloc(sizeof(LNode)); s->data=x; s->next=p->next; p->next=s; L->data=LengthList(L); PrintList(L); } voidDeleteList(LinkList&L)//选择位置删除节点 { inti; LinkListp=L; printf("选择位置删除结点: \n输入要删除数值的位置: "); scanf("%d",&i); intj=0; while(p->next&&j { p=p->next; ++j; } if(! (p->next)||j>i-1) { printf("输入位置错误! "); return; } LinkListq=p->next; p->next=q->next; free(q); L->data=LengthList(L); PrintList(L); } voidDeleterepeat(LinkList&L)//删除重复结点 { printf("删除重复结点后的链表为: \n"); intn=1; inta[20]; LinkListq=L->next; LinkListp=q->next; a[0]=q->data; while(p) { for(inti=0;i { if(p->data==a[i]) { LinkListr=p; q->next=p->next; p=p->next; free(r); break; } } if(i==n) { a[n++]=p->data; p=p->next; q=q->next; } } L->data=LengthList(L); PrintList(L); } voidDeleteEven(LinkList&L)//删除数值为偶数的结点 { printf("删除偶数结点后的链表为: \n"); LinkListq=L; LinkListp=L->next; while(p) { if(p->data%2==0) { LinkListr=p; q->next=p->next; p=p->next; free(r); } else { p=p->next; q=q->next; } } L->data=LengthList(L); PrintList(L); } voidRotate(LinkList&L)//变为循环链表 { printf("变为循环链表: \n"); LinkListp=L; while(p->next)p=p->next; p->next=L; LinkListt=L->next; printf("长度: %d\t",L->data); printf("各个结点数值为: "); while(t! =L) { printf("%d\t",t->data); t=t->next; } printf("\n"); printf("已经变为循环链表,其他操作将受影响,程序结束! \n"); over_flag=1; } voidDivide(LinkList&L)//分解成两个链表 { printf("分解成两个链表: \n"); LinkListA=L; LinkListB=(LinkList)m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告