数据结构小结Word格式.docx
- 文档编号:18376386
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:52
- 大小:32.75KB
数据结构小结Word格式.docx
《数据结构小结Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构小结Word格式.docx(52页珍藏版)》请在冰豆网上搜索。
intsempty(ST)
top==0)return
(1);
/*若栈为空则返回true*/
elsereturn(0);
/*否则返回false*/
取栈顶元素ptop(ST)
从栈中取出栈顶元素并从栈中删除该栈顶元素的函数如下:
ElemTypeptop(ST)
Stack*ST
top(ST,x);
/*将栈顶元素附给x*/
pop(ST);
/*将栈顶元素弹出*/
return(x);
/*返回x值*/
队列
队列的存储方式
假设队列的元素个数最大不超过整数Maxsize,所有的元素都具有同一数据类型ElemType,则可用下列方式来定义队列类型queue;
ElemTypeq[Maxsize];
Intfront,rear;
}queue;
循环队列的入队enq(QU,x)
将整数x插入到QU队列中的函数如下:
voidenq(QU,x)
queue*QU;
ElemTypex;
if((QU->
rear+1))%Maxsize==QU->
front)printf(“队列上益处!
else
QU-.rear=(QU->
rear+1)%Maxsize;
QU->
q[QU->
rear]=x;
循环队列的出队deq(QU,x)
一个QU队列的尾部元素出队的函数如下:
voiddeq(QU,x)
if(QU->
front==QU->
rear)printf(“队列下益处!
QU->
front=(QU->
front+1`)%Maxsize;
xx=QU->
front];
读取循环队列的头元素gethead(QU,x)
读取队列QU的队列头元素的函数如下:
voidgethead(QU,x)
queue*QU
if(QU->
rear)printf(“队列下益出”);
else*x=QU->
q[(QU->
front+1)%Maxsize];
链表
单链表的存储结构:
单链表的结点的类型node的定义如下:
typedefstructlinknode
ElemTypedata;
Structlinknode*next;
}node;
这里的ElemType可以是任何相应的数据类型如int,float或char等,在算法中,我们规定ElemType默认是int类型。
建立一个单链表
输入一系列整数,以0标志结束,将这些整数作为data域建立一个单链表的函数如下:
voidcreat()
node*head,p,*s;
intx,cycle=1;
/*cycle是循环控制变量*/
head=(node*)malloc(sizeof(node));
/*建立头结点,由head所指向*/
p=head;
while(cycle)
scanf(“%d”,&
x);
if(x!
=0)
s=(node*)malloc(sizeof(node));
/*建立下一个节点*/
s->
data=x;
p->
next=s;
p=s;
elsecycle=0;
p->
next=NULL;
head=head->
next;
/*删除头结点*/
free(p);
查找某个结点
在已建立好的单链表(表头指针为head)中查找元素值为x的函数如下:
voidfind(head,x)
node*head;
node*p;
p=head;
while(p!
=NULL&
&
data!
=x)p=p->
if(p!
=NULL)
printf(“结点找到了!
printf(“结点未找到!
在循环单链表中查找某个结点的函数如下:
voidfind1(head,x)
node*p;
if(head->
data==x)
p=head->
while(p->
=x&
p!
=head)p=p->
=head)
printf(“结点找到了!
printf(“结点未找到!
求单链表的长度
计算一个已建立好的单链表(表头指针为head)的结点个数的函数如下:
intlength(head)
intn=0;
while(p!
p=p->
n++;
return(n);
求一个循环单链表的长度的函数如下:
if(head==NULL)n=0;
n=1;
return(n);
在单链表中插入一个结点
在单链表中第iI个节点(i>
=0,i=0表示插入的结点作为第一个节点)之后插入一个元素为
x的结点的函数如下:
voidinsert(head,i,x)
inti;
node*s,*p;
intj;
s=(node)malloc(sizeof(node));
/*建立一个待插入的结点*/
s->
if(i==0)/*如果i=0,则将s所指结点作为表头*/
next=head;
head=s;
j=1;
/*在单链表中查找第i个节点,由p所指向*/
j<
i)
j++;
=NULL)/*若查找成功,则把s插入到其后*/
next=p->
printf(“未找到!
从单链表中删除一个结点
从单链表中删除一个其值等于给定值X的结点的函数如下:
voiddelete(head,x)
node*p,*q;
if(head==NULL)printf(“链表下溢”);
/*如果单链表为空,则下溢处理*/
if(head->
data==x)/*如果表头结点为被删结点,则删除之*/
head=head->
free(p);
q=head;
p=head->
/*从第2个节点开始查找其值为x的结点*/
=x)
if(p->
q=p;
p=p->
if(p!
{
q->
双链表
双链表的定义
双链表中结点的类型定义为:
structlinknode*left,*right;
}dnode;
这里的ElemType可以是任何相应的数据类型如int,float或char等,在算法中,我们规定ElemType默认是int类型
建立一个双链表
输入一系列整数,以0标志结束,将这些整数作为data域建立一个双链表的函数如下:
voidcreat()
dnode*head,*p,*s;
intcycle=1;
head=(node*)malloc(sizeof(dnode));
scanf(`”%d”,&
s=(node)malloc(sizeof(dnode));
/*建立下一个结点,由S所指向*/
right=s;
left=p;
p=s;
right;
head->
left=NULL;
/*将最后一个结点的left域置为NULL*/
right=NULL;
/*将第一个结点的right域置为NULL*/
如果需要生成循环双链表,只需要把上叙函数creat()中最后的两个语句:
改为:
/*这里p指向最后一个结点*/
right=head;
在已经建立好的双链表(表头指针为head)中查找元素值为x的函数如下:
voidfind(head,x)
dnode*head;
intx;
dnode*p;
=NULL&
printf(“终点找到了!
printf(“终点未找到!
在循环双链表中查找某个结点的函数如下:
voidfind1(VARhead:
dnode,VARx:
integer)
dnode*p;
if(head->
data==x)/*若头结点为要找的结点,则显示相应信息并返回*/
printf(“终于找到了!
else/*否则查找该结点*/
while(p->
=x&
p!
-head)p=p->
/*p=p->
right也可改为p=p->
right*/
if(p!
printf(“未找到!
在双链表中插入一个结点
在双链表中第I个结点(i>
=0,i=0时表示插入表头结点)之后插入一个元素为x的结点的函数如下:
voidinsert(head,I,x)
intI;
dnode*s,*p;
s=(dnode)malloc(sizeof(dnode));
/*建立一个待插入的结点,由s指向*/
if(I==0)/*如果i=0,则将s所指结点插入到表头后返回*/
head->
left=s;
/*在双链表中查找第I个结点,由p所指向*/
j<
righr;
=NULL)/*若查找成功,则把s插入到p之后*/
if(p->
right==NULL)/*若p是最后一个结点,则直接把s链接起来*/
right=s;
s->
right=NULL;
right=p->
right->
从双链表中删除一个结点
从双链表中删除一个其值等于给定值x的结点的函数如下:
if(head==NULL)printf(“链表下溢!
/*如果双链表为空,则下溢处理*/
data==x)/*如果表头结点值等于x,则删除之*/
/*从第二个结点开始查找其值为x的结点*/
if(p->
=x)/*在查找时,p指向该结点*/
=NULL)/*若找到了该结点,则进行删除处理*/
right==NULL)/*若p所指结点是最后一个结点,则直接删除之*/
left->
else/*若p所指结点不是最后一个结点,则把p的左右两个结点联结起来*/
left=p->
left;
else/*未找到时,显示相应信息*/
串
串的模式匹配算法
求子串的定位函数Index(S,T,Pos)
intIndex(SStringS,SStringT,intpos){
//返回子串T在主串S中第POS个字符之后的位置。
若不存在,则函数值为0
//其中,T非空,1<
=pos<
=StrLength(S)
I=pos;
j=1;
While(I<
=s[0]&
=T[0]){
If(S[i]==T[j]){++I;
++j;
}//继续比较后续字符
Else{I=I-j+2;
}//指针后退重新开始匹配
if(j>
T[0])returnI-T[0];
elsereturn0;
}//index
KMP算法
IntIndex_KMP(SStringS,SStringT,intpos)
//利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法。
其中,T非空,1<
=StrLength(s).
If(j==0||S[i]==T[j]){++I;
Elsej=next[j];
//模式串向右移动
//匹配成功
}//Index_KMP
求模式串的next函数
voidget_next(SStringT,int&
next[])
//求模式串T的next函数值并存入数组next
I=1;
next[1]=0;
j=0;
T[0])
If(j==0||T[i]==T[j])
++I;
++j;
next[i]=j;
Elsej=next[j];
}//get_next
改进后的next函数
//求模式串T的next函数修正值并存入数组nextval
if(T[i]!
=T[j])nextval[i]=j;
elsenextval[i]=nextval[j];
Elsej=nextval[j];
顺序存储及其基本运算
顺序存储采用一般线性表的存储结构来定义串的类型:
charvec[Maxsize];
intlen;
}orderstring;
其中vec域用来存储字符串,len域用来存储字符串的当前长度,Maxsize常量表示允许所存储字符串的最大长度。
例如,用一下语句定义Maxsize为100:
#defineMaxsize100
以顺序方式存储串的基本运算如下:
链接两个串
两个串r1和r2首位相连成一个串r,其中r1在前,r2在后,
orderstring*concat(r1,r2)
orderstring*r1,*r2;
orderstring*r;
printf(“*r1=%s,r2=%s\n”,r1->
vec.r2->
vec);
if(r1->
len+r2->
len>
m0)/*若两串长度之和大于m0,则进行溢出处理*/
printf(“上溢出!
for(I=0;
I<
r1->
len;
I++)/*将r1传递给r*/
r->
vec[i]=r1->
vec[i];
r2->
I++)/*将r2传递给r*/
vec[r1->
len+i]=r2->
len+i]=’\0’;
/*最后一个位置附给’\0’*/
len=r1->
/*r串长度等于两串长度之和*/
return(r);
取子串
从串r1中的第I个字符开始,把连续j个字符组成的子串赋给r
orderstring*substring(r1,I,j)
orderstring*r1;
intI,j;
intk;
if(I+j-1>
len)/*若I,j的值超出允许的范围,则进行‘超界’处理*/
printf(“超界!
for(k=0;
k<
j;
k++)/*将r1中指定的子串传给r*/
vec[k]=r1-vec[I+k-1];
len=j;
vec[r->
len]=’\0’;
删除子串
从串r中删除从第I个字符开始的,长度为j的一个子串
orderstring*delsubstring(r,I,j)
r->
len)/*若I,j的值超出允许的范围,则进行超界处理*/
for(k=I+j-1;
k++)/*将被删除的子串后面的所有字符依次前移j个位子*/
vec[k-j]=r->
vec[k];
len=r->
len-j;
return(r);
插入子串
把串r1插入到串r中第I个字符开始的位置上。
Orderstring*insert(r,r1,i)
Orderstring*r,*r1;
IntI;
intk;
if(I>
=len||r->
len+r1->
m0)printf(“不能插入!
for(k=r->
len-1;
k>
=I;
k--)/*从第I个位子起空出连续r1->
len个位子*/
len+k]=r->
k++)
vec[I+k-1]=r1->
求子串位置
求子串位置的运算又叫做串的模式匹配运算。
从串r1中求出首次与r2相同的子串的起始位置,若r1中不存在r2,则返回0
intposition(r1,r)
orderstring*r1,*r;
intI,j,k;
I++)
for(j=I,k=0;
vec[j]=r1->
j++,k++)
if(!
vec[k+1])/*子串结尾,表示查找成功*/
return(i);
return(-1);
/*未找到子串*/
数组和稀疏矩阵(略)
递归
编写一个过程采用非递归方法计算一棵二叉树的所有结点个数。
先定义如下常量和变量类型:
#definestructnode
typestructnode
chardata;
structnode*left,*right;
}bitree;
计算一棵二叉树的所有结点个数的counter函数如下:
intcounter(bitree*t)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 小结