数据结构实验参考.docx

上传人:b****8 文档编号:29892511 上传时间:2023-08-03 格式:DOCX 页数:60 大小:69.10KB
下载 相关 举报
数据结构实验参考.docx_第1页
第1页 / 共60页
数据结构实验参考.docx_第2页
第2页 / 共60页
数据结构实验参考.docx_第3页
第3页 / 共60页
数据结构实验参考.docx_第4页
第4页 / 共60页
数据结构实验参考.docx_第5页
第5页 / 共60页
点击查看更多>>
下载资源
资源描述

数据结构实验参考.docx

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

数据结构实验参考.docx

数据结构实验参考

数据结构

实验一顺序表的基本操作

实验目的:

1.熟悉C语言上机环境,进一步掌握C语言结构特点

2.掌握顺序表的逻辑结构和定义

3.掌握顺序表的生成、插入、删除和查找等基本运算

实验要求:

1.完成算法设计和程序设计,并上机调试通过

2.完成实验报告,提供实验数据和结果

3.对插入和删除算法进行时间复杂度的估算

实验内容:

实现顺序表的基本操作,使得对于线性表(6,9,14,23,28,50),实现以下功能:

1.从键盘依次往顺序表中输入数据

2.在第3位插入数值10,输出顺序表

3.删除第4位数值,输出整个顺序表.

4.查找表中是否有数据24,有则返回其位置

5.输出线性表中第i个元素的值,位序i由用户通过键盘输入

请在实验中完成以下函数定义:

PSeqListInit_SeqList()//初始化顺序表

intLength_List(SeqListL)//求顺序表长

voidDisp_List(SeqListL)//输出顺序表

intLocate_List(SeqListL,ElemTypex)//在顺序表中检索查找x

intInsert_List(PSeqListPL,inti,ElemTypex)//向表中第i个元素前插入新元素x

intDelete_List(PSeqListPL,inti)//删除第i个元素

voidCreat_List(PSeqListPL)//向顺序表中输入数据

voidShowSelect();//显示用户提示界面

运行后,用户界面如下:

思考题:

1.函数调用时,实参何时使用取内容运算符*,何时使用取地址运算符&?

2.试编写一个算法,可以删除顺序表中从第i个元素起的k个元素。

在程序中实现算法并完成调用。

参考代码1(秦锋格式定义):

/*线形表的顺序存储,用指针做参数传递,顺序表采用数组存储,定义参考秦锋《数据结构》中定义格式*/

#include

#include

#defineMAXSIZE50

#defineFALSE0

#defineTRUE1

/*数据元素类型ElemType为int型*/

typedefintElemType;

/*定义顺序表类型SeqList及指向顺序表的指针PSeqList*/

typedefstruct

{

ElemTypedata[MAXSIZE];/*存放线性表的数组*/

intlength;/*length是顺序表的长度*/

}SeqList,*PSeqList;

/*初始化顺序表*/

PSeqListInit_SeqList()

{

PSeqListPL;

PL=(PSeqList)malloc(sizeof(SeqList));

if(PL!

=NULL)

PL->length=0;

else

printf("outofspace!

\n");

return(PL);

}

/*清空顺序表*/

SeqListClear_List(SeqListL)

{

L.length=0;

returnL;

}

/*求顺序表长度*/

intLength_List(SeqListL)

{

return(L.length);

}

/*遍历输出顺序表*/

voidDisp_List(SeqListL)

{

inti;

if(L.length==0)

printf("顺序表为空\n");

else

{

printf("顺序表中元素为:

\n");

for(i=0;i

printf("%d\t",L.data[i]);

printf("\n");

}

}

/*检索查找,在线性表中查找元素x,并返回其位置,若查找不成功,则返回0*/

intLocate_List(SeqListL,ElemTypex)

{

inti=0;

while(i

=x)

i++;

if(i>=L.length)

return0;

else

return(i+1);

}

/*向顺序表第i个元素前插入元素x,插入成功返回1,不成功返回0*/

intInsert_List(PSeqListPL,inti,ElemTypex)

{

intj;

if(!

PL)

{

printf("顺序表不存在!

");

return0;

}

if(i<1||i>PL->length+1)

{printf("插入位置不正确!

\n");

return0;

}

for(j=PL->length-1;j>=i-1;j--)

PL->data[j+1]=PL->data[j];

PL->data[i-1]=x;

PL->length++;

return1;

}

/*在线性表中插入元素x,使得线性表仍然有序*/

intinsert(PSeqListPL,ElemTypex)

{

inti,j;

i=PL->length-1;

while(xdata[i])

i--;

for(j=PL->length-1;j>i;j--)

PL->data[j+1]=PL->data[j];

PL->data[i+1]=x;

PL->length++;

return1;

}

/*删除线性表中第i个元素,成功删除元素,返回1,否则返回0*/

intDelete_List(PSeqListPL,inti)

{

intj;

if(!

PL)

{

printf("顺序表不存在!

");

return0;

}

if(i<1||i>PL->length)

{printf("删除位置不正确!

\n");

return0;

}

for(j=i;j<=PL->length-1;j++)

PL->data[j-1]=PL->data[j];

PL->length--;

return1;

}

/*删除线性表中从第i个元素起k个元素*/

intdelk(PSeqListL,inti,intk)

{

intj;

if(i<0||i+k-1>L->length)

{

printf("error!

");

return0;

}

else

{

for(j=i+k-1;jlength;j++)

L->data[j-k]=L->data[j];

L->length=L->length-k;

return1;

}

}

/*向顺序表中顺序输入元素*/

voidCreat_List(PSeqListPL)

{inti;

printf("输入数据不得超过50个!

\n");

printf("输入顺序表中元素个数:

\n");

scanf("%d",&PL->length);

for(i=1;i<=PL->length;i++)

{printf("inputthe%dnumber:

",i);

scanf("%d",&PL->data[i-1]);

}

}

/*显示选择提示信息函数*/

voidShowSelect()

{printf("\n请选择要执行的操作:

\n");

printf("-------------------------\n");

printf("1----初始化\n");

printf("2----为顺序表输入元素\n");

printf("3----求顺序表长度\n");

printf("4----遍历输出顺序表\n");

printf("5----在顺序表中检索查找\n");

printf("6----向顺序表中插入元素\n");

printf("7----从顺序表中删除元素\n");

printf("0----退出\n");

printf("-------------------------\n");

printf("pleaseinputnumber0~~7\n\n");

}

intmain(void)

{PSeqListPL=NULL;

inti,x,flag;

intlen;/*表示顺序表长*/

intselect;/*select变量表示用户的选择项*/

ShowSelect();

scanf("%d",&select);

while(select!

=0)

{switch(select)

{case1:

PL=Init_SeqList();break;

case2:

Creat_List(PL);break;

case3:

len=Length_List(*PL);printf("顺序表长为%d\n",len);break;

case4:

Disp_List(*PL);break;

case5:

printf("\n请输入你想查找的数据:

");

scanf("%d",&x);

flag=Locate_List(*PL,x);

if(flag)

printf("该元素在顺序表中的位置是:

%d\n",flag);

else

printf("该元素在顺序表中不存在");

break;

case6:

printf("请输入要插入的元素的值和位置,用空格分隔:

\n");

scanf("%d%d",&x,&i);

flag=Insert_List(PL,i,x);

if(flag)printf("插入操作成功");

break;

case7:

printf("请输入要删除的元素的位置:

\n");

scanf("%d",&i);

flag=Delete_List(PL,i);

if(flag)printf("删除操作成功");

break;

}

ShowSelect();

scanf("%d",&select);

}

}

实验二链表的基本操作

实验目的:

1.进一步熟悉C语言上机环境,进一步掌握C语言结构特点

2.掌握单链表的逻辑结构和定义

3.掌握单链表的生成、插入、删除和查找等基本运算

实验要求:

1.完成算法设计和程序设计,并上机调试通过

2.完成实验报告,提供实验数据和结果

3.对插入和删除算法进行时间复杂度的估算

实验内容:

实现单链表的基本操作,使得对于线性表(6,9,14,23,28,50),实现以下功能:

1.从键盘依次往顺序表中输入数据

2.在第3位插入数值10,输出顺序表

3.删除第4位数值,输出整个顺序表.

4.查找表中是否有数据24,有则返回其位置

5.输出线性表中第i个元素的值,位序i由用户通过键盘输入

请在实验中完成以下函数定义并调用它们:

LinkListInit_LinkList()//初始化单链表

voidCreat_List(LinkListL,intn)//按逆序产生一个链表长度为n

intLength_List(LinkListL)//求单链表表长

voidDisp_List(LinkListL)//依次输出单链表中元素

//在单链表中检索查找x,找不到返回0,否则返回在线性表中的位序

intLocate_List(LinkListL,ElemTypex)

//向表中第i个元素前插入新元素x

intInsert_List(LinkListL,inti,ElemTypex)

//删除单链表中第i个元素

intDelete_List(LinkListL,inti)

//实现单链表的逆置

voidReverse_LinkList(LinkListL)

用户界面如图:

实验小结及思考:

1.总结单链表结构特点

2.试编写算法,在一个带头结点的单链表中删除最小值结点

参考代码

/*单链表结构定义各书差不多,只名称有区别,本程序名称定义按秦峰版*/

/*本程序为带头结点单链表*/

#include

#include

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineNull0

typedefintElemType;

typedefstructLNode

{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

/*初始化单链表,即产生一个带头结点的空表,创建成功则返回空表的头指针*/

LinkListInit_List(void)

{

LinkListL;

L=(LinkList)malloc(sizeof(LNode));

if(L)

L->next=NULL;//产生空表,头结点的next域为空

returnL;

}

/*按逆序产生一个长度为n链表,参数为初始化的空链表,及线性表长度n*/

/*每个元素依次插入在头结点后*/

intCreate_List(LinkListL,intn)

{inti;

LinkLists;/*s变量用于保存新结点地址*/

printf("生成有%d个元素的线性表:

\n",n);

for(i=n;i>0;i--)

{printf("请输入线性表中第%d个元素:

\n",i);/*逆序输入元素*/

s=(LinkList)malloc(sizeof(LNode));

if(!

s)

{

printf("创建结点不成功\n");

return0;

}

scanf("%d",&s->data);

s->next=L->next;

L->next=s;

}

return1;

}

/*求单链表表长,返回L中数据元素个数*/

intLength_List(LinkListL)

{

inti=0;

LinkListp=L->next;

while(p)

{

i++;

p=p->next;

}

returni;

}

/*当按位置查找元素,第i个元素存在时,其值赋给e并返回1,否则返回0*/

intGetElem_List(LinkListL,inti,ElemType*e)

{

intj=0;

LinkListp=L;

while(p&&j

{

p=p->next;

j++;

}

if(!

p||j>i)

{printf("链表不存在或参数i错");

return0;

}

*e=p->data;/*取第i个元素*/

return1;

}

/*按元素查找,查找链表中是否存在值为e的元素,存在,则返回L中第一个e元素的位序,若不存在,则返回值为0*/

intLocate_List(LinkListL,ElemTypee)

{

inti=0;

LinkListp=L;

while(p&&p->data!

=e)

{p=p->next;

i++;

}

if(p)

returni;

else

return0;

}

/*在带头结点的单链线性表L中第i个位置之前插入元素e*/

intInsert_List(LinkListL,inti,ElemTypee)

{

intj=0;

LinkListp=L,s;

while(p&&j

{

p=p->next;

j++;

}

if(!

p||j>i-1)

returnERROR;

s=(LinkList)malloc(sizeof(structLNode));

s->data=e;

s->next=p->next;

p->next=s;

returnOK;

}

intDelete_List(LinkListL,inti,ElemType*e)/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/

{

intj=0;

LinkListp=L,q;

while(p->next&&j

{

p=p->next;

j++;

}

if(!

p->next||j>i-1)

return0;

q=p->next;

p->next=q->next;

*e=q->data;

free(q);

return1;

}

intDisp_List(LinkListL)/*显示单链表*/

{

LinkListp=L->next;

if(p==Null)printf("单链表为空表");

else

{printf("输出单链表:

\n");

while(p!

=Null)

{printf("%d",p->data);

printf("->");

p=p->next;

}

}

printf("\n");

return1;

}

/*以下函数为作业中常见练习,不是基本操作,也未在主函数中调用*/

/*删除单链表中多余的元素值相同的结点*/

voidDelRepeat_List(LinkListL)

{

LinkListp,h,pre;

h=L->next;

if(h==NULL)

{

printf("是一个空表");

return;

}

p=L->next->next;

if(p==NULL)

{

printf("表中只有一个结点");

return;

}

while(h->next!

=NULL)

{pre=h;

p=pre->next;

while(p)

{if(h->data==p->data)

{

pre->next=p->next;

free(p);

p=pre->next;

}

else

{

pre=p;

p=p->next;

}

}

h=h->next;

}

}

/*显示选择提示信息函数*/

voidShowSelect()

{printf("\n请选择要执行的操作:

\n");

printf("-------------------------\n");

printf("1----初始化\n");

printf("2----逆序输入元素\n");

printf("3----求单链表长度\n");

printf("4----遍历输出顺序表\n");

printf("5----在单链表中检索查找\n");

printf("6----向单链表中插入元素\n");

printf("7----从单链表中删除元素\n");

printf("0----退出\n");

printf("-------------------------\n");

printf("pleaseinputnumber0~~7\n\n");

}

intmain(void)

{LinkListPL=NULL;

inti,x,flag;

intlen;/*表示单链表长*/

intselect;/*select变量表示用户的选择项*/

ShowSelect();

scanf("%d",&select);

while(select!

=0)

{switch(select)

{case1:

PL=Init_List();break;

case2:

printf("请输入线性表中元素个数:

\n");scanf("%d",&len);Create_List(PL,len);break;

case3:

len=Length_List(PL);printf("单链表表长为%d\n",len);break;

case4:

Disp_List(PL);break;

case5:

printf("\n请输入你想查找的数据:

");

scanf("%d",&x);

i=Locate_List(PL,x);

if(flag)

printf("该元素在顺序表中的位置是:

%d\n",i);

else

printf("该元素在顺序表中不存在");

break;

case6:

printf("请输入要插入的元素的值和位置,用空格分隔:

\n");

scanf("%d%d",&x,&i);

flag=Insert_List(PL,i,x);

if(flag)printf("插入操作成功");

break;

case7:

printf("请输入要删除的元素的位置:

\n");

scanf("%d",&i);

flag=Delete_List(PL,i,&x);

if(flag)printf("删除操作成功");

break;

case8:

DelRepeat_List(PL);

}

ShowSelect();

scanf("%d",&select);

}

}

实验三线性表的应用----稀疏多项式计算器

(vc环境,&符号)

#include

#include

#defineNull0

typedefstructLNode/*项的表示,多项式的项作为LinkList的数据元素*/

{

intcoef;/*系数*/

intexpn;/*指数*/

structLNode*next;

}LNode,*LinkList;

typedefLinkListpolynomial;/*用带有表头结点的有序链表表示多项式*/

voidCreatePolyn(polynomial&L)/*按尾插法产生一个n项多项式*/

{inti,n;

polynomialp,s;

L=(polynomial)malloc(sizeof(LNode));

L->next=Null;

p=L;

printf("请输入该多项式的总项数:

\n");

scanf("%d",&n);

for(i=1;i<=n;i++)

{printf("输入第%d项系数,指数(用,号分隔)\n",i);

s=(polynomial

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

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

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