线性表的实现及操作.docx
《线性表的实现及操作.docx》由会员分享,可在线阅读,更多相关《线性表的实现及操作.docx(10页珍藏版)》请在冰豆网上搜索。
线性表的实现及操作
实验一、线性表的实现及操作
(一)
一、实验目的
了解和掌握线性表的顺序存储结构;掌握用C语言上机调试线性表的基本方法;掌握线性表的基本操作:
插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。
二、实验要求
给定一段程序代码,程序代码所完成的功能为:
(1)建立一个线性表;
(2)依次输入数据元素1,2,3,4,5,6,7,8,9,10;(3)删除数据元素5;(4)依次显示当前线性表中的数据元素。
假设该线性表的数据元素个数在最坏情况下不会超过100个,要求使用顺序表。
程序中有3处错误的地方,有标识,属于逻辑错误,对照书中的代码仔细分析后,要求同学们修改错误的代码,修改后上机调试得到正确的运行结果。
(1)需求分析:
这份实验报告为所有必做题的实验报告。
包括实验一顺序表建立、插入、删除等基本操作,实验二单链表的建立、插入、删除等基本操作,实验四二叉树的基本操作:
树的建立、前序、中序、后序遍历及实验六图的遍历:
深度优先和广度优先。
这四份基础性的实验为改错性质,将每个实验题目中的错误改正过来并通过调试,有助于对基础知识的理解与强化记忆。
(2)概要设计:
实验一为对顺序线性表实现插入,删除,查找等基本操作。
需要用到的语句包括voidListInitiate(SeqList*L)
intListInsert(SeqList*L,inti,DataTypex)
intListDelete(SeqList*L,inti,DataType*x)
intListGet(SeqListL,inti,DataType*x)等。
实验二是对单链表进行建立,插入,删除等基本操作。
需要的语句为voidListInitiate(SeqList*L)
intListInsert(SeqList*L,inti,DataTypex)
intListDelete(SeqList*L,inti,DataType*x)
intListGet(SeqListL,inti,DataType*x)等。
实验四为二叉树,要求建立一个二叉树,并实现前序,中序及后序的遍历。
所需语句包括voidListInitiate(SeqList*L)
intListInsert(SeqList*L,inti,DataTypex)
intListDelete(SeqList*L,inti,DataType*x)
intListGet(SeqListL,inti,DataType*x)等。
实验六的内容是图的遍历包括邻接矩阵和邻接链表两种方法。
三、程序代码
(更正后的代码)
#include<>
#defineMaxSize100
typedefintDataType;
typedefstruct
{
DataTypelist[MaxSize];
intsize;
}SeqList;
voidListInitiate(SeqList*L)/*初始化顺序表L*/
{
L->size=0;/*定义初始数据元素个数*/
}
intListLength(SeqListL)/*返回顺序表L的当前数据元素个数*/
{
return;
}
intListInsert(SeqList*L,inti,DataTypex)
/*在顺序表L的位置i(0≤i≤size)前插入数据元素值x*/
/*插入成功返回1,插入失败返回0*/
{
intj;
if(L->size>=MaxSize)
{
printf("顺序表已满无法插入!
\n");
return0;
}
elseif(i<0||i>L->size)
{
printf("参数i不合法!
\n");
return0;
}
else
{
for(j=L->size;j>i;j--)L->list[j]=L->list[j];/*为插入做准备*/
L->list[i]=x;/*插入*/
L->size++;/*元素个数加1*/
return1;
}
}
intListDelete(SeqList*L,inti,DataType*x)
/*删除顺序表L中位置i(0≤i≤size-1)的数据元素值并存放到参数x中*/
/*删除成功返回1,删除失败返回0*/
{
intj;
if(L->size<=0)
{
printf("顺序表已空无数据元素可删!
\n");
return0;
}
elseif(i<0||i>L->size-1)
{
printf("参数i不合法");
return0;
}
else
{//此段程序有一处错误
*x=L->list[i];/*保存删除的元素到参数x中*/
for(j=i+1;j<=L->size-1;j++)L->list[j]=L->list[j-1];/*依次前移*/
L->size--;/*数据元素个数减1*/
return1;
}
}
intListGet(SeqListL,inti,DataType*x)
/*取顺序表L中第i个数据元素的值存于x中,成功则返回1,失败返回0*/
{
if(i<0||i>
{
printf("参数i不合法!
\n");
return0;
}
else
{
*x=[i];
return1;
}
}
voidmain(void)
{SeqListmyList;
inti,x;
ListInitiate(&myList);
for(i=0;i<10;i++)
ListInsert(&myList,i,i+1);
ListDelete(&myList,4,&x);
for(i=0;i{
ListGet(myList,i,&x);//此段程序有一处错误
printf("%d",x);
}
}
测试结果:
线性表的实现及操作
(二)
一、实验目的
了解和掌握线性表的链式存储结构;掌握用C语言上机调试线性表的基本方法;掌握线性表的基本操作:
插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。
二、实验要求
给定一段程序代码,程序代码所完成的功能为:
(1)建立一个线性表;
(2)依次输入数据元素1,2,3,4,5,6,7,8,9,10;(3)删除数据元素5;(4)依次显示当前线性表中的数据元素。
假设该线性表的数据元素个数在最坏情况下不会超过100个,要求使用单链表。
程序中有3处错误的地方,有标识,属于逻辑错误,对照书中的代码仔细分析后,要求同学们修改错误的代码,上机调试并得到正确的运行结果。
三、程序代码:
(更正后的结果)
#include<>/*该文件包含pringtf()等函数*/
#include<>/*该文件包含exit()等函数*/
#include<>/*该文件包含malloc()等函数*/
typedefintDataType;/*定义DataType为int*/
typedefstructNode
{
DataTypedata;
structNode*next;
}SLNode;
voidListInitiate(SLNode**head)/*初始化*/
{
/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
(*head)->next=NULL;/*置链尾标记NULL*/
}
intListLength(SLNode*head)
{
SLNode*p=head;/*p指向首元结点*/
intsize=0;/*size初始为0*/
while(p->next!
=NULL)/*循环计数*/
{
p=p->next;
size++;
}
returnsize;
}
intListInsert(SLNode*head,inti,DataTypex)
/*在带头结点的单链表head的数据元素ai(0≤i≤size)结点前*/
/*插入一个存放数据元素x的结点*/
{
SLNode*p,*q;
intj;
p=head;/*p指向首元结点*/
j=-1;/*j初始为-1*/
while(p->next!
=NULL&&j/*最终让指针p指向数据元素ai-1结点*/
{
p=p->next;
j++;
}
if(j!
=i-1)
{
printf("插入位置参数错!
");
return0;
}
/*生成新结点由指针q指示*/
if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
q->data=x;
//此段程序有一处错误
p->next=q->next;/*给指针q->next赋值*/
p->next=q;/*给指针p->next重新赋值*/
return1;
}
intListDelete(SLNode*head,inti,DataType*x)
/*删除带头结点的单链表head的数据元素ai(0≤i≤size-1)结点*/
/*删除结点的数据元素域值由x带回。
删除成功时返回1;失败返回0*/
{
SLNode*p,*s;
intj;
p=head;/*p指向首元结点*/
j=-1;/*j初始为-1*/
while(p->next!
=NULL&&p->next->next!
=NULL&&j/*最终让指针p指向数据元素ai-1结点*/
{
p=p->next;
j++;
}
if(j!
=i-1)
{
printf("插入位置参数错!
");
return0;
}
//此段程序有一处错误
s=p->next;/*指针s指向数据元素ai结点*/
*x=s->data;/*把指针s所指结点的数据元素域值赋予x*/
p->next=s->next;/*把数据元素ai结点从单链表中删除指*/
free(s);/*释放指针s所指结点的内存空间*/
return1;
}
intListGet(SLNode*head,inti,DataType*x)
/*取数据元素ai和删除函数类同,只是不删除数据元素ai结点*/
{
SLNode*p;
intj;
p=head;
j=-1;
while(p->next!
=NULL&&j
{
p=p->next;j++;
}
if(j!
=i)
{
printf("取元素位置参数错!
");
return0;
}
//此段程序有一处错误
*x=p->data;
return1;
}
voidDestroy(SLNode**head)
{
SLNode*p,*p1;
p=*head;
while(p!
=NULL)
{
p1=p;
p=p->next;
free(p1);
}
*head=NULL;
}
voidmain(void)
{
SLNode*head;
inti,x;
ListInitiate(&head);/*初始化*/
for(i=0;i<10;i++)
{
if(ListInsert(head,i,i+1)==0)/*插入10个数据元素*/
{
printf("错误!
\n");
return;
}
}
if(ListDelete(head,4,&x)==0)/*删除数据元素5*/
{
printf("错误!
\n");
return;
}
for(i=0;i{
if(ListGet(head,i,&x)==0)/*取元素*/
{
printf("错误!
\n");
return;
}
elseprintf("%d",x);/*显示数据元素*/
}
Destroy(&head);
}
测试结果为: