数据结构实验报告范例.docx

上传人:b****7 文档编号:9408253 上传时间:2023-02-04 格式:DOCX 页数:25 大小:82.84KB
下载 相关 举报
数据结构实验报告范例.docx_第1页
第1页 / 共25页
数据结构实验报告范例.docx_第2页
第2页 / 共25页
数据结构实验报告范例.docx_第3页
第3页 / 共25页
数据结构实验报告范例.docx_第4页
第4页 / 共25页
数据结构实验报告范例.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

数据结构实验报告范例.docx

《数据结构实验报告范例.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告范例.docx(25页珍藏版)》请在冰豆网上搜索。

数据结构实验报告范例.docx

数据结构实验报告范例

线性表实验报告

实验名称:

线性表验证试验

实验类型:

验证试验

班级:

学号:

姓名:

先建桃

实验日期:

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;ilength;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;ilength;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;ilength;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;ilength;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模板 > 可爱清新

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1