数据结构实验报告范例.docx
- 文档编号:9408253
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:25
- 大小:82.84KB
数据结构实验报告范例.docx
《数据结构实验报告范例.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告范例.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构实验报告范例
线性表实验报告
实验名称:
线性表验证试验
实验类型:
验证试验
班级:
学号:
姓名:
先建桃
实验日期:
2011.3.15
1.问题描述
(1)顺序表
●顺序表的C语言描述
●基本运算的算法——置空表、求表的长度、取结点、定位运算、插入运算、删除运算、建立顺序表、输出顺序表
(2)链表
●单链表的C语言描述
●基本运算的算法——置空表、求表的长度、取结点、定位运算、插入运算、删除运算、建立不带头结点的单链表(头插入法建表)、建立带头结点的单链表(尾插入法建表),输出带头结点的单链表
2.数据结构设计
顺序表数据结构,如下:
typedefstruct{
elemtype*elem;//储存空间基址//
intlength;//当前长度//
intlistsize;//当前分配的储存容量//
}Sqlist;
链表数据结构,如下:
3.算法设计
1.1顺序表常用算法描述:
//顺序表初始化//
voidinitlist(Sqlist*L)
{
L->elem=(elemtype*)malloc(LIST_INT_SIZE*sizeof(elemtype));
if(!
L->elem)exit(EXIT_FAILURE);
L->length=0;
L->listsize=LIST_INT_SIZE;
}
//顺序表置空//
voidclearlist(Sqlist*L)
{
if(L->length!
=0)
{L->length=0;
L->listsize=LIST_INT_SIZE;
}
}
//求顺序表长度//
intlistlength(Sqlist*L)
{
returnL->length;
}
//取出顺序表第i个元素//
intgetlist(Sqlist*L,inti,elemtype*e)
{
if(i<1||i>L->length)return0;
else*e=L->elem[i];
}
//返回顺序表中第一个与e相等元素的位置//
intlocateelem(Sqlist*L,elemtypee)
{
inti;
for(i=0;i
{
if(L->elem[i]==e)
break;
}
returni+1;
}
//在第i个位置插入元素e//
elemtypelistinsert(Sqlist*L,inti,elemtypee)
{
elemtype*q;
elemtype*p;
if(i<1||i>L->length+1)return0;
if(L->length>=L->listsize)
{
elemtype*newbase=(elemtype*)realloc(L->elem,(L->listsize+LIST)*sizeof(elemtype));
if(!
newbase)exit(EXIT_FAILURE);
L->elem=newbase;
L->listsize+=LIST;
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L->length;
return1;
}
//删除第i个元素//
intlistdelete(Sqlist*L,inti,elemtype*e)
{
elemtype*q;
elemtype*p;
if(i<1||(i>L->length))return0;
p=&(L->elem[i-1]);
*e=*p;
q=L->elem+L->length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L->length;
return1;
}
//输出线性表所有元素//
intlistlransver(Sqlist*L)
{
inti;
if(L->length==0)
{
printf("表为空\n");
return0;
}
else
{
for(i=0;i
{
printf("%d",L->elem[i]);
}
printf("\n");
}
return1;
}
2.链表常用算法设计:
/*构造一个空的线性表L*/
voidInitList(LinkList*L)
{
*L=(LinkList)malloc(sizeof(structLNode));
if(!
*L)
exit(OVERFLOW);
(*L)->next=NULL;
}
/*线性表置空*/
voidClearList(LinkListL)/*不改变L*/
{
LinkListp,q;
p=L->next;/*p指向第一个结点*/
while(p)/*没到表尾*/
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;/*头结点指针域为空*/
}
/*求线性表长度*/
intListLength(LinkListL)
{
inti=0;
LinkListp=L->next;/*p指向第一个结点*/
while(p)/*没到表尾*/
{
i++;
p=p->next;
}
returni;
}
/*返回第i个元素*/
StatusGetElem(LinkListL,inti,ElemType*e)
{
intj=1;/*j为计数器*/
LinkListp=L->next;/*p指向第一个结点*/
while(p&&j
{
p=p->next;
j++;
}
if(!
p||j>i)returnERROR;/*第i个元素不存在*/
*e=p->data;/*取第i个元素*/
returnOK;
}
/*返回第一个与e相等元素的位置*/
intLocateElem(LinkListL,ElemTypee)
{
inti=0;
LinkListp=L->next;
while(p)
{
i++;
if(p->data==e)/*找到这样的数据元素*/
returni;
p=p->next;
}
return0;
}
/*在带头结点的单链线性表L中第i个位置之前插入元素e*/
StatusListInsert(LinkListL,inti,ElemTypee)
{
intj=0;
LinkListp=L,s;
while(p&&j { p=p->next; j++; } if(! p||j>i-1)returnERROR;/*i小于1或者大于表长*/ s=(LinkList)malloc(sizeof(structLNode));/*生成新结点*/ s->data=e;/*插入L中*/ s->next=p->next; p->next=s; returnOK; } /*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/ StatusListDelete(LinkListL,inti,ElemType*e) { intj=0; LinkListp=L,q; while(p->next&&j { p=p->next; j++; } if(! p->next||j>i-1)/*删除位置不合理*/ returnERROR; q=p->next;/*删除并释放结点*/ p->next=q->next; *e=q->data; free(q); returnOK; } /*建立带头结点的单链表*/ voidCreatList(LinkListL,intn) { inti; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=n;i>0;--i) { LinkListp=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=L->next; L->next=p; } } /*输出带头结点的单链表*/ voidListPrint(LinkListL) { LinkListp=L->next; if(! p)printf("线性表为空"); while(p) { printf("%d",p->data); p=p->next; } printf("\n"); } 4.界面设计 5.运行、测试与分析 (1)线性表运行结果: 图1.1线性表运行结果 2.链表运行结果: 图1.2链表运行结果 6.实验收获及思考 7.源代码: 1顺序表源代码 : /*顺序表常见算法*/ #defineLIST_INT_SIZE100 #defineLIST10 typedefintelemtype; #include #include typedefstruct{ elemtype*elem;//储存空间基址// intlength;//当前长度// intlistsize;//当前分配的储存容量// }Sqlist; //顺序表初始化// voidinitlist(Sqlist*L) { L->elem=(elemtype*)malloc(LIST_INT_SIZE*sizeof(elemtype)); if(! L->elem)exit(EXIT_FAILURE); L->length=0; L->listsize=LIST_INT_SIZE; } //顺序表置空// voidclearlist(Sqlist*L) { if(L->length! =0) {L->length=0; L->listsize=LIST_INT_SIZE; } } //求顺序表长度// intlistlength(Sqlist*L) { returnL->length; } //取出顺序表第i个元素// intgetlist(Sqlist*L,inti,elemtype*e) { if(i<1||i>L->length)return0; else*e=L->elem[i]; } //返回顺序表中第一个与e相等元素的位置// intlocateelem(Sqlist*L,elemtypee) { inti; for(i=0;i { if(L->elem[i]==e) break; } returni+1; } //在第i个位置插入元素e// elemtypelistinsert(Sqlist*L,inti,elemtypee) { elemtype*q; elemtype*p; if(i<1||i>L->length+1)return0; if(L->length>=L->listsize) { elemtype*newbase=(elemtype*)realloc(L->elem,(L->listsize+LIST)*sizeof(elemtype)); if(! newbase)exit(EXIT_FAILURE); L->elem=newbase; L->listsize+=LIST; } q=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; *q=e; ++L->length; return1; } //删除第i个元素// intlistdelete(Sqlist*L,inti,elemtype*e) { elemtype*q; elemtype*p; if(i<1||(i>L->length))return0; p=&(L->elem[i-1]); *e=*p; q=L->elem+L->length-1; for(++p;p<=q;++p) *(p-1)=*p; --L->length; return1; } //输出线性表所有元素// intlistlransver(Sqlist*L) { inti; if(L->length==0) { printf("表为空\n"); return0; } else { for(i=0;i { printf("%d",L->elem[i]); } printf("\n"); } return1; } //程序测试 intmain() { inti,k; elemtypee; elemtypetest[5]={5,4,3,2,1}; SqlistL; //初始化线性表 initlist(&L); //在表头插入5个元素 for(i=0;i<5;i++) listinsert(&L,1,test[i]); //输出所有元素 listlransver(&L); //求表长度 k=listlength(&L); printf("现在表的长度是: %d\n",k); //取出顺序表第4个元素 k=getlist(&L,4,&e); printf("取出的第4元素是: %d\n",k); //返回顺序表中第一个与2相等元素的位置 k=locateelem(&L,2); printf("第一个与2相等的位置是: %d\n",k); //删除第3个元素 listdelete(&L,3,&e); printf("被删除的元素: %d\n",e); //输出所有元素 printf("删除后的元素: "); listlransver(&L); //置空表 clearlist(&L); printf("打印置空之后的顺序表的结果: \n"); listlransver(&L); return; } 2.链表源代码: #include #include #include #defineElemTypeint #defineStatusint #defineTRUE1 #defineOK1 #defineFALSE0 #defineERROR-1 typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*LinkList; /*构造一个空的线性表L*/ voidInitList(LinkList*L) { *L=(LinkList)malloc(sizeof(structLNode)); if(! *L) exit(OVERFLOW); (*L)->next=NULL; } /*线性表置空*/ voidClearList(LinkListL)/*不改变L*/ { LinkListp,q; p=L->next;/*p指向第一个结点*/ while(p)/*没到表尾*/ { q=p->next; free(p); p=q; } L->next=NULL;/*头结点指针域为空*/ } /*求线性表长度*/ intListLength(LinkListL) { inti=0; LinkListp=L->next;/*p指向第一个结点*/ while(p)/*没到表尾*/ { i++; p=p->next; } returni; } /*返回第i个元素*/ StatusGetElem(LinkListL,inti,ElemType*e) { intj=1;/*j为计数器*/ LinkListp=L->next;/*p指向第一个结点*/ while(p&&j { p=p->next; j++; } if(! p||j>i)returnERROR;/*第i个元素不存在*/ *e=p->data;/*取第i个元素*/ returnOK; } /*返回第一个与e相等元素的位置*/ intLocateElem(LinkListL,ElemTypee) { inti=0; LinkListp=L->next; while(p) { i++; if(p->data==e)/*找到这样的数据元素*/ returni; p=p->next; } return0; } /*在带头结点的单链线性表L中第i个位置之前插入元素e*/ StatusListInsert(LinkListL,inti,ElemTypee) { intj=0; LinkListp=L,s; while(p&&j { p=p->next; j++; } if(! p||j>i-1)returnERROR;/*i小于1或者大于表长*/ s=(LinkList)malloc(sizeof(structLNode));/*生成新结点*/ s->data=e;/*插入L中*/ s->next=p->next; p->next=s; returnOK; } /*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/ StatusListDelete(LinkListL,inti,ElemType*e) { intj=0; LinkListp=L,q; while(p->next&&j { p=p->next; j++; } if(! p->next||j>i-1)/*删除位置不合理*/ returnERROR; q=p->next;/*删除并释放结点*/ p->next=q->next; *e=q->data; free(q); returnOK; } /*建立不带头结点的单链表 LinkListCreat_LinkList(LinkListL,LinkLists,intx) { LinkListtmp; tmp=(LinkList)malloc(sizeof(LNode)); tmp->data=x; tmp->next==s? s->next: L; returntmp; }*/ /*建立不带头结点的单链表 LinkListCreat_LinkList(LinkListhead,intnum) { LinkListp,tail; head=tail=NULL; p=(LinkList)malloc(sizeof(LinkList)); if(p==NULL) { printf("申请内存失败: \n"); returnNULL; } p->data=num; p->next=NULL; if(head==NULL) head=p; else tail->next=p; tail=p; returnhead; }*/ /*建立带头结点的单链表*/ voidCreatList(LinkListL,intn) { inti; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=n;i>0;--i) { LinkListp=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=L->next; L->next=p; } } /*输出带头结点的单链表*/ voidListPrint(LinkListL) { LinkListp=L->next; if(! p)printf("线性表为空"); while(p) { printf("%d",p->data); p=p->next; } printf("\n"); } // voidprintInt(intdata) { printf("%d",data); } //程序测试 intmain() { LinkListL,Q,S; ElemTypee; inti,k; inttest[5]={5,4,3,2,1}; /*构造一个空的线性表L*/ Init
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 范例