数据结构实验一要求.docx

上传人:b****6 文档编号:8499547 上传时间:2023-01-31 格式:DOCX 页数:14 大小:18.10KB
下载 相关 举报
数据结构实验一要求.docx_第1页
第1页 / 共14页
数据结构实验一要求.docx_第2页
第2页 / 共14页
数据结构实验一要求.docx_第3页
第3页 / 共14页
数据结构实验一要求.docx_第4页
第4页 / 共14页
数据结构实验一要求.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构实验一要求.docx

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

数据结构实验一要求.docx

数据结构实验一要求

实验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;i

printf("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;i

printf("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;

}

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

当前位置:首页 > 小学教育 > 语文

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

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