单链表的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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->datanext->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);

相关文档
最新文档