数据结构实验一要求.docx
《数据结构实验一要求.docx》由会员分享,可在线阅读,更多相关《数据结构实验一要求.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构实验一要求.docx](https://file1.bdocx.com/fileroot1/2023-1/29/dd750e5e-9e9f-4604-aefe-68806daa9d26/dd750e5e-9e9f-4604-aefe-68806daa9d261.gif)
数据结构实验一要求
实验1:
线性表的顺序表示与链式表示
【实验目的】
1.加深理解线性表的顺序表示与链式表示的意义和区别,掌握用它们表示时各基本操作的设计与实现。
2.学会定义线性表的顺序存储类型和链式存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
3.掌握线性表的基本操作(初始化、建立、插入、删除、遍历等)。
4.掌握对多函数程序的输入、编辑、调试和运行过程。
5.进一步熟练C语言的使用,特别是指针和链表的使用。
6.能在实际应用背景下恰当选择顺序存储和链式存储。
【实验要求】
1.预习C语言中的结构的定义和基本操作方法
2.对线性表的每个基本操作用单独的函数实现
3.编写完整程序完成下面的实验内容并上机运行
4.整理并上交实验报告
【实验内容】
1.分别建立包含10个数据元素的顺序线性表和链式线性表;
2.从键盘输入一个数据元素和插入位置k,将元素插入到线性表中第k(包含0号位置)个位置;
3.从键盘输入一个数据元素关键字或位置k(包含1号位置),从线性表中删除相应数据元素;
4.能完成查找功能;
5.给出程序及插入、删除前和插入、删除后线性表结果。
【实验指导】顺序表示和链式表示可以分成两个程序来调试(见示例程序1和2)。
教材中的算法一般要作少许修改才能运行,这些修改包括:
1、算法函数中局部变量的定义,如ListInsert_Sq中的i,newbase,p,q等;
2、可能出现的“类”C语言的语句,必须改为C语言语句,如数据交换语句x>y;
3、如果采用TC作为C语言调试环境,算法函数的“引用”类型参数要改为指针类型参数并修改程序中的使用方法,如ListInsert_Sq中的参数&L要改为*L。
程序中使用L方法的修改见示例程序1。
一个简单程序通常主要由三部分构成:
1、常量定义(#define),类型定义(typedef)及函数原型定义(#include);
2、算法函数,即InitList_Sq、ListInsert_Sq、ListDelete_Sq等;
3、主函数。
【思考提高】
实现两个线性表的并。
示例程序1,InitList_Sq、ListInsert_Sq、ListDelete_Sq在TC2.0中的调试:
#include"stdio.h"
#include"malloc.h"
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE10
#defineLISTINCREMENT4
typedefintStatus;
typedefintElemType;
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
StatusInitList_Sq(SqList*L){
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L->elem)return(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
returnOK;
}
StatusListInsert_Sq(SqList*L,inti,ElemTypee){
ElemType*q,*p,*newbase;
if(i<1||i>L->length+1)returnERROR;
if(L->length>=L->listsize){
newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)return(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L->length;
returnOK;
}
StatusListDelete_Sq(SqList*L,inti,ElemType*e){
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(){
SqListLst;
inti,n=15;
ElemTypee;
if(InitList_Sq(&Lst)==OK){
for(i=1;i<=n;i++)
if(ListInsert_Sq(&Lst,i,i)!
=OK)break;
printf("\n");
for(i=0;iprintf("i,e=%d,%d\n",i,Lst.elem[i]);
getch();
if(ListDelete_Sq(&Lst,10,&e)==OK){
printf("delete_elem=%d\n",e);
getch();
for(i=0;iprintf("i,e=%d,%d\n",i,Lst.elem[i]);
}else
printf("delete_elemisfailed\n");
}
}
示例程序2,InitList_L、ListInsert_L、ListDelete_L在VC6.0中的调试:
#include"math.h"
#include"malloc.h"
#include"stdio.h"
#defineERROR0
#defineTRUE1
#defineFLASE0
#defineOK1
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefstructLnode{
ElemTypedata;
structLnode*next;
}Lnode,*LinkList;
StatusListInsert_L(LinkList&L,inti,ElemTypee)
{LinkLists,p;
intj;
p=L;j=0;
while(p&&jnext;++j;}
if(!
p||j>i-1)returnERROR;
s=(Lnode*)malloc(sizeof(Lnode));
if(!
s)returnOVERFLOW;
s->data=e;
s->next=p->next;p->next=s;
returnOK;
}
StatusListDelete_L(LinkList&L,inti,ElemType&e)
{LinkLists,p;
intj;
p=L;j=0;
while(p->next&&jnext;++j;}
if(!
(p->next)||j>i-1)returnERROR;
s=p->next;
p->next=s->next;
e=s->data;
free(s);
returnOK;
}
StatusInitList_L(LinkList&L)
{
L=(Lnode*)malloc(sizeof(Lnode));
if(L){
L->next=NULL;
returnOK;
}
else
returnERROR;
}
intcmp(Eventa,Eventb);
StatusOrderInsert_L(LinkList&L,ElemTypee,int(*cmp)(Eventa,Eventb))
{
Lnode*p,*q;
p=(Lnode*)malloc(sizeof(Lnode));
if(!
p)return(OVERFLOW);
p->data=e;
q=L;
while(q->next&&cmp(e,q->next->data)>0)
q=q->next;
p->next=q->next;
q->next=p;
returnOK;
}
intEmptyList(LinkListL)
{
if(!
L->next)return1;
return0;
}
LinkListGetHead(LinkListL)
{
if(!
L->next)returnNULL;
returnL->next;
}
StatusDelFirst(LinkListL,LinkList&p)
{
p=L->next;
if(!
p)returnERROR;
L->next=p->next;
returnOK;
}
voidmain(){
//主程序略
}
示例3
#include
#include
#include
structlist//结点类型
{intdata;
structlist*next;
};
structlist*head;//声明结点指针
intstaticlength;//声明表长变量
structlist*creat_n()//创建有n个元素的链表
{
structlist*q,*p,*head=NULL;
printf("\n输入你所要创建的结点数:
");
scanf("%d",&length);
head=p=(list*)malloc(sizeof(list));//创建一个新结点并用头指针指向它
printf("输入该结点的值:
");
scanf("%d",&p->data);
p->next=NULL;
for(inti=length-1;i>=1;i--)
{
q=p;
p=(list*)malloc(sizeof(list));//创建新结点
printf("输入该结点的值:
");
scanf("%d",&p->data);
q->next=p;
}
printf("输入完毕\n\n");
p->next=NULL;
returnhead;
}
structlist*output()//输出表长与结点值函数
{
structlist*p;
p=head;
printf("\n当前链表中存有的元素:
\n");
while(p!
=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
printf("当前的表长是:
%d\n\n",length);//输出当前表长
returnhead;
}
voidinsert()//插入结点函数
{
structlist*k,*p,*q;
intx;
printf("请输入你要在哪个结点值之前插入新结点:
");
scanf("%d",&x);
k=(list*)malloc(sizeof(list));//创建新结点
printf("请输入新结点的值:
");
scanf("%d",&k->data);
k->next=NULL;
if(head==NULL)//若链表为空,则直接入链表
{
head=k;
length=length+1;
printf("插入成功\n\n");
}
elseif(head->data==x)//在第一个结点前插入新结点
{
k->next=head;
head=k;
printf("插入成功\n\n");
length=length+1;
}
else
{
q=head;
p=head->next;
while((p!
=NULL)&&(p->data!
=x))//找出值为X的结点的位置
{
q=p;
p=p->next;
}
if(p==NULL)
{
q->next=k;//在链表末插入新结点
printf("插入成功\n");
length=length+1;
}
elseif(p->data==x)//在要求的X结点前插入新结点
{
k->next=p;
q->next=k;
printf("插入成功\n\n");
length=length+1;
}
}
output();
}
intdelet()//删除结点函数
{
structlist*q,*p;
intx,y;
printf("请输入你所要删除的结点值:
");
scanf("%d",&x);
if(head==NULL)//表空
{
printf("表空\n");
return0;
}
elseif(x==head->data)//第一个结点为删除的结点
{
q=head;
head=head->next;
y=q->data;
free(q);
printf("删除成功\n\n");
length=length-1;
output();
return(y);
}
else
{
q=head;
p=head->next;
while((p!
=NULL)&&(p->data!
=x))//找出值为X的结点
{
q=p;
p=p->next;
}
if(p==NULL)
{
printf("没有删除对象\n");
}
if(x==p->data)//删除值为X的结点
{
q->next=p->next;
y=p->data;
free(p);
printf("删除成功\n\n");
length=length-1;
output();
return(y);
}
else
{
printf("表中没有指定的结点\n");
output();
return0;
}
}
return0;
}
voidfind()
{
structlist*p;
intk,x,i=1;
chary,n;
LOOP:
p=head;
printf("请输入你要查找的结点值:
");
scanf("%d",&x);
while(p->data!
=x)
{
p=p->next;
i++;
}
printf("你所查找的结点是表中第%d个结点!
\n\n",i);
printf("是否要继续查找,请输入y/n\n\n");
k=getch();
if(k=='y')
{
i=1;
gotoLOOP;
}
else
return;
}
voidmain()
{
printf("计Y062200502001052李抱和\n\n");
inta;
LOOP:
printf("*****************\n");
printf("**1创建链表**\n");
printf("**2链表输出**\n");
printf("**3插入结点**\n");
printf("**4删除结点**\n");
printf("**5查找结点**\n");
printf("*****************\n");
printf("\n请选择:
");
scanf("%d",&a);
switch(a)
{
case1:
head=creat_n();
break;
case2:
output();
break;
case3:
insert();
break;
case4:
delet();
break;
case5:
find();
break;
}
gotoLOOP;
}