线性表的基本操作Word文件下载.docx
《线性表的基本操作Word文件下载.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
L=(LinkList)malloc(sizeof(LNode));
if(!
L)returnOVERFLOW;
L->
next=NULL;
q=L;
printf("
输入元素个数和各元素:
"
);
scanf("
%d"
&
n);
for(i=0;
i<
n;
i++){
p=(LinkList)malloc(sizeof(LNode));
scanf("
p->
data);
q->
next=p;
q=p;
}
q->
returnOK;
}
StatusGetElem(LinkListL,inti,ElemType&
e){
LinkListp;
intj;
p=L->
next;
j=1;
while(p&
&
j<
i){
p=p->
++j;
}
if(!
p||j>
i)returnERROR;
e=p->
data;
returnOK;
StatusListInsert(LinkList&
L,inti,ElemTypee){
LinkListp,s;
printf("
输入插入数的位置和值:
scanf("
%d%d"
i,&
e);
p=L;
j=0;
i-1){
s=(LinkList)malloc(sizeof(LNode));
s->
data=e;
next=p->
p->
next=s;
StatusListDelete(LinkList&
L,inti,ElemType&
LinkListp,q;
输入要删除元素的位置:
i);
while(p->
next&
i-1){
(p->
next)||j>
i-1)returnERROR;
q=p->
next=q->
e=q->
free(q);
StatusClearList(LinkList&
L){
while(L->
next){
该表已被清空!
StatusLNodeEmpty(LinkListL){
if(L->
next==NULL)returntrue;
elsereturnfalse;
StatusCreateList(LinkList&
L,intn){
inti;
L=(LinkList)malloc(sizeof(LNode));
L->
next=NULL;
输入元素的个数和相应值:
for(i=n;
i>
0;
--i){
p=(LinkList)malloc(sizeof(LNode));
scanf("
p->
next=L->
next=p;
StatusListDisp(LinkListL){
LinkListp;
p=L->
while(p!
=NULL){
%d"
p->
p=p->
}
\n"
}StatusListLength(LinkListL){
inti=0;
i++;
returni;
intmain(){
LinkListL;
ElemTypee;
inti,choose;
InitLNode(L);
if(LNodeEmpty(L))printf("
表为空."
else
do
{printf("
选择操作:
\n1:
输出某个元素的值;
\n2:
在某个元素之前插入一个数;
\n3:
删除某个元素;
\n4:
显示链表中的元素及其长度\n"
choose);
switch(choose){
case1:
要查找元素的位置"
GetElem(L,i,e);
第%d个元素的值是%d\n"
i,e);
break;
case2:
ListInsert(L,i,e);
printf("
当前链表中的所有元素为:
ListDisp(L);
break;
case3:
ListInsert(L,i,e);
被删除元素的值是%d\n"
e);
ListDisp(L);
case4:
链表中的所有元素为:
链表的长度为:
%d\n"
ListLength(L));
default:
操作结束!
exit(0);
}while
(1);
ClearList(L);
return;
顺序表
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
StatusInitList(SqList&
L){
inti,n;
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)return(OVERFLOW);
printf("
输入元素个数和各元素的值:
for(i=0;
L.elem[i]);
L.length=n;
L.listsize=LIST_INIT_SIZE;
voidTraverList(SqListL){
inti;
\nTheSqListL:
L.length;
i++)
%d\t"
L.elem[i]);
StatusListInsert(SqList&
L,inti,ElemTypee){
ElemType*newbase;
ElemType*p,*q;
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)exit(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;
StatusListDelete(SqList&
L,inti,ElemType&
e){
if((i<
1)||(i>
L.length))returnERROR;
p=&
e=*p;
q=L.elem+L.length-1;
for(++p;
p<
++p)*(p-1)=*p;
--L.length;
intLocateElem(SqListL,ElemTypee){
ElemType*p;
i=1;
p=L.elem;
while(i<
=L.length&
(*p++!
=e))
++i;
=L.length)returni;
elsereturn0;
voidmain(){
SqListL;
if(InitList(L)==OVERFLOW){printf("
\nOVERFLOW"
return;
TraverList(L);
do{
选择要执行的基本操作:
插入元素;
删除元素;
查找元素;
输入要插入元素的位置和值:
if(ListInsert(L,i,e)==OK)TraverList(L);
elseprintf("
不能插入!
if(ListDelete(L,i,e)==OK)TraverList(L);
删除位置不合法。
case3:
输入要查找元素的值:
if(LocateElem(L,e))
该元素的位置是第%d位!
LocateElem(L,e));
该元素不存在!
return;
【实验心得】
通过这次实验课程使我明白了课本的重要性,当我遇到不懂或不确定的知识的时候就会求助于课本,所谓“万变不离其宗”。
只要掌握了最根本的知识,其他在其基础之上的问题就会变得很容易了。
另外我明白了合作的重要性,当遇到困难时,朋友的帮忙会显得尤其重要,一筹莫展时,伙伴的一句话也许就能点醒你。
众人拾柴火焰高,就是这个道理。
很难得实验课,让我有很多的感悟!
实验二:
栈的表示及栈的应用
(1)掌握栈的顺序存储结构及其基本操作的实现。
(2)掌握栈后进先出的特点,并利用其特性在解决实际问题中的应用。
(3)掌握用递归算法来解决一些问题。
1.编写程序,对于输入的任意一个非负十进制整数,输出与其等值的八进制数(课本P48)。
2.
编写递归程序,实现以下函数的求解(课本P54)。
3.编写程序,实现Hanoi塔问题(课本P55-P58)。
【主要代码】进制转换
typedefintSElemType;
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&
S){//构造一个空栈
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S.base)exit(OVERFLOW);
//存储分配失败
S.top=
S.base;
S.stacksize=STACK_INIT_SIZE;
}//InitStack
StatusPush(SqStack&
S,SElemTypee){
//插入元素e为新的栈顶元素
if(S.top-S.base>
=S.stacksize)
{//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*S.top++=e;
}//PUSH
StatusPop(SqStack&
S,SElemType&
e)
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
否则返回ERROR
if(S.top==S.base)
returnERROR;
e=*--S.top;
}//Pop
StatusStackEmpty(SqStackS)
//若栈不空,返回ERROR,否则返回OK
if(S.top==S.base)
}//StackEmpty
intN,e,M;
SqStackS;
InitStack(S);
请入一个数字:
M);
需要转换为几进制:
while(N)
{
Push(S,N%M);
N=N/M;
printf("
其对应的%d进制数是"
M);
while(!
StackEmpty(S)){
Pop(S,e);
递归程序
#include<
longFibonacci(intn);
voidmain()
intn;
longL;
请输入n的值:
L=Fibonacci(n);
Fibonacci(%d)=%ld\n"
n,L);
longFibonacci(intn)
longt=1;
if(n==1||n==0)
t=t*n;
if(n>
1)
t=Fibonacci(n-1)+Fibonacci(n-2);
returnt;
汉诺塔
voidmove(chara,intn,charb)
将编号为%d的盘从移到%c上\n"
n,a,b);
voidhanoi(intn,charx,chary,charz){
if(n==1)
move(x,1,z);
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
请输入n的值:
"
hanoi(n,'
a'
'
b'
c'
通过这次实验课程的学习使我对书本上的知识有了更深的了解,更加明白了深层次含义。
也明白了书本的重要性以及对基础知识的掌握的重要性的深刻认识。
以后的学习生活中我一定汲取这次得到的教训。
实事求是,全力以赴。
实验三:
串的模式匹配算法和
二叉树的建立及遍历
(1)掌握串的顺序存储表示及模式匹配算法(简单匹配和KMP算法)的实现。
(2)掌握利用先序序列建立二叉树的二叉链表的过程。
(3)掌握二叉树的先序、中序和后序遍历算法。
1.编写程序,对于输入的任意两个串:
主串和子串,判断子串在主串中的位置。
如:
主串为ababcab,子串为abc,找输出其位置为3;
若子串为abd,则提示子串在主串中不存在。
2.编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。
输入先序序列abc###de###,则建立如下图所示的二叉树。
并显示其先序序列为:
abcde
中序序列为:
cbaed
后序序列为:
cbeda
【程序代码】
实验1
#include"
stdio.h"
#defineMAXSTRLEN255
typedefunsignedcharSString[MAXSTRLEN+1];
//第一个用来存储字符个数
intstrlength(SStrings)//求字符串的长度
i=0;
while(s[i]!
='
\0'
)
i++;
intIndex(SStringS,SStringT,intpos)
{
inti,j;
i=pos,j=1;
while(i<
=S[0]&
j<
=T[0])
{
if(S[i]==T[j])
j++;
else
i=i-j+2;
//i不变,j后退
j=1;