数据结构 第三章课后习题及总结

合集下载

数据结构第三章习题答案解析

数据结构第三章习题答案解析

第三章习题1.按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?⑵如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因。

(即写出以“S”表示进栈、以“X”表示出栈的栈操作序列)。

2.设队列中有A、B、C、D、E这5个元素,其中队首元素为A。

如果对这个队列重复执行下列4步操作:(1)输出队首元素;(2)把队首元素值插入到队尾;(3)删除队首元素;(4)再次删除队首元素。

直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C3.给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?4.按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+E↑F5.试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列。

其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列。

例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

6.假设表达式由单字母变量和双目四则运算算符构成。

试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。

8.要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。

9.简述以下算法的功能(其中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ int i, n, A[255];n=0;while(!EmptyStack(S)){n++; Pop(&S, &A[n]);}for(i=1; i<=n; i++)Push(&S, A[i]);}(2)void proc_2(Stack S, int e) { Stack T; int d;InitStack(&T);while(!EmptyStack(S)){ Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){ Pop(&T, &d);Push( &S, d);}}(3)void proc_3(Queue *Q){ Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){ Pop(&S, &d);EnterQueue(Q,d)}}实习题1.回文判断。

《数据结构及其应用》笔记含答案 第三章_栈和队列

《数据结构及其应用》笔记含答案 第三章_栈和队列

第3章栈和队列一、填空题1、栈是限定仅在表尾进行插入或删除操作的线性表。

2、栈的修改是按照后进先出的原则进行的。

3、队是一种先进先出的线性表。

4、把队列头尾相接的顺序存储结构称为循环队列。

5、队列也是一种操作受限的线性表,允许插入的一端叫做__队尾___,允许删除的一端叫做__队头__。

二、判断题1、栈和队列的存储,既可以采用顺序存储结构,又可以采用链式存储结构。

(√)2、任何一个递归过程都可以转换成非递归过程。

(√)3、若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列3,2,5,6,4,1。

(√)4、通常使用队列来处理函数的调用。

(╳)5、循环队列通常用指针来实现队列的头尾相接。

(╳)三、单项选择题1、若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在(C)种情况。

A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。

2、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为(C)。

A.i B.n-i C.n-i+1 D.不确定解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。

3、数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为(D)。

A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。

数据结构练习题第三章栈、队列和数组习题及答案

数据结构练习题第三章栈、队列和数组习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。

在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。

6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。

int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。

Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

数据结构第三章栈和队列习题及答案

数据结构第三章栈和队列习题及答案

习题三栈和队列一单项选择题1. 在作进栈运算时,应先判别栈是否(① ),在作退栈运算时应先判别栈是否(② )。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。

①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/22.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。

A 可能是2B 一定是2C 可能是1D 一定是13. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?()A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 3 4 1 5 64.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6, s5,s1,则栈的容量至少应该是()A.2B. 3C. 5D.65. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。

A. |top[2]-top[1]|=0B. top[1]+1=top[2]C. top[1]+top[2]=mD. top[1]=top[2]6. 执行完下列语句段后,i值为:()int f(int x){ return ((x>0) ? x* f(x-1):2);}int i ;i =f(f(1));A.2 B. 4 C. 8 D. 无限递归7. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。

A. 3,2,4,1,1;(*^(+*-B. 3,2,8;(*^-C. 3,2,4,2,2;(*^(-D. 3,2,8;(*^(-8. 用链接方式存储的队列,在进行删除运算时()。

数据结构(C语言版)第三章习题解答

数据结构(C语言版)第三章习题解答

第三章习题解答1.分别写出对链栈的入栈和出栈操作的算法。

链栈的结点类型定义如下:Typedef struct stacknode {SElemtype data;struct stacknode *next;}stacknode, *linkstack;入栈操作:Status push( linkstack &S, SElemtype e){ p=(linkstack)malloc(sizeof(stacknode));If (!p) return ERROR;p->data=e;p->next=S;S=p;return OK;}出栈操作:Status pop(linkstack &S, SElemtype &e){ if (!S) return ERROR;p=s;s=p->next;free(p);return OK;}P24/3.15假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。

试编写实现这个双向栈tws的三个操作:初始化inistack(tws),入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么优缺点。

双栈的结构类型定义如下:typedef struct{Elemtype *base[2];Elemtype *top[2];}BDStacktype; //双向栈类型栈的初始化操作:status Init_Stack(BDStacktype &tws,int m)//初始化一个大小为m的双向栈tws{ tws.base[0]=(Elemtype*)malloc(m*sizeof(Elemtype));tws.base[1]=tws.base[0]+m-1;tws.top[0]=tws.base[0];tws.top[1]=tws.base[1];return OK;}入栈操作:Status push(BDStacktype &tws,int i,Elemtype x) // x入栈,i=0表示低端栈,i=1表示高端栈{ if (tws.top[0]>tws.top[1]) return OVERFLOW;//注意此时的栈满条件if (i==0) *tws.top[0]++=x;elseif (i==1) *tws.top[1]--=x;else return ERROR;return OK;}出栈操作:Status pop(BDStacktype &tws, int i, Elemtype &x) // x出栈,i=0表示低端栈,i=1表示高端栈{ if (i==0){ if (tws.top[0]==tws.base[0]) return OVERFLOW;x=*--tws.top[0];}else if (i==1){ if (tws.top[1]==tws.base[1]) return OVERFLOW;x=*++tws.top[1];}else return ERROR;return OK;}P24/3.18试写一个判别表达式中开、闭括号是否配对出现的算法。

数据结构习题解析第3章

数据结构习题解析第3章

第3章链表一、复习要点本章重点讨论最简单的链表结构——单链表。

详细地介绍了单链表的抽象数据类型,单链表的类定义,相应操作的实现,引入了带表头结点的单链表结构。

进一步定义了用模板描述的单链表类。

作为一种应用,讨论了一元多项式的类定义及其加法操作的实现。

此外,讨论了循环链表和双向链表。

在复习这一章时需要对C++ 语言中的指针和引用类型的使用有清楚的理解。

对带表头结点的链表和不带表头结点的链表在插入、删除、搜索时的差别有清楚的认识。

而且需要明确:链表是一种实现级的结构。

本章复习的要点:1、基本知识点单链表是一种线性结构,链表各结点的物理存储可以是不连续的,因此各结点的逻辑次序与物理存放次序可以不一致。

必须理解单链表的定义和特点,单链表的抽象数据类型和类定义,单链表成员函数,如构造函数、搜索、插入、删除等操作的实现,对比带表头结点单链表的搜索、插入、删除操作,比较其优缺点。

其次是循环链表的定义和特点,它与单链表的差别,它的搜索、插入、删除操作的实现。

最后是双向链表的定义,它的插入与删除操作的实现。

2、算法设计单链表的迭代求解算法,包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,在链表中第i个位置插入新结点,删去第i个结点,单链表各结点顺序逆转算法,在单链表中按从左到右和从右到左的顺序遍历的逆转链算法。

带表头结点的单链表的迭代算法,包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,在链表中第i个位置插入新结点,删去第i个结点,连续删除链表中含有value值的结点,两个有序链表的合并。

单链表的递归算法,包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,求链表各结点值的和,求链表各结点的值的平均值。

循环链表的迭代算法:包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,在链表中第i个位置插入新结点,删去第i个结点,将循环链表链入单链表的表头。

数据结构课后习题答案第三章

数据结构课后习题答案第三章

第三章栈和队列(参考答案)// 从数据结构角度看,栈和队列是操作受限的线性结构,其顺序存储结构// 和链式存储结构的定义与线性表相同,请参考教材,这里不再重复。

3.1 1 2 3 4 2 1 3 4 3 2 1 4 4 3 2 11 2 4 3 2 1 4 3 3 2 4 11 32 4 23 14 3 4 2 11 3 42 234 11 4 32 2 43 1设入栈序列元素数为n,则可能的出栈序列数为C2n n=(1/n+1)*(2n!/(n!)2)3.2 证明:由j<k和p j<p k说明p j在p k之前出栈,即在k未进栈之前p j已出栈,之后k进栈,然后p k出栈;由j<k和p j>p k说明p j在p k之后出栈,即p j被p k压在下面,后进先出。

由以上两条,不可能存在i<j<k使p j<p k<p i。

也就是说,若有1,2,3顺序入栈,不可能有3,1,2的出栈序列。

3.3 void sympthy(linklist *head, stack *s)//判断长为n的字符串是否中心对称{ int i=1; linklist *p=head->next;while (i<=n/2) // 前一半字符进栈{ push(s,p->data); p=p->next; }if (n % 2 !==0) p=p->next;// 奇数个结点时跳过中心结点while (p && p->data==pop(s)) p=p->next;if (p==null) printf(“链表中心对称”);else printf(“链表不是中心对称”);} // 算法结束3.4int match()//从键盘读入算术表达式,本算法判断圆括号是否正确配对(init s;//初始化栈sscanf(“%c”,&ch);while (ch!=’#’) //’#’是表达式输入结束符号switch (ch){ case ’(’: push(s,ch); break;case ’)’: if (empty(s)) {printf(“括号不配对”); exit(0);}pop(s);}if (!empty(s)) printf(“括号不配对”);else printf(“括号配对”);} // 算法结束3.5typedef struct // 两栈共享一向量空间{ ElemType v[m]; // 栈可用空间0—m-1int top[2] // 栈顶指针}twostack;int push(twostack *s,int i, ElemType x)// 两栈共享向量空间,i是0或1,表示两个栈,x是进栈元素,// 本算法是入栈操作{ if (abs(s->top[0] - s->top[1])==1) return(0);// 栈满else {switch (i){case 0: s->v[++(s->top)]=x; break;case 1: s->v[--(s->top)]=x; break;default: printf(“栈编号输入错误”); return(0);}return(1); // 入栈成功}} // 算法结束ElemType pop(twostack *s,int i)// 两栈共享向量空间,i是0或1,表示两个栈,本算法是退栈操作{ ElemType x;if (i!=0 && i!=1) return(0);// 栈编号错误else {switch (i){case 0: if(s->top[0]==-1) return(0);//栈空else x=s->v[s->top--];break;case 1: if(s->top[1]==m) return(0);//栈空else x=s->v[s->top++]; break;default: printf(“栈编号输入错误”);return(0);}return(x); // 退栈成功}} // 算法结束ElemType top (twostack *s,int i)// 两栈共享向量空间,i是0或1,表示两个栈,本算法是取栈顶元素操作{ ElemType x;switch (i){case 0: if(s->top[0]==-1) return(0);//栈空else x=s->v[s->top]; break;case 1: if(s->top[1]==m) return(0);//栈空else x=s->v[s->top]; break;default: printf(“栈编号输入错误”);return(0);}return(x); // 取栈顶元素成功} // 算法结束3.6void Ackerman(int m,int n)// Ackerman 函数的递归算法{ if (m==0) return(n+1);else if (m!=0 && n==0) return(Ackerman(m-1,1);else return(Ackerman(m-1,Ackerman(m,n-1))} // 算法结束3.7(1) linklist *init(linklist *q)// q是以带头结点的循环链表表示的队列的尾指针,本算法将队列置空{ q=(linklist *)malloc(sizeof(linklist));//申请空间,不判断空间溢出q->next=q;return (q);} // 算法结束(2) linklist *enqueue(linklist *q,ElemType x)// q是以带头结点的循环链表表示的队列的尾指针,本算法将元素x入队{ s=(linklist *)malloc(sizeof(linklist));//申请空间,不判断空间溢出s->next=q->next; // 将元素结点s入队列q->next=s;q=s; // 修改队尾指针return (q);} // 算法结束(3) linklist *delqueue(linklist *q)//q是以带头结点的循环链表表示的队列的尾指针,这是出队算法{ if (q==q->next) return (null); // 判断队列是否为空else {linklist *s=q->next->next; // s指向出队元素if (s==q) q=q->next; // 若队列中只一个元素,置空队列else q->next->next=s->next;// 修改队头元素指针free (s); // 释放出队结点}return (q);} // 算法结束。

数据结构教程第三版第三章课后习题答案

数据结构教程第三版第三章课后习题答案

scanf("%d",&a); if (a>0) { if ((qu->rear+1)%QueueSize==qu->front)
printf(" 队列满,不能入队\n"); else { qu->rear=(qu->rear+1)%QueueSize; //入队
qu->data[qu->rear]=a; } } else if (a<0) { if (qu->rear==qu->front)
QT[x]=s;
之后 //让 QT[x]仍指向尾结点
}
}
void Create(QNode *QH[],QNode *QT[]) //根据用户输入创建队列
{ int n,x,i;
printf("n:");
scanf("%d",&n);
for (i=0;i<n;i++)
{ do
{ printf("输入第%d 个数:",i+1);
{ tail->next=QH[i];
tail=QT[i];
}
}
printf("\n 输出所有元素:");
while (head!=NULL)
{ printf("%d ",head->data);
head=head->next;
}
printf("\n");
}
void main()
{ int i; QNode *QH[MAXQNode],*QT[MAXQNode]; //各队列的队头 QH 和队尾指针 QT for
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构第三章
T1223-3-28朱俊杰
一、原理讨论题:
1、顺序存储的三个优点:
1思路和实现都比较简单,容易理解。

2不用为表示结点间的逻辑关系而增加额外的存储空间。

3顺序表具有按元素序号随机访问的特点。

顺序比链式节约空间。

是因为链式结构每一个节点都有一个指针存储域。

顺序支持随机存取,方便操作
链式的要比顺序的方便
2、线性结构
3、顺序存储和链式存储
4、判断是否为空、求顺序表长度、遍历顺序表所有元素、读取一个结点、修改一个结点、插入一个结点、删除一个结点、顺序表所有元素反转。

二、理论基本题:
1
2
3
…i-1 i
i+1 …n

1
2
3
…i-1 i
i+1 …n

序号内容序号内容
插入前插入后
图2-3 顺序表中插入元素前后状态
0 1 2 3 … i-1 i i+1 … n-1 …
0 1 2 3 … i-1 i i+1 … n … 序号 内容
序号 内容 删除前
删除后
图2-4 顺序表中删除元素前后状态
图2-6 单链表的逻辑表示
线性链表
线性链表是具有链接存储结构的线性表,它用一组地址任意的存储单元存放线性表中的数据元素,逻辑上相邻的元素在物理上不要求也相邻,不能随机存取。

一般用结点描述:结点(表示数据元素)=数据域(数据元素的映象)+ 指针域(指示后继元素存储位置)。

概念
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。

链式存储方式即可以用于表示线性结构,也可用于表示非线性结构。

一般来说,在线性表的链式存储结构中,各数据结点的存储符号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。

对于线性链表,可以从头指针开始,沿各结点的指针扫描到链表中的所有结点。

线性表的查询操作在链表中的实现:
基本操作为: 使指针p始终指向线性表中第j个数据元

Status GetElem_L(LinkList L, int i, ElemType &e)// L 为带头结点的单链表的头指针。

当线性表中存在第i个元素时,则将第i个数据元素的值赋给e并返回OK,否则返回ERROR
{p = L->next; j = 1; // 初始化,p指向第一个结点,j为计数器
while (p && j){ //顺指针向后查找,直到p指向第i个元素或p为空
p = p->next; ++j;
if ( !p || j>i ) continue; // 第i个元素不存在
e = p->data; // 取第i个元素
return OK; }
}
直到第i个数据,才退出continue循环,并得到e=p->data,放回ok。

线性表的插入操作在链表中的实现:
基本操作为: 找到线性表中第i-1个结点,修改其指向后继的指针
有序对<ai-1, ai> 改变为<ai-1, e> 和<e, ai>
Status ListInsert_L(LinkList L, int i, ElemType e) {
// 在带头结点的单链表L中第i个数据元素之前插入数据元素e
p = L; j = 0;
if (!p|| j > i-1) return ERROR; // i小于1或者大于表长while (p && j < i-1)
{ p = p->next; ++j;
} // 寻找第i-1个结点
2
s =
(LinkList) malloc (sizeof (LNode)); // 生成新结点
s->data = e; s->next = p->next; // 插入L中
p->next = s;
return OK;
} // LinstInsert_L算法的时间复杂度
为:O(ListLength(L))
|带头结点的单链线性表编辑
在线性表的链接存储中,为了方便在表头插入和删除结点的操作,经常在表头结点(存储第一个元素的结点)的前面增加一个结点,称之为头结点或表头附加结点。

这样原来的表头指针由指向第一个元素的结点改为指向头结点,头结点的数据域为空,头结点的指针域指向第一个元素的结点。

定义一个带头结点的线性链表类型:
typedef struct LNode // 结点类型
{
char data;
struct LNode *next;
} *Link,*Position;
typedef struct // 链表类型
{ Link head, tail; // 指向头结点和最后一个结点
int len; // 指示链表长度
Link current; // 指向当前访问的结点的指针,初始位置指向头结点
}LinkList;
Status MakeNode( Link &p, ElemType e );
// 分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERROR
void FreeNode( Link &p ); // 释放p所指结点创建带头结点的单链线性表:
void CreateList_L(LinkList&L, int n) // 逆位序输入n个元素的值,建立带表头结点的、//单链线性表L。

{ L = (LinkList) malloc (sizeof (LNode));
L->next = NULL; // 先建立一个带头结点的单链表
for (i = n; i > 0; --i) {
p = (LinkList) malloc (sizeof (LNode)); // 生成新结点
scanf(“%d”,&p->data); // 输入元素值
p->next = L->next; L->next = p; // 插入到表头
}
}
本章的收获、体会:
malloc函数其作用是在动态存储区中分配一个长度为size 的连续空间。

此函数返回值是一个指向分配域起始地址的指
针(基类型为void).如果此函数未能分配成功地执行(例如内存空间不足)则返回空指针(NULL)。

calloc函数其作用是在内存的动态区存储中分配n个长度为size的连续空间,函数返回一个指向分配起始域地址的指针;如果分配不成功,返回NULL
free函数其作用是释放由P指向的内存区,使这部分内存区能被其它变量使用。

P是最近一次调用的calloc或malloc 函数时返回的值。

free无返回值。

define宏定义
线性表的两类不同的存储结构,不受空间限制,在节点的插入、删除方便,不用大量移动数据,数据结构中的线性表、顺序表和链表之间的特点和区别,数组就是顺序表,
单链表就是链表,可以线性的存贮数据,顺序表中的元素是按其物理位置排列的,链表是通过指针来描述其逻辑位置的,链表是指针与型结构体类型的一种结合体,链表的每一个节点都应该包含两个部分:节点数据和指向下一节点的指针。

因为下一节点具有与该节点相同的结构,所以链表节点的类型定义时,需要引用正在定义的类型的本身,与数组相比,链表在插入和删除节点时比的插入和删除要简单,开销更小,但链表不可随机访问它的节点,只能通过指向链表表头的指针顺序访问相应的节点。

相关文档
最新文档