单链表的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五.单链表的应用—带头结点
链表的遍历:
访问链表每个元素一次且仅一次。
基本算法如下:
void print(node *L)
{ P=L->next;
while(P!=NULL)
{visit(P->data);
P=P->next;
}
}
例设计算法,判断带头结点单链表L是否递增?若递增,则返回ture,否则返回false。分析:
(1)链表空,返回true;
(2)只有一个元素,返回true;
(3)每个元素都小于其直接后继,返回true;
否则,返回false;
bool Judge(node *L)
{ node *P=L->next;
if(P==NULL) return(1);
while(P->next!=NULL)
{ if(P->data
P=P->next;
else return(0);
}
return(1);
}
设计算法,使得带头结点的整型单链表中的所有元素值都变成原来的3倍。
如:原L=(1,2,3,4,5)变成L’=(3,6,9,12,15)
2、双链表和双循环链表
(1)双链表
类型描述如下:prior data next
typedef struct dnode
{elementtype data;
dnode *next,*prior; 引用:dnode *Head;
}
插入
假设被插入位置的前一个结点的指针P已找到,插入由S指向的结点:
①S->next=P->next;
②S->prior=P;
③P->next=S;
④S->next->prior=S;
删除
假设被删除结点的指针P已找到,删除由P指向的结点:
①P->next->prior=P->prior;
②P->prior->next=P->next;
③delete(P);
顺序表:
逻辑上相邻的元素物理上也相邻;
可直接定位,节省搜索时间
然而,在插入、删除时,需移动元素,浪费时间;
链表:
逻辑上相邻的元素物理上不一定相邻;
插入、删除时,不需移动元素。
§2.4 串
一、串的定义和运算
1、定义:
串:是由n个字符a1,a2,…,an组成的有限序列(n≥0),记作S=“a1a2…an”
其中n为串长度,n=0时为空串;
注意:空串和空格串的区别:
空串——没有元素;
空格串——元素是空格符;
子串:串S中若干个连续的字符组成的序列。>
2、运算:
(1)赋值(S=S1):将一个串值S1传送给一个串名S ;
(2)求长度str_length(S):返回串S的长度值;
(3)连接运算(S1+S2):将S1和S2连接成一个新串;
(4)求子串substr(S,i,j):返回串S从第i个元素开始的j个元素所组成的子串;(5)串比较:比较两个串的大小;
(6)插入运算insert(S,i,S1):将子串S1插入到串S的从第i个字符开始的位置上;(7)删除运算delete(S,i,j):删除串S中从第i个字符开始的j个字符。
例(1)空串和空格串
S1=“”;S1是空串,
S2=“ ”;S2是空格串;
(2)子串
S3=“abcde*$”;S4=“bcd”;S5=“abe”;
S4是S3的子串;S5不是S3的子串。
例(1)赋值
S=“abcde*$”;S1=“bcd”;S2=S;
右边的值=>左边的串名。
(2)连接运算
已知:S1=“bcd”;S2=“ace*”;
则:S2+S1=“ace*bcd”
(3)求子串
S=“abcde*$”;
substr(S,2,4)=“bcde”
例(4)插入
已知:S=“abcde*$”;S1=“bcd”;S2=“kf”;
insert(S,4,“mn”)=“abcmnde*$”;
insert(S1,2,S2)=“bkfcde”
(5)删除
S=“abcde*$”;S1=“bcd”;
delete(S,5,2)=“abcd$”;
delete(S1,1,2)=“d”;
§ 3 栈、队列和数组
栈和队列都是运算受限的的线性表。下面我们分别讨论栈和队列的定义、基本运算和应用。§3.1 栈
一、栈的定义和运算
1、定义:
栈(Stack):
是只能在同一端插入和删除的线性表。
2、特点:后进先出(LIFO)。
3、栈的基本运算
(1)初始化栈:
建空栈;
(2)判栈空:
若为空,则返回true,否则返回false;
(3)判栈满:
若为满,则返回true,否则返回false;
(4)读栈顶元素:取出栈顶元素。
条件:栈不空。
否则,应能明确给出标识,以便程序的处理。
(5)入栈:将元素入栈,即放到栈顶。
如果栈满,怎样处理?
(6)出栈:删除当前栈顶的元素。
如因为栈空而不能进行,应怎样处理?
二、顺序栈
1、存储结构:
——采用顺序表来存储的栈;
#define maxlen 最大容量
typedef struct seqstack
{elementtype data[maxlen];
int top;
}
引用:seqstack S; 栈顶元素是data[top]
2、运算的实现:
(1)初始化:
void init_stack(seqstack &S)
{S.top=-1;}
(2)判栈空:
bool empty(seqstack S)
{return (S.top==-1);}
(3)判栈满:满返回1,否则返回0
bool stack_full(S);
{ if(S.top==maxlen-1)
return(1);
else
return(0);