数据结构与算法(线性表)练习题
《数据结构与算法》课后习题答案

2.3 课后习题解答2.3.2 判断题1.线性表的逻辑顺序与存储顺序总是一致的。
〔×〕2.顺序存储的线性表可以按序号随机存取。
〔√〕3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
〔×〕4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有一样的特性,因此属于同一数据对象。
〔√〕5.在线性表的顺序存储构造中,逻辑上相邻的两个元素在物理位置上并不一定相邻。
〔×〕6.在线性表的链式存储构造中,逻辑上相邻的元素在物理位置上不一定相邻。
〔√〕7.线性表的链式存储构造优于顺序存储构造。
〔×〕8.在线性表的顺序存储构造中,插入和删除时移动元素的个数与该元素的位置有关。
〔√〕9.线性表的链式存储构造是用一组任意的存储单元来存储线性表中数据元素的。
〔√〕10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储构造。
〔×〕11.静态链表既有顺序存储的优点,又有动态链表的优点。
所以它存取表中第i 个元素的时间与i 无关。
〔×〕12.线性表的特点是每个元素都有一个前驱和一个后继。
〔×〕2.3.3 算法设计题1.设线性表存放在向量A[arrsize] 的前 elenum 个分量中,且递增有序。
试写一算法,将x 插入到线性表的适当位置上,以保持线性表的有序性,并且分析算法的时间复杂度。
【提示】直接用题目中所给定的数据构造〔顺序存储的思想是用物理上的相邻表示逻辑上的相邻,不一定将向量和表示线性表长度的变量封装成一个构造体〕,因为是顺序存储,分配的存储空间是固定大小的,所以首先确定是否还有存储空间,假设有,那么根据原线性表中元素的有序性,来确定插入元素的插入位置,后面的元素为它让出位置,〔也可以从高低标端开始一边比拟,一边移位〕然后插入x ,最后修改表示表长的变量。
int insert (datatype A[],int *elenum,datatype x)/* 设 elenum 为表的最大下标*/ {if (*elenum==arrsize-1)return 0;/* 表已满,无法插入*/else {i=*elenum;while (i>=0 && A[i]>x)/* 边找位置边移动*/{A[i+1]=A[i];i--;}/* 插入成功 */A[i+1]=x;(*elenum)++;return 1;}}时间复杂度为O(n) 。
!数据结构作业-线性表

B n-i-1
C n-i
D n-i+1
单选题 1分
17. 要在一个顺序表 {a1,……,an}中第i个数据元素 ai(1≤i≤n)前插入一个数据元 素,需要移动( )个数据元素。
Ai
B n-i-1
C n-i
D n-i+1
单选题 1分
18. 在n个结点的顺序表中,算法 的时间复杂度是O(1)的操作是:
正常使用主观题需2.0以上版本雨课堂
单选题 1分
10. 对于一个头指针为head的 带头结点的单链表,判定该表 为空表的条件是( )
A head==NULL B head→next==NULL C head→next==head D head!=NULL
单选题 1分
11. 在一个单链表中,已知p的 后继是q,即p-〉next=q,若在 p,q之间插入s结点,则执行( ) 操作
单选题 1分
26.线性表( a1,a2,…,an)以链 接方式存储时,访问第i位置 元素的时间复杂性为( )
A O(i) B O(1) C O(n) D O(i-1)
单选题 1分
27. 链接存储的存储结构所占 存储空间:
分两部分,一部分存放结点值,另一 A 部分存放表示结点间关系的指针
B 只有一部分,存放结点值
C
只有一部分,存储表示结 点间关系的指针
分两部分,一部分存放结点值, D 另一部分存放结点所占单元数
单选题 1分
28.循环单链表头指针为head, 尾指针为rear,则下列条件成 立的是( )
A rear->next= =head
B
rear->next->next= =head
数据结构练习题线性表习题及答案

数据结构练习题线性表习题及答案精品文档第二章线性表一.名词解释1.线性结构2.数据结构的顺序实现3.顺序表4.链表5.数据结构的链接实现6. 建表7.字符串8.串9.顺序串 10.链串二、填空题1.为了便于讨论,有时将含n(n>=0)个结点的线性结构表示成(a,a,……a),其中每n12个a代表一个______。
a称为______结点,a称为______结点,i称为a在线性表中的________ii1n或______。
对任意一对相邻结点a、a(1<=i<n),a称为a的直接______a称为a的直iii┼1i┼1┼i1i接______。
< bdsfid="75" p=""></n),a称为a的直接______a称为a的直iii┼1i┼1┼i1i接______。
<>2.为了满足运算的封闭性,通常允许一种逻辑结构出现不含任何结点的情况。
不含任何结点的线性结构记为______或______。
3.线性结构的基本特征是:若至少含有一个结点,则除起始结点没有直接______外,其他结点有且仅有一个直接______;除终端结点没有直接______外,其它结点有且仅有一个直接______.4.所有结点按1对1的邻接关系构成的整体就是______结构。
5.线性表的逻辑结构是______结构。
其所含结点的个数称为线性表的______,简称______.6.表长为O的线性表称为______7.线性表典型的基本运算包括:______、______、______、______、______、______等六种。
8.顺序表的特点是______。
9.顺序表的类型定义可经编译转换为机器级。
假定每个datatype 类型的变量占用k(k>=1)个内存单元,其中,b是顺序表的第一个存储结点的第一个单元的内存地址,那么,第i个结点a的存储地址为______。
《算法与数据结构》第1~3章 习题(包含了线性表、栈和队列,含答案)

{ p=p1; p1=p1->next; p->next= pa->next; pa->next= p; p2= p2->next;s1=s1+1;};
的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是(C)。
A. 6 B. 4 C. 3 D. 2
13.若用一个大小为6的数组来实现循环队列,且当前rear和
front的值分别为0和3,当从队列中删除一个元素,再加入两个
元素后,rear和front的值分别为多少?(B)
A. 1和 5 B. 2和4 C. 4和2 D. 5和1
10. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对
象栈和算符栈为( D ),其中^为乘幂 。
• 3,2,4,1,1;*^(+*- B. 3,2,8;*^- C. 3,2,4,2,2;*^(-
D. 3,2,8;*^(-
算法与数据结构
第1~3章 习题课
5 /31
11.循环队列存储在数组A[0..m]中,则入队时的操作为(D)。
C. q->next=p;q->pre=p->pre;p->pre->next=q;p->pre=q;
D. q->pre=p->pre;q->next=q;p->pre=q;p->pre=q; 5.栈的特点是( B ),队列的特点是( A ),栈和队列都是 ( A )。若进栈序列为1,2,3,4 则( C )不可能是一个出栈序 列(不一定全部进栈后再出栈);若进队列的序列为1,2,3,4 则 ( E )是一个出队列序列。 ①, ②: A. 先进先出 B. 后进先出 C. 进优于出 D. 出 优于进
《数据结构》习题及答案:第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所指结点,则执行()。
《数据结构》练习题库

二、填空题1. 线性表是一种典型的___线性______结构。
2. 在一个长度为n的顺序表的第i个元素之前插入一个元素,需要后移__n-i+1__个元素。
3. 顺序表中逻辑上相邻的元素的物理位置__相邻______。
4. 要从一个顺序表删除一个元素时,被删除元素之后的所有元素均需向__前___移一个位置,移动过程是从_前____向_后____依次移动每一个元素。
5. 在线性表的顺序存储中,元素之间的逻辑关系是通过__物理存储位置_____决定的;在线性表的链接存储中,元素之间的逻辑关系是通过__链域的指针值_____决定的。
6. 在双向链表中,每个结点含有两个指针域,一个指向___前趋____结点,另一个指向____后继___结点。
7. 当对一个线性表经常进行存取操作,而很少进行插入和删除操作时,则采用___顺序__存储结构为宜。
相反,当经常进行的是插入和删除操作时,则采用__链接___存储结构为宜。
8. 顺序表中逻辑上相邻的元素,物理位置__一定_____相邻,单链表中逻辑上相邻的元素,物理位置___不一定____相邻。
9. 线性表、栈和队列都是__线性_____结构,可以在线性表的___任何___位置插入和删除元素;对于栈只能在___栈顶____位置插入和删除元素;对于队列只能在___队尾____位置插入元素和在___队头____位置删除元素。
10. 根据线性表的链式存储结构中每个结点所含指针的个数,链表可分为__单链表_______和__双链表_____;而根据指针的联接方式,链表又可分为__循环链表______和__非循环链表______。
11. 在单链表中设置头结点的作用是__使空表和非空表统一______。
12. 对于一个具有n个结点的单链表,在已知的结点p后插入一个新结点的时间复杂度为_o(1)_____,在给定值为x的结点后插入一个新结点的时间复杂度为__o(n)_____。
13. 对于一个栈作进栈运算时,应先判别栈是否为__栈满_____,作退栈运算时,应先判别栈是否为_栈空______,当栈中元素为m时,作进栈运算时发生上溢,则说明栈的可用最大容量为___m____。
(完整版)数据结构与算法试题

一、选择题1. 在逻辑上能够把数据结构分红(A)A. 线性结构和非线性结构B. 动向结构和静态结构C.紧凑结构和非紧凑结构D.内部结构和外面结构2. 单链表中各结点之间的地点(C)A. 一定连续B.部分一定连续C.不必定连续D.以上均不对3. 在一个长度为 n 的次序表中向第 i 个元素( 0<i<=n+1 )以前插入一个新元素时,需向后挪动(B )个元素。
A 、n-iB、n-i+1C、n-i-1D、 i4. 插入和删除操作只好在一端进行的线性表,称为(C )。
A. 行列B. 线性表C. 栈D.循环行列5、行列是仅同意在()进行插入,而在()进行删除。
(A )A. 队尾,队首B. 队尾,队尾C. 队首,队尾D. 队首,队首6. 链表合适于(A )查找。
A. 次序B.二分C.随机D.次序或二分7. 数据的基本单位是(A )。
A. 数据元素B.数据结构C.数据项D.数据对象8. 以下哪个不是算法的特征(B )。
A. 有穷性B. 可数性C.可行性D.确立性9. 在表长为 n 的次序表中进行线性查找,它的均匀查找长度为(B )。
A.ASL=nB.ASL=(n+1)/2C.ASL=n+1 D.ASL=log2n10. 一个线性表第一个元素的储存地点是 320,每个元素的长度为 3,则第五个元素的地点是(C )。
11. 设 front 、rear 分别为循环双向链表结点的左指针和右指针,则指针 P 所指的元素是双循环链表 L 的尾元素的条件是(D )。
A.P==LB.P->front==LC.P==NULLD.P->rear==L12. 已知 P 为单链表中的非首尾结点,删除 P 结点的后继结点 Q 的语句为(A )。
A.P->NEXT=Q->NEXT;FREE(Q);B.Q->NEXT=P; FREE(Q);C.Q->NEXT=P->NEXT;FREE(Q);D.P->NEXT=S;S->NEXT=P; B第1页共16页 1A.SQ->rear==SQ->frontB. (SQ->rear+1)%MAXLEN==SQ->frontC.SQ->rear==0D. SQ->front==014. 一组记录的排序码为( 46, 79,56, 38, 40, 84),则利用堆排序的方法成立的初始堆 为(B )。
数据结构与算法测试题+参考答案

数据结构与算法测试题+参考答案一、单选题(共80题,每题1分,共80分)1、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间?A、仅有头指针的单循环链表B、双链表C、仅有尾指针的单循环链表D、单链表正确答案:C2、数据结构研究的内容是()。
A、数据的逻辑结构B、数据的存储结构C、建立在相应逻辑结构和存储结构上的算法D、包括以上三个方面正确答案:D3、下列关于无向连通图特征的叙述中,正确的是:所有顶点的度之和为偶数边数大于顶点个数减1至少有一个顶点的度为1A、只有1B、1和2C、1和3D、只有2正确答案:A4、下面的程序段违反了算法的()原则。
void sam(){ int n=2;while (n%2==0) n+=2;printf(“%d”,n);}A、确定性B、可行性C、有穷性D、健壮性正确答案:C5、对任意给定的含 n (n>2) 个字符的有限集 S,用二叉树表示 S 的哈夫曼编码集和定长编码集,分别得到二叉树 T1 和 T2。
下列叙述中,正确的是:A、出现频次不同的字符在 T2 中处于相同的层B、出现频次不同的字符在 T1 中处于不同的层C、T1 的高度大于 T2 的高度D、T1 与 T2 的结点数相同正确答案:A6、数据序列{ 3,2,4,9,8,11,6,20 }只能是下列哪种排序算法的两趟排序结果?A、快速排序B、选择排序C、插入排序D、冒泡排序正确答案:A7、设散列表的地址区间为[0,16],散列函数为H(Key)=Key%17。
采用线性探测法处理冲突,并将关键字序列{ 26,25,72,38,8,18,59 }依次存储到散列表中。
元素59存放在散列表中的地址是:A、11B、9C、10D、8正确答案:A8、采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是:A、每次划分后,先处理较短的分区可以减少递归次数B、递归次数与每次划分后得到的分区处理顺序无关C、递归次数与初始数据的排列次序无关D、每次划分后,先处理较长的分区可以减少递归次数正确答案:B9、以下数据结构中,()是非线性数据结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、写一个算法合并两个已排序的线性表。
(用两种方法:数组表示的线性表(顺序表)和指针表示的线性表(链表))要求:1、定义线性表节点的结构,并定义节点的型和位置的型。
2、定义线性表的基本操作3、在1,2的基础上,完成本题。
4、在main 函数中进行测试:先构建两个有序的线性表,然后合并这两个线性表。
四、已知一个单向链表,试给出复制该链表的算法。
要求:1、定义线性表的节点的结构以及节点的型和位置的型。
2、定义线性表的基本操作3、在1,2的基础上,完成本题。
4、在main 函数中进行测试:先构建一个线性表,并定义一个空线性表,然后进行复制。
五、写出从一个带表头的单链表中删除其值等于给定值x 的结点的算法函数:int delete(LIST &L, int x);如果x 在该链表中,则删除对应结点,并返回其在链表中的位置(逻辑位置,第一个结点的逻辑位置为1),否则返回-1。
要求:1、定义线性表的节点的结构以及节点的型和位置的型。
2、定义线性表的基本操作3、在1,2的基础上,完成本题。
4、在main 函数中进行测试:先构建一个线性表,然后调用函数删除值等于给定值的节点。
六、写出一个将两个静态链表(属于同一个存储池)合并的算法函数:void Merge(cursor M, cursor N); 合并的方法是将N 链表中的所有结点添加到M 链表的后面,并将N 链表的表头结点添加到空闲结点链表中。
要求:1、定义静态链表的结点的结构以及结点的型SPACE 以及位置(position )和游标(cursor )的型。
2、定义静态链表的基本操作:void Initialize(); 初始化,将所有存储池中的结点设置为空闲;cursor GetNode(); 从空闲链中获取一个结点;void FreeNode(cursor q); 将结点q 加入到空闲链; void Insert ( elementtype x, position p, cursor M ); 在链表M 中的位置为p 的元素后面添加一个值为x 的结点;void Delete (cursor M, position p ); 在链表M 中删除位置为p 的元素的后一个元素。
3、在1、2的基础上完成本题。
4、在main 函数中进行测试:先构建一个存储池,然后在该存储池中创建两个静态表,最后将这两个静态表合并。
七、利用指针表示的线性表(链表)表示一个多项式,并实现两个多项式的相加和相乘运算。
假设多项式形式为:1111...)(e e m e m x a x a t a x A m m +++=--其中,系数a i ≠0,指数e i 满足e m >e m-1>…>e 2>e 1>=0。
要求:1、定义多项式每一项的结构。
2、定义两个多项式的相加和相乘运算函数。
3、在main 函数中,构建两个多项式,并测试相加和相乘运算。
八、试编写一个整数进制转换的通用函数convert(int num, STACK S, int n),要求将整数m 转换为n进制数,n进制数的各位依次存放在栈S中。
并在主函数中进行测试。
要求:1、定义栈以及栈的型。
2、定义栈的各种操作。
3、实现函数convert。
4、在main函数中,通过调用函数convert将num的n进制数存放到一个栈中,并通过出栈的方法输出该n进制数九、设有一个循环队列Queue,只有头指针front,不设尾指针,另设一个含有元素个数的计数器count,试写出相应的判断队列空、判断队列满、出队算法和入队算法。
要求:1、定义相应的循环队列的型(只有头指针,没有尾指针,但有一个元素个数的计数器);2、定义该队列的四个算法:判断队列空、判断队列满、出队算法和入队算法;3、在main函数验证算法的正确性。
十、设主串T=“abcaabbabcabaacbacba“,模式为p=“abcabaa”。
1、计算模式p的nextval函数值2、不写算法,只画出利用KMP算法进行模式匹配时,每一趟的匹配过程。
要求:1、写出模式p的nextval值;2、画出KMP算法的每一趟匹配过程(可参照教材P61从第8行开始的内容);3、不需要编写程序。
十一、假设表达式中允许包含三种括号:圆括号、方括号和大括号。
设计一个算法采用顺序栈(用数组表示的栈)判断表达式中的括号是否正确配对。
要求:1、定义栈以及栈的型,栈中所存放元素的类型为字符型,定义枚举类型Boolean,其中两个元素分别为TRUE和FALSE。
2、定义栈的各种操作。
3、定义函数Boolean check(char *s); 判断s中的括号是否正确配对,如果正确配对,返回TRUE,否则返回FALSE。
4、在主函数中验证所编写函数的正确性。
十二、设有一个带头结点的双向链表h,设计一个算法用于查找第一个元素之为x的结点,并将其与其前驱结点进行交换。
要求:1、定义带头结点的双向链表的型DLIST。
2、定义双向链表DLIST的基本操作。
3、定义函数int swap(elementtype x, DLIST &h),查找第一个元素之为x的结点,如果在链表中存在元素值为x的结点,并其与其前驱结点进行交换,并返回1,否则返回0。
4、在主函数中测试所编写函数的正确性。
十三、试编写一个求三元组顺序表示的稀疏矩阵对角线元素之和的算法十四、当具有相同行值和列值的稀疏矩阵A 和B 均以三元组顺序表方式存储时,试写出矩阵相加的算法,其结果存放在以行逻辑链接顺序表方式存储的矩阵C 中。
十五、设有一个稀疏矩阵:⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--000600002000700005000000000810030000000040 1、写出三元组顺序表存储表示2、写出十字链表存储的顺序表示十六、画出广义表LS=(( ), (e), (a, (b, c, d)))的头尾链表存储结构(类似于教材P70图2-27.9)。
要求:按照教材中的事例画出相应的图形,不需要编程。
其中第一个节点如下:十七、试编写求广义表中原子元素个数的算法。
要求:1、定义广义表的节点的型;2、定义广义表的基本操作;3、定义本题要求的函数int elements(listpointer L);函数返回值为广义表中原子的个数。
例如,广义表(a, b, c, d)原子的个数为4,而广义表(a, (a, b), d, e, ((i, j), k))中院子的个数为3。
提示:先利用基本操作Cal(L)获得表头,判断表头是不是原子,再利用基本操作Cdr(L)获得除第一个元素外的其他元素所形成的表L1,利用递归的方法求L1中原子的个数。
要求:1、上述作业要求在单独完成;2、完成后,于规定期限内提交到ftp 服务器的相应目录中中,注意,在提交时将所编写的程序统一拷贝到一个Word 文件中,文件名格式为“学号+姓名”三(数组表示)#include<iostream>using namespace std;#define maxlength 100typedef int position;typedef int Elementtype;struct LIST{Elementtype elements[maxlength];int last;};position End(LIST L)//线性表长度{return (st+1);}void Insert(Elementtype x,position p,LIST&L) {position q;if(st>=maxlength-1)cout<<"list is full"<<endl;else if((p>st+1)||(p<1))cout<<"position does not exit"<<endl;else{for(q=st;q>=p;q--){L.elements[q+1]=L.elements[q];}st=st+1;L.elements[p]=x;}}void Delete(position p,LIST &L){position q;if((p>st)||(p<1))cout<<"position does not exist"<<endl;else{st=st-1;for(q=p;q<=st;q++)L.elements[q]=L.elements[q+1];}}position Locate(Elementtype x,LIST L){position q;for(q=1;q<=st;q++)if(L.elements[q]==x)return q;return(st+1);}void merge(LIST&L,LIST&L1,LIST&L2){position p=0,p1,p2;position len1=End(L1);position len2=End(L2);st=len1+len2-1;for(p1=0;p1<End(L1);p1++){L.elements[p]=L1.elements[p1];p++;}p--;for(p2=0;p2<End(L2);p2++) {L.elements[p]=L2.elements[p2];p++;}p--;}void read(LIST &L){cout<<endl;cout<<"请输入线性表长度"<<endl;cin>>st;for(int i=0;i<st;i++){cin>>L.elements[i];}}void write(LIST &L){for(int i=0;i<st;i++){cout<<L.elements[i]<<"\t";}cout<<endl;}int main(){LIST L,L1,L2;read(L1);write(L1);read(L2);write(L2);merge(L,L1,L2);write(L);}数据结构三(指针)#include<iostream>using namespace std;typedef int Elementtype;struct celltype{Elementtype element;celltype *next;};typedef celltype *LIST;typedef celltype *position;position End(LIST L){position p;p=L;while(p->next!=NULL){p=p->next;}return p;}void Insert(Elementtype x,position p){position q;q=new celltype;q->element=x;q->next=p->next;p->next=q;}void Delete(position p)//删除p的下一个节点{position q;if(p->next!=NULL){q=p->next;p->next=q->next;delete q;}}position Locate(Elementtype x,LIST L){position p;p=L;while(p->next!=NULL){if(p->next->element==x)return p;elsep=p->next;}return p;}position MakeNull(LIST&L){L=new celltype;L->next=NULL;return L;}void merge(LIST&L,LIST&L1,LIST&L2) {position p,p1,p2;for(p1=L1;p1;p1=p1->next){p=new celltype;p->element=p1->element;if(L==0){L=p;p2=p;}else{p2->next=p;p2=p;}}p2->next=NULL;for(p1=L2;p1;p1=p1->next){p=new celltype;p->element=p1->element;if(L==0){L=p;p2=p;}else{p2->next=p;p2=p;}}p2->next=NULL;}void Read(LIST &L){position p1,p2;// p1=new celltype;cout<<"请输入数据以-1结束"<<endl;for(;;){p1=new celltype;cin>>p1->element;if(p1->element==-1)break;if(L==0){L=p1;p2=p1;}else{p2->next=p1;p2=p1;}}p2->next=NULL;}void write(LIST&L){position p;p=L;for(;p;p=p->next){cout<<p->element<<"\t";}cout<<endl;}int main(){LIST L=NULL,L1=NULL,L2=NULL;Read(L1);write(L1);Read(L2);write(L2);merge(L,L1,L2);write(L);}数据结构四#include<iostream>using namespace std;typedef int Elementtype;struct celltype{Elementtype element;celltype *next;};typedef celltype *LIST;typedef celltype *position;position End(LIST L){position p;p=L;while(p->next!=NULL){p=p->next;}return p;}void Insert(Elementtype x,position p)//节点插p节点之后{position q;q=new celltype;q->element=x;q->next=p->next;p->next=q;}void Delete(position p)//删除P节点的下一个节点{position q;if(p->next!=NULL){q=p->next;p->next=q->next;delete p;}}position Locate(Elementtype x,LIST L) {position p;p=L;while(p->next!=NULL){if(p->next->element==x)return p;elsep=p->next;}return p;}position MakeNull(LIST &L){L=new celltype;L->next=NULL;return L;}void Copy(LIST &L1,LIST &L2){position p1,p2,p3;for(p2=L2;p2;p2=p2->next){p1=new celltype;p1->element=p2->element;if(L1==0){L1=p1;p3=p1;}else{p3->next=p1;p3=p1;}}p3->next=NULL;}void Read(LIST &L){position p1,p2;p1=new celltype;cout<<"请输入数据以-1结束"<<endl;for(;;){p1=new celltype;cin>>p1->element;if(p1->element==-1)break;if(L==0){L=p1;p2=p1;}else{p2->next=p1;p2=p1;}}p2->next=NULL;}void Write(LIST &L){position p=L;for(;p;p=p->next){cout<<p->element<<"\t";}cout<<endl;}int main(){LIST L1=NULL,L2=NULL;Read(L2);Write(L2);Copy(L1,L2);Write(L1);}数据结构五#include<iostream>using namespace std;typedef int Elementtype;struct celltype{Elementtype element;celltype *next;};typedef celltype *LIST;typedef celltype *position;position End(LIST L){position p;p=L;while(p->next!=NULL)p=p->next;return p;}void Insert(Elementtype x,position p)//插入到P后面的一个节点{position q;q->element=x;q->next=p->next;p->next=q;}void Delete(position p)//删除P后面一个节点{position q;if(p->next!=NULL){q=p->next;p->next=q->next;delete q;}}int Delete(LIST &L,int x){position p=L;int count=1;if(p->element==x){return count;p=p->next;}while(p->next!=NULL){count++;if(p->next->element==x){if(p->next->next!=NULL){position q;q=p->next;p->next=q->next;delete q;return count;}else{delete p->next;p->next=NULL;return count;}}elsep=p->next;}return -1;}position Locate(Elementtype x,LIST L) {position p=L;while(p->next!=NULL){if(p->next->element==x){return p;}elsep=p->next;}return p;}position MakeNull(LIST&L){L=new celltype;L->next=NULL;return L;}void Read(LIST &L){position p1,p2;p1=new celltype;cout<<"请输入数据以-1结束"<<endl;for(;;){p1=new celltype;cin>>p1->element;if(p1->element==-1)break;if(L==0){L=p1;p2=p1;}else{p2->next=p1;p2=p1;}}p2->next=NULL;}void Write(LIST &L){position p=L;for(;p;p=p->next){cout<<p->element<<"\t";}cout<<endl;}int main(){LIST L1=NULL;Read(L1);Write(L1);cout<<Delete(L1,3);cout<<endl;Write(L1);}数据结构六#include<iostream>using namespace std;#define maxsize 100typedef int Elementtype;typedef struct{Elementtype element;int next;}spacestr;//节点类型spacestr SPACE[maxsize];//存储池typedef int position,cursor;cursor available;//游标变量,标识线性表void Initialize(){int j;for(j=0;j<maxsize-1;j++){SPACE[j].next=j+1;//链接池中节点}SPACE[j].next=-1;available=0;//标识线性表,将所有存储池中的节点设置为空闲,avaailable为头节点不利用}cursor GetNode()//从空闲链中获取一个节点{position p;if(SPACE[available].next==-1)p=-1;else{p=SPACE[available].next;SPACE[available].next=SPACE[p].next;}return p;}void FreeNode(cursor q)//将结点q加入到空闲链{SPACE[q].next=available;available=q;}void Insert(Elementtype x,position p,cursor M)//在链表M中的位置为p的元素后面添加一个值为x的结点{position q;q=GetNode();SPACE[q].element=x;SPACE[q].next=SPACE[p].next;SPACE[p].next=q;}void Delete(cursor M,position p)//在链表M中删除位置为P的元素的后一个元素{position q;q=GetNode();if(SPACE[p].next!=-1){if(SPACE[SPACE[p].next].next!=-1){q=SPACE[p].next;SPACE[p].next=SPACE[q].next;FreeNode(q);}else{q=SPACE[p].next;FreeNode(q);}}}/*合并:将N链表中的所有结点添加到M链表的后面,并将N链表的表头结点添加到空闲结点链表中。