数据结构实验报告范例.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;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