数据结构实验一要求.docx
- 文档编号:8499547
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:14
- 大小:18.10KB
数据结构实验一要求.docx
《数据结构实验一要求.docx》由会员分享,可在线阅读,更多相关《数据结构实验一要求.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构实验一要求
实验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&&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&&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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 要求