数据结构课后作业23.docx
《数据结构课后作业23.docx》由会员分享,可在线阅读,更多相关《数据结构课后作业23.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构课后作业23
实验报告(示例)
实验名称:
数据结构与算法
实验学期:
2012-2013
(1)
实验班级:
11物联
姓名:
所属学院:
计算机学院
指导教师:
二〇一二年九月十二日
广东技术师范学院实验报告(示例)
实验内容:
线性表及其操作
实验目的:
实验地点:
工业中心202
实验序号:
2
预习内容:
操作情况
实验中出现的主要问题和解决情况
未能在实验前对程序进行文本编辑,使得实验课时间主要花在程序编辑上,运行调试时间十分紧张,对程序算法整体的认识和功能分析没有时间进行,只是停留在将书上给定程序上机运行。
后面的实验需要做好实验前程序代码的预写准备,以提高效率。
结果:
运行正常,输出正确,达到实验目的
1.操作步骤
进入VC++6.0:
Windows[开始]→[程序]→[MicrosoftVisual6.0]
利用VC++6.0首先定义一个工程文件
[新建][选择类型win32ConsoleApplication][选择保存路径和文件名][确定][选择建立空工程文件]
在该工程文件中加入C++源文件
[新建][选择文件][选择C源文件][文件名][确定]
编辑该源文件(输入程序代码)
编译、连接(修改与调式)运行程序
在[MicrosoftVisual6.0]中选择[组建]→[编译]/[组建](连接)/[运行]
2.算法描述:
(包含函数:
)
/*文件名:
algo2-3.cpp*/
#include
#include
typedefcharElemType;
typedefstructDNode/*定义双链表结点类型*/
{
ElemTypedata;
structDNode*prior;/*指向前驱结点*/
structDNode*next;/*指向后继结点*/
}DLinkList;
voidInitList(DLinkList*&L)
{
L=(DLinkList*)malloc(sizeof(DLinkList));/*创建头结点*/
L->prior=L->next=NULL;
}
voidDestroyList(DLinkList*&L)
{
DLinkList*p=L,*q=p->next;
while(q!
=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
intListEmpty(DLinkList*L)
{
return(L->next==NULL);
}
intListLength(DLinkList*L)
{
DLinkList*p=L;inti=0;
while(p->next!
=NULL)
{
i++;
p=p->next;
}
return(i);
}
voidDispList(DLinkList*L)
{
DLinkList*p=L->next;
while(p!
=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
intGetElem(DLinkList*L,inti,ElemType&e)
{
intj=0;
DLinkList*p=L;
while(j
=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return0;
else
{
e=p->data;
return1;
}
}
intLocateElem(DLinkList*L,ElemTypee)
{
intn=1;
DLinkList*p=L->next;
while(p!
=NULL&&p->data!
=e)
{
n++;
p=p->next;
}
if(p==NULL)
return(0);
else
return(n);
}
intListInsert(DLinkList*&L,inti,ElemTypee)
{
intj=0;
DLinkList*p=L,*s;
while(j=NULL)
{
j++;
p=p->next;
}
if(p==NULL)/*未找到第i-1个结点*/
return0;
else/*找到第i-1个结点*p*/
{
s=(DLinkList*)malloc(sizeof(DLinkList));/*创建新结点*s*/
s->data=e;
s->next=p->next;/*将*s插入到*p之后*/
if(p->next!
=NULL)p->next->prior=s;
s->prior=p;
p->next=s;
return1;
}
}
intListDelete(DLinkList*&L,inti,ElemType&e)
{
intj=0;
DLinkList*p=L,*q;
while(j=NULL)
{
j++;
p=p->next;
}
if(p==NULL)/*未找到第i-1个结点*/
return0;
else/*找到第i-1个结点*p*/
{
q=p->next;/*q指向要删除的结点*/
if(q==NULL)return0;/*不存在第i个结点*/
p->next=q->next;/*从双链表中删除*q结点*/
if(p->next!
=NULL)p->next->prior=p;
free(q);/*释放*q结点*/
return1;
}
}
voidSort(DLinkList*&head)/*双链表元素排序*/
{
DLinkList*p=head->next,*q,*r;
if(p!
=NULL)/*若原双链表中有一个或以上的数据结点*/
{
r=p->next;/*r保存*p结点后继结点的指针*/
p->next=NULL;/*构造只含一个数据结点的有序表*/
p=r;
while(p!
=NULL)
{
r=p->next;/*r保存*p结点后继结点的指针*/
q=head;
while(q->next!
=NULL&&q->next->datadata)/*在有序表中找插入*p的前驱结点*q*/
q=q->next;
p->next=q->next;/*将*p插入到*q之后*/
if(q->next!
=NULL)q->next->prior=p;
q->next=p;
p->prior=q;
p=r;
}
}
}
voidCreateListR(DLinkList*&L,ElemTypea[],intn)
//由含有n个元素的数组a创建带头结点的双链表L
{
DLinkList*s,*r;inti;
L=(DLinkList*)malloc(sizeof(DLinkList));//创建头结点
L->prior=L->next=NULL;
r=L;//r始终指向尾结点,开始时指向头结点
for(i=0;i{
s=(DLinkList*)malloc(sizeof(DLinkList));
s->data=a[i];
r->next=s;s->prior=r;//将*s插入*r之后
r=s;//r指向*s结点
}
r->next=NULL;//尾结点next域置为NULL
}
voidmain()
{
DLinkList*h;chara[5],e;inti;
printf("
(1)初始化线性表h:
\n");
InitList(h);
printf("
(2)一次采用尾插法插入啊a,b,c,d,e元素\n");
for(i=0;i<5;i++)
{
scanf("%c",&a[i]);
}
CreateListR(h,a,5);
printf("(3)输入双链表h:
");
DispList(h);printf("\n");
printf("(4)输出双链表h长度%d\n",ListLength(h));
printf("(5)判断双链表h是否为空:
");
if(ListEmpty(h))
printf("空表");
else
printf("不为空");
printf("\n");
GetElem(h,3,e);
printf("(6)输出双链表h的第三个元素:
%c\n",e);
printf("(7)输出元素\"a\"的位置%d\n",LocateElem(h,'a'));
printf("(8)在第四个元素位置上插入\"f\"元素\n");
ListInsert(h,4,'f');
printf("(9)输出双链表h:
");
DispList(h);printf("\n");
printf("(10)删除h的第三个元素\n");
ListDelete(h,3,e);
printf("(11)输出双链表h:
");
DispList(h);printf("\n");
printf("(12)释放双链表h\n");
}
3.运行结果: