数据结构实验报告 代码文档格式.docx
《数据结构实验报告 代码文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告 代码文档格式.docx(42页珍藏版)》请在冰点文库上搜索。
![数据结构实验报告 代码文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/64030ce8-8fdb-4ef4-849a-8d84202df71b/64030ce8-8fdb-4ef4-849a-8d84202df71b1.gif)
/*顺序栈的最大长度*/
typedefstruct
{Selemtypebase[MAXSIZE];
/*存储栈中数据元素的数组*/
inttop;
/*top为栈顶指针,它指示栈顶元素的存储空间的下一个存储单元*/
}Sqstack;
【核心算法提示】
1.顺序栈入栈操作的基本步骤:
首先判断顺序栈是否为满,如果满,则函数返回ERROR,否则将待入栈的数据元素存放在top所指示的存储单元中,再使top后移一个存储单元位置,即将top值加1,最后函数返回OK。
2.顺序栈出栈操作的基本步骤:
首先判断顺序栈是否为空,如果空,则函数返回ERROR,否则将栈顶指针前移一个存储单元位置,即将top值减1,再将top所指示的栈顶元素用e返回其值,并使函数返回OK。
【核心算法描述】
statusPush(Sqstack&
S,Selemtypee)
/*将数据元素e压入到顺序栈S中,使其成为新的栈项元素*/
{if(S.top>
=MAXSIZE)/*如果栈满,则函数返回ERROR*/
returnERROR;
S.base[S.top++]=e;
/*将新元素e存放在top所指示的存储单元中,并使top值加1*/
returnOK;
}
statusPop(Sqstack&
S,Selemtype&
e)
/*将顺序栈S中的栈顶元素从栈中删除,并用e返回其值*/
{if(S.top==0)/*如果栈空,则函数返回ERROR*/
ReturnERROR;
e=S.base[--S.top];
/*将top值减1,并用e保存top所指示的栈顶元素值*/
3.源程序代码参考
#defineMAXSIZE100
typedefstruct
{intbase[MAXSIZE];
/*top指示存储栈顶元素的下一存储单元*/
/*顺序栈的类型定义*/
SqstackPush(SqstackS,inte)/*顺序栈的入栈操作函数*/
{if(S.top>
=MAXSIZE)
printf("
StackisOverflow\n"
);
else
S.base[S.top++]=e;
returnS;
SqstackPop(SqstackS,int*e)/*顺序栈的出栈操作函数*/
{if(S.top==0)
StackisEmpty\n"
*e=S.base[--S.top];
voidStack_display(SqstackS)/*顺序栈的输出函数*/
{inti;
for(i=0;
i<
S.top;
i++)/*依次输出栈中各元素的值,栈顶元素在表的尾部*/
%4d"
S.base[i]);
\n"
main()
{SqstackS;
inti,j,n,x,e;
pleaseinputthelength:
"
/*请求输入顺序栈中元素个数*/
scanf("
%d"
&
n);
pleaseinputtheValue:
\n"
/*请求输入顺序栈中各个元素值*/
i<
n;
i++)
S.base[i]);
S.top=n;
thestackis:
Stack_display(S);
pleaseinputtheinsertnode:
/*请求输入需要入栈的新元素*/
x);
S=Push(S,x);
thestackafterpushis:
/*提示输出入栈后栈中各个元素值*/
/*调用顺序栈的输出函数*/
S=Pop(S,&
e);
thepopvalueis:
%d\n"
e);
/*输出出栈元素的值*/
thestackafterpopis:
/*提示输出出栈后栈中各个元素值*/
⑵核心算法提示
采用链式存储结构的栈称为链栈,链栈的存储结构描述如下:
typedefstructSnode
{Selemtypedata;
/*数据域*/
structSnode*next;
/*指针域*/
}SNODE,*LinkStack;
/*其中SNODE为链栈中的结点类型名,LinkStack为指向结点的指针类型名*/
如果栈中元素序列为{a1,a2,…,an},则链栈的存储结构如下图3-1所示:
从图3-1可看出,栈的链式存储结构与单链表的存储结构相同,所有在链栈上进行入栈和出栈操作与单链表上的插入和删除操作的主要步骤相同。
只不过要特别注意以下几点:
(1)链栈中无需加头结点。
(2)链栈中的指针是指向栈中元素序列的前驱结点。
(3)链栈中的入栈和出栈操作都是在链表的表头进行。
⑶核心算法描述
statusPush(LinkStack&
top,inte)
/*将数据元素e压入到链栈top中,使其成为新的栈项元素*/
{LinkStackp;
p=(LinkStack)malloc(sizeof(SNODE));
/*生成一个新的结点*/
if(!
p)/*如果分配空间失败,则函数返回"
OVERFLOW"
*/
returnOVERFLOW;
p->
data=e;
/*新结点的数据域赋值*/
next=top;
/*修改链使新结点插入到链表的头部,并成为新的栈顶元素*/
top=p;
statusPop(LinkStack&
top,int&
e)
/*将链栈top中的栈顶元素从栈中删除,并用e返回其值*/
{LinkStackq;
top)/*如果栈空,则函数返回ERROR*/
e=top->
data;
/*将被删的栈顶元素的值保存在e中*/
q=top;
/*用q记下待删的栈顶元素*/
top=q->
next;
/*修改链使待删结点从链中“卸下”,此时被删结点的后继成为新的栈顶元素结点*/
free(q);
/*释放被删结点的存储空间*/
}
7 实验项目名称:
串
31
罗维卿
1.掌握串的顺序表示和堆表示实现方法;
1、根据串的三种实现方式,顺序、堆和链,选择其中一种分别实现串赋值、串合并、删除等操作。
#include<
iostream.h>
stdio.h>
#defineMaxSize100
{
chardata[MaxSize];
intlength;
}SqString;
voidStrAssign(SqString&
str,charcstr[])
inti;
cstr[i]!
='
\0'
;
str.data[i]=cstr[i];
str.length=i;
voidStrCopy(SqString&
s,SqStringt)
t.length;
s.data[i]=t.data[i];
s.length=t.length;
intStrEqual(SqStrings,SqStringt)
intsame=1,i;
if(s.length!
=t.length)
same=0;
else
{
for(i=0;
s.length;
if(s.data[i]!
=t.data[i])
same=0;
returnsame;
intStrLength(SqStrings)
returns.length;
SqStringConcat(SqStrings,SqStringt)
SqStringstr;
str.length=s.length+t.length;
str.data[i]=s.data[i];
str.data[s.length+i]=t.data[i];
returnstr;
SqStringSubStr(SqStrings,inti,intj)
intk;
str.length=0;
if(i<
=0||i>
s.length||j<
0||i+j-1>
s.length)
cout<
<
参数错误\n"
endl;
returnstr;
for(k=i-1;
k<
i+j-1;
k++)
str.data[k-i+1]=s.data[k];
str.length=j;
SqStringInsStr(SqStrings1,inti,SqStrings2)
intj;
s1.length+1)
returns1;
for(j=0;
j<
i-1;
j++)
str.data[j]=s1.data[j];
s2.length;
str.data[i+j-1]=s2.data[j];
for(j=i-1;
s1.length;
str.length=s1.length+s2.length;
SqStringDelStr(SqStrings,inti,intj)
s.length||i+j>
s.length+1)//参数不正确时返回空串
printf("
参数不正确\n"
for(k=0;
k++)//将s.data[0...i-2]复制到str
str.data[k]=s.data[k];
for(k=i+j-1;
k++)//将s.data[i+j-1...s.length-1]str.data[k-j]=s.data[k];
str.length=s.length-j;
SqStringRepStr(SqStrings,inti,intj,SqStringt)
//将串s的第i个字符开始的j个字符替换成串t产生新串
s.length||i+j-1>
s.length)//参数不正确时返回空串
str.data[i+k-1]=t.data[k];
k++)//将s.data[i+j-1...s.length-1]复制到str
str.data[t.length+k-j]=s.data[k];
str.length=s.length-j+t.length;
voidDispStr(SqStrings)//输出串s的所有元素
inti;
if(s.length>
0)
{
%c"
s.data[i]);
}
//主程序
voidmain()
SqStrings,s1,s2,s3,s4;
(1)建立串s和串s1\n"
StrAssign(s,"
abcdefghijklmn"
StrAssign(s1,"
xyz"
(2)输出串s:
DispStr(s);
(3)串s的长度:
StrLength(s));
(4)在串的第九个字符位置插入串s1而产生串s2\n"
s2=InsStr(s,9,s1);
(5)输出串s2:
DispStr(s2);
(6)删除串s第二个字符开始的个字符而产生串s2\n"
s2=DelStr(s,2,3);
(7)输出串s2:
DispStr(s2);
(8)将串s第二个字符开始的个字符替换成串s1而产生串s2\n"
s2=RepStr(s,2,5,s1);
(9)输出串s2:
(10)提取串s的第二个字符开始的个字符而产生串s3\n"
s3=SubStr(s,2,10);
(11)输出串s3:
DispStr(s3);
(12)将串s1和串s2连接起来而产生串s4\n"
s4=Concat(s1,s2);
(13)输出串s4:
DispStr(s4);
2 实验项目名称:
线性表
1-516
2014-3-17
1.掌握线性表的顺序存储结构表示和实现方法;
2.掌握顺序表基本操作的算法实现;
3.了解顺序表的应用。
1、根据输入顺序表的长度n和各数据元素建立顺序表,并输出顺序表中各元素值,观察输入的内容和输出的内容是否一致。
2、在顺序表的第i个元素之前插入一值为x的元素,并输出插入后的顺序表中各元素值。
3、删除顺序表中第i个元素,并输出删除后的顺序表中各元素值。
4、在顺序表中查找第i个元素,如果成功就显示“查找成功”及位置,否则显示“查找失败”。
#include<
#defineMAXLEN50
intelem[MAXLEN];
}Sqlist;
SqlistSqlist_insert(SqlistL,inti,intx)/*
顺序表插入函数
*/
1||i>
L.length+1)
ERROR!
elseif(L.length>
=MAXLEN)
OLERFLOW!
else
{
for(j=L.length-1;
j>
=i-1;
j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=x;
L.length++;
}
returnL;
SqlistSqlist_delete(SqlistL,inti)/*
顺序表删除函数
L.length)printf("
for(j=i;
=L.length-1;
j++)
L.elem[j-1]=L.elem[j];
L.length--;
}
intSqlist_search(SqlistL,intx)/*
顺序表查找函数
{
for(i=0;
L.length&
&
L.elem[i]!
=x;
i++);
if(i<
L.length)
returni+1;
return0;
voidSqlist_display(SqlistL)/*
顺序表元素输出函数
%4d"
L.elem[j]);
main()/*
主函数
*/
{SqlistL;
inti,x,j;
\n请输入链表长度:
/*
请求输入顺序表中元素个数
L.length);
输入顺序表中各个元素:
请求输入顺序表中各个元素
scanf("
L.elem[j]);
printf("
输入插入操作位置:
/*
请求输入插入操作位置
i);
输入需要插入的新元素:
请求输入需要插入的新元素
L=Sqlist_insert(L,i,x);
调用顺序表插入函数
Sqlist_display(L);
调用顺序表元素输出函数
输入删除操作位置:
请求输入删除操作位置
L=Sqlist_delete(L,i);
调用顺序表删除函数
pleaseinputthesearchnode:
if(Sqlist_search(L,x))/*
如果查找成功,则显示查找成功和找到的元素位置,否则显示查
找不成功
searchissuccessand%dis%dposition\n"
x,Sqlist_search(L,x));
searchisunsuccess\n"
3 实验项目名称:
单链表