武汉理工大学数据结构线性表实验报告.docx
《武汉理工大学数据结构线性表实验报告.docx》由会员分享,可在线阅读,更多相关《武汉理工大学数据结构线性表实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![武汉理工大学数据结构线性表实验报告.docx](https://file1.bdocx.com/fileroot1/2023-6/5/3fa512e0-4342-4920-bb7a-6807f17858ec/3fa512e0-4342-4920-bb7a-6807f17858ec1.gif)
武汉理工大学数据结构线性表实验报告
武汉理工大学理学院数学系课程实验报告
课程名称:
数据结构与算法
班级
数学类1402班
日期
2015年11月1日
成绩评定
姓名
明钊
实验室
老师签名
学号
0121414670211
实验名称
实验一线性表的设计与实现
所用软件
Visuac++6.0,word
实
验
目
的
及
内
容
实验目的:
掌握在visualc++下线性表的两种存储结构:
顺序存储和链式存储各自的编程框架;
实验内容:
掌握顺序表和单链表下建表、遍历、插入、删除、求前驱、求后继等算法的实现;
实
验
原
理
步
骤
、
一、实现顺序表的建立、插入数据、删除、遍历、求长度
各函数代码及解释如下:
StatusSqlistCreate(SqList&L,intlen)
//顺序表的建立函数:
从键盘接收数据,依次放入顺序表
{inti;
for(i=0;i{printf("请输入第%d个元素",i+1);
scanf("%d",&L.elem[i]);
}
return1;
L.length=len;
}
intListLength(SqListL)//求顺序表的长度
{printf("\n新表长度为%d",L.length);
returnL.length;
}
voidListPrintf(SqList&L,intlen)//顺序表的遍历
{
inti;
for(i=0;iprintf("%d\t",L.elem[i]);
}
StatusListInsert(SqList&L,inti,ElemTypee)//在第i个元素前插入元素e
{
ElemType*newbase,*q,*p;
if(i<1||i>L.length+1)
returnERROR;
if(L.length==L.listsize)
{newbase=(ElemType*)realloc(L.elem,
(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
if(!
newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LIST_INCREMENT;
}
q=L.elem+i-1;
for(p=L.elem+L.length-1;p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
ListPrintf(L,L.length);
ListLength(L);
returnOK;
}
StatusListDelete(SqList&L,inti,ElemType&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;
}
测试主程序如下:
Voidmain(void)
{SqListL;
InitList(L);
printf("初始化L后,L.length=%d,L.listsize=%d,L.elem=%u\n",L.length,
L.listsize,L.elem);
intlength;
printf("输入表的长度length=");
scanf("%d",&length);
ListCreate(L,length);
ListPrintf(L,length);
intn,m;
printf("\n请输入要插入的位置(第n个元素前)n=");
scanf("%d",&n);
printf("请输入要插入的数据m=");
scanf("%d",&m);
ListInsert(L,n,m);
inti,e;
printf("输入要删除的第i个元素i=");
scanf("%d",&i);
ListDelete(L,i,e);
}
实
验
结
果
及
分
析
:
二、单链表的建立与操作
各函数如下:
StatusCreateList_L(LinkList&L,intn)//用头插法建立一个长度为n的单链表
{
inti;LinkListp,s;
L->next=NULL;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;p=L;
for(i=n;i>0;i--)
{
s=(LinkList)malloc(sizeof(LNode));
printf("输入新节点:
");
scanf("%d",&s->data);
p->next=s;
p=p->next;p->next=NULL;
}
returnOK;
}
StatusListprintf(LinkList&L)//遍历函数
{
LinkListp=L;intlen=0,e;
p=p->next;
while(p)
{
len++;
e=p->data;
p=p->next;
printf("%d",e);
}
printf("该链表的长度为%d",len);
returnOK;
}
StatusListInsert(LinkList&L,inti,ElemTypee)//在第i个元素前插入一个元素e
{
intj=0;
LinkLists,p=L;
while(p&&j{j++;
p=p->next;
}
if(!
p||j>i-1)
returnERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
Listprintf(L);
returnOK;
}
StatusListdelete(LinkList&L,inti,ElemType&e)//删除第i个元素
{
intj;LinkListp,q;
p=L;j=0;
while(p->next&&jj++;p=p->next;
}//循环结束后,p指针指向第i-1个元素,而p->next指向第i个节点
if(!
(p->next)||j>i-1)return0;//删除位置不合理
q=p->next;p->next=q->next;e=q->data;
printf("删除的元素为%d",e);printf("\n");
free(q);
Listprintf(L);
returnOK;
}
StatusForewardElist(LinkList&L,inti,ElemType&v)//第i个元素的前驱
{
intj;LinkListp,q;
p=L;j=0;
if(i==1)return0;
while(p->next&&jj++;p=p->next;
}
if(!
(p->next)||j>i-2)return0;
q=p->next;p->next=q->next;
v=q->data;
printf("第%d个元素的前驱为v=%d",i,v);
returnOK;
}
StatusBackwardlist(LinkList&L,inti,ElemType&x)//第i个元素的后继
{
intj;LinkListp,q;
p=L;j=0;
while(p->next&&jj++;p=p->next;
}
if(!
(p->next)||j>i-1||p->next==NULL)return0;
q=p->next;p->next=q->next;
x=q->data;
printf("第%d个元素的后继为x=%d",i,x);
returnOK;
}
测试主函数如下:
Voidmain(void)
{LinkListL;
inta;
inti,j;
intm;
intk,l,v,x;
ElemTypee;
InitList(L);
printf("请输入初始链表的长度");
scanf("%d",&a);
CreateList_L(L,a);
Listprintf(L);
printf("要插入的位置(第i个元素前)i=");
scanf("%d",&i);printf("要插入的元素m=");scanf("%d",&m);
ListInsert(L,i,m);
printf("删除的位置(第j个元素)j=");scanf("%d",&j);
Listdelete(L,j,e);
printf("你要求的第i个元素的前驱");
scanf("%d",&k);
ForewardElist(L,k,v);
printf("你要求的第i个元素的后继");
scanf("%d",&l);
Backwardlist(L,l,x);
}
程序运行结果截图如下:
三:
实验结果分析
通过通过以上函数的编写,本人掌握了顺序表的建立、插入数据、删除、遍历、
求长度以及单链表的建立(头插法)、插入数据、删除、遍历、求第i个元素的前驱、第i个元素的后继、求长度的算法,在编程中,难点是数据的插入与删除,重点要掌握顺序表与单链表的建立以及元素的插入与删除的算法,注意语句的先后顺序,注意单链表中结点之间的关系.