采用顺序表、单链表二种存储结构

合集下载

数据结构第2章习题及答案

数据结构第2章习题及答案

7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。

则采用()存储方式最节省运算时间。

【北京理工大学 2000 一、1(2分)】A.单链表 B.双链表 C.单循环链表 D.带头结点的双循环链表8. 静态链表中指针表示的是(). 【北京理工大学 2001 六、2(2分)】A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址9. 链表不具有的特点是()【福州大学 1998 一、8 (2分)】A.插入、删除不需要移动元素 B.可随机访问任一元素C.不必事先估计存储空间 D.所需空间与线性长度成正比10. 下面的叙述不正确的是()【南京理工大学 1996 一、10(2分)】A.线性表在链式存储时,查找第i个元素的时间同i的值成正比B. 线性表在链式存储时,查找第i个元素的时间同i的值无关C. 线性表在顺序存储时,查找第i个元素的时间同i 的值成正比D. 线性表在顺序存储时,查找第i个元素的时间同i的值无关11. 线性表的表元存储方式有((1))和链接两种。

试指出下列各表中使用的是何种存储方式:表1是((2))存储方式;表2是((3))存储方式;表3是((4))存储方式;表4是((5))存储方式。

表左的s指向起始表元。

供选择的答案:A.连续B.单向链接C.双向链接D.不连接E.循环链接F.树状G.网状H.随机I.顺序J.顺序循环【上海海运学院 1995 二、1(5分)】12.(1) 静态链表既有顺序存储的优点,又有动态链表的优点。

所以,它存取表中第i个元素的时间与i无关。

(2) 静态链表中能容纳的元素个数的最大数在表定义时就确定了,以后不能增加。

(3) 静态链表与动态链表在元素的插入、删除上类似,不需做元素的移动。

以上错误的是()【南京理工大学 2000 一、3(1.5分)】A.(1),(2) B.(1) C.(1),(2),(3) D.(2)13. 若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为()(1Rlink=p;p->Llink->Rlink=q;q->Llink=q;B. p->Llink=q;p->Llink->Rlink=q;q->Rlink=p;q->Llink=p->Llink;C. q->Rlink=p;q->Llink=p->Llink;p->Llink->Rlink=q;p->Llink=q;D. q->Llink=p->Llink;q->Rlink=q;p->Llink=q;p->Llink=q;24.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:()。

《数据结构》填空作业题(答案)

《数据结构》填空作业题(答案)

《数据结构》填空作业题答案第 1 章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。

2.程序包括两个内容:数据结构和算法。

3.数据结构的形式定义为:数据结构是一个二元组:Data Structure =( D, S)。

4.数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。

5.数据的逻辑结构可以分类为线性结构和非线性结构两大类。

6.在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。

7.在树形结构中,数据元素之间存在一对多的关系。

8.数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构。

9.数据的逻辑结构包括线性结构、树形结构和图形结构 3 种类型,树型结构和有向图结构合称为非线性结构。

10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。

11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。

12.数据的存储结构可用 4 种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。

13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多。

14.数据结构在物理上可分为顺序存储结构和链式存储结构。

15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。

16.数据元素可由若干个数据项组成。

17.算法分析的两个主要方面是时间复杂度和空间复杂度。

18.一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。

19.算法具有如下特点:有穷性、确定性、可行性、输入、输出。

20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。

数据结构简答题和论述题

数据结构简答题和论述题

数据结构简答题和论述题1、试描述数据结构和抽象数据类型的概念与程序设计语⾔中数据类型概念的区别。

【解答】数据结构是指相互之间存在⼀定关系的数据元素的集合。

⽽抽象数据类型是指⼀个数据结构以及定义在该结构上的⼀组操作。

程序设计语⾔中的数据类型是⼀个值的集合和定义在这个值集上⼀组操作的总称。

抽象数据类型可以看成是对数据类型的⼀种抽象。

串:是零个或多个字符组成的有限序列。

串是⼀种特殊的线性表,它的每个结点仅由⼀个字符组成。

空串 :长度为零的串,它不包含任何字符。

空⽩串 :仅由⼀个或多个空格组成的串⼦串 :串中任意个连续字符组成的⼦序列称为该串的⼦串。

串变量和串常量通常在程序中使⽤的串可分为:串变量和串常量。

(1)串变量 :串变量和其它类型的变量⼀样,其取值是可以改变的。

(2)串常量 :串常量和整常数、实常数⼀样,在程序中只能被引⽤但不能改变其值。

即只能读不能写。

(1)树形图表⽰: 树形图表⽰是树结构的主要表⽰⽅法。

(2)树的其他表⽰法① 嵌套集合表⽰法:是⽤集合的包含关系来描述树结构。

② 凹⼊表表⽰法:类似于书的⽬录③ ⼴义表表⽰法:⽤⼴义表的形式表⽰的。

上图 (a)树的⼴义表表⽰法如下:(A(B(E,F(I,J)), C,D(G,H)))1.中序遍历的递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1)遍历左⼦树; (2)访问根结点; (3)遍历右⼦树。

2.先序遍历的递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1) 访问根结点; (2) 遍历左⼦树; (3) 遍历右⼦树。

3.后序遍历得递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1)遍历左⼦树; (2)遍历右⼦树; (3)访问根结点。

2、链表具有的特点是B 插⼊、删除不需要移动元素C 不必事先估计存储空间D 所需空间与线性表长度成正⽐顺序队列(1)队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

(2) 顺序队列的表⽰①和顺序表⼀样顺序队列⽤⼀个向量空间存放当前队列中的元素。

数据结构课后题答案

数据结构课后题答案
if(pa) /*若表A未完,将表A中后续元素链到新表C表*/ { smaller=pa; pa=pa->next; smaller->next = c->next; c->next = smaller; } /*否则将表B中后续元素链到新表C表尾*/
else {
smaller=pb; pb=pb->next; smaller->next = c->next; c->next = smaller; }
return(C); }
西北大学可视化技术研究所
10.已知有单链表表示的线性表中含有三类字 符的数据元素(如字母字符,数字字符和其它 字符),试编写算法来构造三个以循环链表表 示的线性表,使每个表中只含同一类的字符, 且利用原表中的结点空间作为这三个表的结点 空间,头结点可另辟空间。
西北大学可视化技术研究所
西北大学可视化技术研究所
答案:435612不可以 原因 (1)S:1234 X:43 (2)S:5 X: 5 (3)S:6 X: 6 (4)X:21 135426 可以 原因(1)S:1 X:1 (2)S:23 X: 3 (3)S:45 X: 54 (4)X:2 (5)S:6 X: 6
西北大学可视化技术研究所
G. S->next= NULL; 。
西北大学可视化技术研究所
供选择的语句有:
A. P->next=S; B. P->next= P->next->next; C. P->next= S->next;
E. S->next= P->next; F. S->next= L;
G. S->next= NULL;

大学课程《数据结构》课后习题答案

大学课程《数据结构》课后习题答案

大学课程《数据结构》课后习题答案第 1 章绪论课后习题讲解1.填空⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

【解答】数据元素⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。

【解答】数据项,数据元素【分析】数据结构指的是数据元素以及数据元素之间的关系。

⑶ 从逻辑关系上讲,数据结构主要分为()、()、()和()。

【解答】集合,线性结构,树结构,图结构⑷ 数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。

【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系⑸ 算法具有五个特性,分别是()、()、()、()、()。

【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性⑹ 算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。

【解答】自然语言,程序设计语言,流程图,伪代码,伪代码⑺在一般情况下,一个算法的时间复杂度是()的函数。

【解答】问题规模⑻ 设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。

【解答】Ο(1),Ο(nlog2n)【分析】用大O 记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。

2.选择题⑴ 顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。

A 线性结构B 非线性结构C 存储位置D 指针【解答】C,D【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。

⑵ 假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。

则表示该遗产继承关系的最合适的数据结构应该是()。

《数据结构》习题及答案:第2章 线性表(第1次更新2012-3)

《数据结构》习题及答案:第2章 线性表(第1次更新2012-3)

第2章线性表一、选择题1.表长为N 的顺序表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为(),删除一个元素需要移动的元素个数为()。

【**,★】A. (N-1)/2B. NC. N+1D. N-1E. N/2F. (N+1)/2G. (N-2)/22.线性表是具有N 个()的有限序列。

【*】A、表元素B、字符C、数据元素D、数据项E、信息3.“线性表的逻辑顺序和物理顺序总是一致的。

”这个结论是()。

【*】A、正确的B、错误的C、不一定,与具体结构有关。

4.线性表采用链式存储结构时,要求内存中可用存储单元的地址()。

【*,★】A、必须是连续的B、部分地址必须是连续的C、一定是不连续的D、连续或不连续都可以。

5.带头结点的单链表为空的判定条件是()。

【*】A、head==NULLB、head->next==NULLC、head->next==headD、head!=NULL6.不带头结点的单链表head 为空的判定条件是()。

【*】A、head==NULLB、head->next==NULLC、head->next==headD、head!=NULL7.非空的循环单链表head 的尾结点P 满足()。

(注:带头结点)【*】A、P->NEXT=NULLB、p=NULLC、p->next==headD、p==head8.在一个具有n 个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()。

【*,★】A、O(1)B、O(n)C、O(n2)D、O(nlog2n)9.在一个单链表中,若删除P 所指结点的后继结点,则执行()。

【*,★】A、p->next=p->next->nextB、p=p->next;p->next=p->next->nextC、p->next=p->next;D、p=p->next->next;10.在一个单链表中,若在P所指结点之后插入S所指结点,则执行()。

线性表作业

scanf("%d",&a[i]);
convert(a);
printf("改变后的顺序为\n");
for(i=0;i<=N-1;i++)
printf("%d ",a[i]);
}
#include<stdio.h>
#include<malloc.h>
#define N 10
typedef struct LNode
二、填空题
1.以下为顺序表的定位运算,分析算法,请在________处填上正确的语句。
int locate_sqlist(sqlist L,datatype X)
/*在顺序表L中查找第一值等于X的结点。若找到回传该结点序号;否则回传0*/
{__intI;______;
while((i≤st)&&(L.data[i-1]!=X))i++;
A.rear和rear->next->next
B.rear->next和rear
C.rear->next->next和rear
D.rear和rear->next
9.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:(B)。
A.p->next=s;s->next=p->next; B.s->next=p->next;p->next=s;
for(m=0;;m++)
{
printf("请输入%d下一个元素所对应的下标,输入-1结束\n",i);
scanf("%d",&n);

数据结构简答题

试比较顺序存储结构和链式存储结构的优缺点。

在什么情况下用顺序表比链表好答:①顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。

优点:存储密度大(=1),存储空间利用率高。

缺点:插入或删除元素时不方便。

②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针优点:插入或删除元素时很方便,使用灵活。

缺点:存储密度小(<1),存储空间利用率低。

顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。

若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。

一棵度为2的有序树与一棵二叉树有何区别答:一棵度为二的有序树与一棵二叉树的区别在于:有序树的结点次序是相对于另一结点而言的,如果有序树中的子树只有一个孩子时,这个孩子结点就无须区分其左右次序.而二叉树无论其孩子数是否为2,均需确定其左右次序,也就是说二叉树的结点次序不是相对于另一结点而言而是确定的。

简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

数据是对客观事物的符号表示。

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

是对一般数据类型的扩展。

试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。

数据结构复习题

2017 ~2018学年度第2学期《数据结构》复习提纲1.在数据结构中,从逻辑上可以把数据结构分为_________两类。

A.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.内部结构和外部结构2.链表不具有的特点是_________。

A.可随机访问任一元素B.插入、删除不需要移动的元素C.不必事先估计存储空间D.所需空间与线性表长度成正比3.若线性表最常用的运算是存取第i个元素及其前驱元素,则采用_________存储方式节省时间。

A.单链表B.双链表C.循环单链表D.顺序表4.算法分析的目的是_________。

A.找出数据结构的合理性B.研究算法中的输入和输出关系C.分析算法的效率以求改进D.分析算法的易读性和文档性5.若一个栈用数组data[1..n]存储,初始栈顶指针top为0,则以下元素x进栈的操作正确的是_________。

A.top++; data[top]=x;B.data[top]=x; top++;C.top--; data[top]=x;D.data[top]=x; top--;6.表达式a*(b+c)-d的后缀表达式是_________。

A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd7.递归函数f(1)=1,f(n)=f(n-1)+n(n>1)的递归出口是_________。

A.f(1)=1B.f(1)=0C.f(0)=0D.f(n)=n8.将递归算法转换成对应的非递归算法时,通常需要使用_________保存中间结果。

A.队列B.栈C.链表D.树9.对稀疏矩阵采用压缩存储,其缺点之一是_________。

A.无法判断矩阵有多少行、多少列B.无法根据行、列号查找某个矩阵元素C.无法根据行、列号直接计算矩阵元素的存储地址D.使矩阵元素之间的逻辑关系更加复杂10.一个n阶上三角矩阵a按行优先顺序压缩存放在一维数组b中,则b中的元素个数是_________。

数据结构复习题及答案

数据结构习题一、名词解释1. 数据、数据元素、数据项、数据结构、数据的逻辑结构、数据物理结构、顺序存储、链式存储、算法、时间复杂度、空间复杂度。

2. 线性表、顺序表、单链表、双向链表、循环链表、双向循环链表、三个概念的区别:头指针、头结点、首元结点(第1个元素结点)。

3. 栈(顺序栈、链栈)、队列(顺序队、链队)、循环队列、递归、稀疏矩阵、三元组。

4. 树、叶子结点、结点的度、树的度、树的高(深)度、二叉树、遍历、满二叉树、完全二叉树、哈夫曼树、WPL、哈夫曼编码。

5. 图(有向、无向)、网、边、弧、度、入度、出度、完全图(有向、无向)、(强)连通图(分量)、(最小)生成树、邻接矩阵、邻接表、DFS、BFS。

6. 查找表、关键字、静态查找、动态查找、ASL、顺序查找、折半查找、分块查找、二叉排序树。

7、排序、内(外)排序、稳定性、插入(直接、希尔),交换(起泡、快速),选择(直接、堆),2路归并。

一、填空题1.数据结构是研究数据的_逻辑结构__和___物理结构__,并在这种结构上定义相关的运算,设计实现这些运算的算法,分析算法的效率。

算法的效率包括时间和空间两个方面,分别称为___时间复杂度____和__空间复杂度___。

2.数据的基本单位是__数据元素__ ,数据的最小单位是__数据项_ 。

3.算法是对特定问题求解___步骤___的一种描述,是指令的有限序列。

4.一个算法的时间复杂度为(3n3+2n—7),其数量级表示为O(n3)_。

5.一个算法具有5个特性:确定性、可行性、有穷性、输入和输出。

6.算法性能的分析和度量,可以从算法的时间复杂度和空间复杂度来评价算法的优劣。

7.数据的逻辑结构包括集合结构、线性结构、树形结构和图型结构四种类型。

8.数据结构在计算机中的表示称为数据的物理结构,它可以采用__顺序存储___或__链式存储_两种存储方法。

9.线性表有两种存储结构,分别为顺序存储和链式存储。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京信息工程大学数据结构实验(实习)报告实验(实习)名称顺序表、单链表实验(实习)日期2015-10-11 得分指导教师顾韵华系计软院专业计科年级2014级班次 2 姓名一、实验目的1、掌握采用顺序表、单链表二种存储结构实现线性表的归并运算。

二、实验内容1、输入两个顺序表A和B的元素值(整数),元素递增有序,编写程序将A和B归并成一个按元素值递增有序的顺序表C。

分别输出顺序表A、B和C所有元素的值。

2、输入两个单链表A和B的元素值(整数),其表中元素递增有序,编写程序将A和B归并成一个按元素值递增有序的单链表C。

分别输出单链表A、B和C所有结点的值。

三、数据结构设计和实现1、顺序表数据结构设计和实现#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <time.h>//常量定义#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OK 1#define ERROR 0#define OVERFLOW -2#define True 1#define False 0//函数返回值类型定义typedef int Status;//表节点数据类型定义typedef int ElemType;//顺序表类型定义typedef struct{ElemType *elem;int length;int listsize;} SqList;//顺序表各操作声明Status InitList_Sq(SqList &L);Status DetroyList_Sq(SqList &L);Status ClearList_Sq(SqList &L);int ListEmpty_Sq(SqList L);int ListLength_Sq(SqList L);Status GetElem_Sq(SqList L,int i,ElemType &e);Status ListInsert_Sq(SqList &L,int i,ElemType e);Status ListDelete_Sq(SqList &L,int i,ElemType &e);void PrintList_Sq(SqList L);void MergeList(SqList La,SqList Lb,SqList &Lc);#include"link.h"#include"iostream.h"Status InitList_Sq(SqList &L){L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem) exit(OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZE;return OK;}Status DetroyList_Sq(SqList &L){ if (L.elem) free(L.elem);return OK;}Status ClearList_Sq(SqList &L){ if (L.elem){ L.length=0;L.listsize=0;}return OK;}int ListEmpty_Sq(SqList L){return (L.length==0);}int ListLength_Sq(SqList L){cout<<L.length;return 0;}Status GetElem_Sq(SqList L,int i,ElemType &e){if (i<1 || i>=L.length)return ERROR;e=L.elem[i-1];return OK;}Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase,*p,*q;if (i<1 || i>L.length+1)return ERROR;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++;return OK;}Status ListDelete_Sq(SqList &L,int i,ElemType &e){ElemType *p,*q;if (i<1 || i>L.length)return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for (++p;p<q;++p)*(p-1)=*p;L.length--;return OK;}void PrintList_Sq(SqList L){int i;if (L.length==0)cout<<"该表为空"<<endl;elsefor (i=0;i<L.length;i++)cout<<L.elem[i]<<" ";}#include "link.h"#include"iostream.h"void MergeList(SqList La,SqList Lb,SqList &Lc){int *pa;pa=La.elem;int *pb;pb=Lb.elem;Lc.listsize=Lc.length=La.length+Lb.length;int *pc;pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));if(!Lc.elem)exit(OVERFLOW);//存储分配失败int *pa_last;pa_last=La.elem+La.length-1;int *pb_last;pb_last=Lb.elem+Lb.length-1;while(pa<=pa_last&&pb<=pb_last){//归并if(*pa<=*pb) *pc++=*pa++;else *pc++=*pb++;}while(pa<=pa_last) *pc++=*pa++;while(pb<=pa_last) *pc++=*pb++;}//MergeList_Lint main(){SqList L1,L2,L3;ElemType e;int i;InitList_Sq(L1); //构造空的单链表L1InitList_Sq(L2); //构造空的单链表L2printf("请输入表L1元素值,共5个\n");for (i=0;i<5;i++){ scanf("%d",&e);ListInsert_Sq(L1,i+1,e); //向表中插入用户输入的元素值}printf("请输入表L2元素值,共3个\n");for (i=0;i<3;i++){ scanf("%d",&e);ListInsert_Sq(L2,i+1,e); //向表中插入用户输入的元素值}//合并L1和L2MergeList(L1,L2,L3);//输出合并后表L3的各个元素值printf("L1与L2合并后的表元素值为:\n");PrintList_Sq(L3);printf("\n");return 0;}2、单链表数据结构设计和实现typedef struct LNode{ElemType data;struct LNode *next; //next为指向LNode类型节点的指针}LNode,*LinkList; //LNode为节点类型,LinkList为指向LNode类型节点的指针(即头指针)单链表操作的函数原型包括:Status InitList(LinkList &L); //构造一个新的链表LStatus DestroyList(LinkList &L); //销毁线性表LStatus ClearList(LinkList &L); //将线性表L重置为空表int ListEmpty(LinkList L); //判断L是否为空表int ListLength(LinkList L); //返回L中数据元素的个数Status GetElem(LinkList L,int i,ElemType &e); //用e返回L中第i个数据元素的值int LocateElem(LinkList L,ElemType e); //判断e是否存在于L中Status ListInsert(LinkList &L,int i,ElemType e); //在L中第i个位置之前插入数据元素eStatus ListDelete(LinkList &L,int i,ElemType &e); //删除L中第i个数据元素,并用e返回其值void PrintList(LinkList L); //输出顺序表中的数据元素void DeleteElem(LinkList &L,ElemType e); //删除线性表中所有值为e的结点void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc); //链表的二路归并单链表各操作实现:Status InitList(LinkList &L) //构造一个新的有头节点的空链表L{L=(LinkList)malloc(sizeof(LNode)); //生成新节点(此处为头节点)L->next=NULL; //头节点的指针域指向NULLif(!L) return ERROR;return OK;}//InitListStatus DestroyList(LinkList &L) //销毁链表L{LinkList p,r;p=L->next; r=p->next;while(p!=NULL){free(p);p=r;r=p->next;}free(L);return OK;}//DestroyListStatus ClearList(LinkList &L) //将链表L重置为空表{LinkList p,r;p=L->next; r=p->next;while(p!=NULL){free(p);p=r;r=p->next;}L->next=NULL;return OK;}//ClearListint ListEmpty(LinkList L) //判断L是否为空表{return (L->next==NULL);}//ListEmptyint ListLength(LinkList L) //返回L中元素结点个数{LinkList p; p=L;int i=0;while(p->next!=NULL){p=p->next;i++;}return i;}//ListLengthStatus GetElem(LinkList L,int i,ElemType &e) //用e返回L中第i个数据元素的值{LinkList p=L;int j=0;while(p!=NULL&&j<i){p=p->next;j++;}if(p==NULL||j>i-1) return ERROR;e=p->data;return OK;}//GetElemint LocateElem(LinkList L,ElemType e) //判断e是否存在于L中{LinkList p=L;int i=0;while(p->next!=NULL){p=p->next;i++;if(p->data==e)return i;}return 0;}//LocateElemStatus ListInsert(LinkList &L,int i,ElemType e) //在L中第i个位置之前插入数据元素e{LinkList p=L,s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;}if(p==NULL||j>i-1) return ERROR;s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return OK;}//ListInsertStatus ListDelete(LinkList &L,int i,ElemType &e) //删除L中第i个数据元素,并用e 返回其值{LinkList p=L,q;int j=0;while(p->next!=NULL&&j<i-1){p=p->next;j++;}if(p->next==NULL||j>i-1) return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}//ListDeletevoid PrintList(LinkList L){LinkList p=L->next;while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}//PrintListvoid DeleteElem(LinkList &L,ElemType e) //删除线性表中所有值为e的结点{LinkList p=L,q;while(p->next!=NULL){q=p->next;if(q->data==e){p->next=q->next;free(q);}elsep=p->next;}}//DeleteElemvoid MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) //链表的二路归并{LinkList pa,pb,pc;pa=La->next; pb=Lb->next;Lc=pc=La;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;free(Lb);}//MergeList四、程序调试1、顺序表的实现:采用多文件结构,创建程序的过程为:(1)先创建一个工程(2)再新建头文件(3)最后写源程序操作结果:2、单链表的实现:采用多文件结构,创建程序的过程为:(1)先创建一个工程(2)再新建头文件(3)最后写源程序操作结果:调试过程中遇到的问题:写顺序表的时候添加了排序的函数,多文件程序要注意头文件的添加。

相关文档
最新文档