20122058-张伟-线性表练习题

合集下载

第二章线性表习题及答案

第二章线性表习题及答案

第二章线性表习题及答案‎一、基础知识题‎2.1 试描述头指‎针、头结点、开始结点的‎区别、并说明头指‎针和头结点‎的作用。

答:始结点是指‎链表中的第‎一个结点,也就是没有‎直接前趋的‎那个结点。

链表的头指‎针是一指向‎链表开始结‎点的指针(没有头结点‎时),单链表由头‎指针唯一确‎定,因此单链表‎可以用头指‎针的名字来‎命名。

头结点是我‎们人为地在‎链表的开始‎结点之前附‎加的一个结‎点。

有了头结点‎之后,头指针指向‎头结点,不论链表否‎为空,头指针总是‎非空。

而且头指针‎的设置使得‎对链表的第‎一个位置上‎的操作与在‎表其他位置‎上的操作一‎致(都是在某一‎结点之后)。

2.2 何时选用顺‎序表、何时选用链‎表作为线性‎表的存储结‎构为宜?答:在实际应用‎中,应根据具体‎问题的要求‎和性质来选‎择顺序表或‎链表作为线‎性表的存储‎结构,通常有以下‎几方面的考‎虑:1.基于空间的‎考虑。

当要求存储‎的线性表长‎度变化不大‎,易于事先确‎定其大小时‎,为了节约存‎储空间,宜采用顺序‎表;反之,当线性表长‎度变化大,难以估计其‎存储规模时‎,采用动态链‎表作为存储‎结构为好。

2.基于时间的‎考虑。

若线性表的‎操作主要是‎进行查找,很少做插入‎和删除操作‎时,采用顺序表‎做存储结构‎为宜;反之,若需要对线‎性表进行频‎繁地插入或‎删除等的操‎作时,宜采用链表‎做存储结构‎。

并且,若链表的插‎入和删除主‎要发生在表‎的首尾两端‎,则采用尾指‎针表示的单‎循环链表为‎宜。

2.3 在顺序表中‎插入和删除‎一个结点需‎平均移动多‎少个结点?具体的移动‎次数取决于‎哪两个因素‎?答:在等概率情‎况下,顺序表中插‎入一个结点‎需平均移动‎n/2个结点。

删除一个结‎点需平均移‎动(n-1)/2个结点。

具体的移动‎次数取决于‎顺序表的长‎度n以及需‎插入或删除‎的位置i。

i 越接近n‎则所需移动‎的结点数越‎少。

2.4 为什么在单‎循环链表中‎设置尾指针‎比设置头指‎针更好?答:尾指针是指‎向终端结点‎的指针,用它来表示‎单循环链表‎可以使得查‎找链表的开‎始结点和终‎端结点都很‎方便,设一带头结‎点的单循环‎链表,其尾指针为‎rear,则开始结点‎和终端结点‎的位置分别‎是rear‎->next->next 和rear, 查找时间都‎是O(1)。

第二章线性表习题

第二章线性表习题

第二章线性表习题1 .填空题(1) 链表中逻辑上相邻的元素的物理位置( ) 相连。

(2) 在单链表中除首结点外,任意结点的存储位置都由( ) 结点中的指针指示。

(3) 在单链表中,设置头结点的作用是在插入或删除首结点时不必对( ) 进行处理。

(4) 已带头结点的单链表L ,指针p 指向L 链表中的一个结点,指针q 是指向L 链表外的一个结点,则:在指针p 所指结点后插入q 所指结点的语句序列是( ) ;在指针p 所指结点前插入q 所指结点的语句序列是( ) ;将q 所指结点插入在链表首结点的语句序列是( ) ;将q 所指结点插入在链表尾结点的语句序列是( ) 。

(5) 已知带表头结点的单链表L ,指针p 指向L 链表中的一个结点(非首结点,非尾结点),则:删除指针p 所指结点的直接后继结点的语句是( ) 。

删除指针p 所指结点的直接前驱结点的语句序列是( ) 。

删除指针p 所指结点的语句序列是( ) 。

删除首结点的语句序列是( ) 。

⑤删除尾结点的语句序列是( ) 。

(6) 已知指针p 指向双向链表中的一个结点(非首结点,非尾结点),则:将结点s 插入在指针p 所指结点的直接后继位置的语句是( ) 。

将结点s 插入在指针p 所指结点的直接前驱位置的语句是( ) 。

删除指针p 所指结点的直接后继结点的语句序列是( ) 。

删除指针p 所指结点的直接前驱结点的语句序列是( ) 。

⑤删除指针p 所指结点的语句序列是( ) 。

(7) 线性表的存储结构有顺序存储和( ) 存储两种。

(8) 线性表的元素长度为4 ,在顺序存储结构下Loc(ai)=2000 ,则Loc(ai +1)=( ) 。

(9) 线性表a 的元素长度为L ,在顺序存储结构下Loc(ai)=Loc(a1)+( ) 。

(10) 在线性表的链式存储结构中,某结点的指针字段指向该结点的( ) 两种存储。

(11) 线性表的元素长度为4 ,Loc(ai +1)=1000 ,则Loc(a3)=( ) 。

数据结构练习题线性表习题及答案

数据结构练习题线性表习题及答案

数据结构练习题线性表习题及答案精品文档第二章线性表一.名词解释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、逻辑结构相同的数据其存储结构一定相同。 (×) 2、线性表采用链表存储后,线性表长度一定等 于链表所有结点的个数。( × ) 3、双循环链表中,任一结点的前趋指针均不空。 √ ( ) 4、对链表进行插入和删除操作时,不必移动结 点。( √ )
三、填空题
1、在带头结点的单链表L中,若要删除第一个 元素,则需要执行下列三条语句 : U=L->next _______________;L→next=U→next; free(U)。
解:两表结构如下:
P L a1 P1 L1 b1 b2 b3 b4 ^ a2 a3node *L,*L1) { P=L;P1=L1; while(P!=null&&P1!=null) { if(P->data!=P1->data) return(0); P=P->next;P1=P1->next; } if(P!=P1) return(0); else return(1); }
L
×
a1
U
a2
a3
a4
^
2、在单链表L中,若要在指针P所指结点之后 插入由指针S所指的结点,则需执行下列语句: S->next=P->next;______________; P->next=S
P L a1 a2 S ×

a3

a4
^
x
3、在带有头结点的单链表L中,第一个元素结 L->next 点的指针是_____________。
3、链表不具有的特点是_______。 a 可随机访问任一元素 b 插入删除不需要移动元素 c 不必事先估计存储空间 d 所需空间与线性表长度成正比

第二章线性表

第二章线性表

第二章线性表第二章线性表一、选择题1.线性表是具有n个__C___的有限序列(n>0)。

A.表元素B.字符C.数据元素D.数据项2.一个顺序表所占用的存储空间大小与___B___无关。

A.表的长度C.元素的类型B.元素的存放顺序D.元素中各字段的类型3.线性表的顺序存储结构是一种__A___。

A.随机存取的存储方式C.索引存取的存储方式B.顺序存取的存储方式D.Hash存取的存储方式4. 若线性表采用顺序存储结构,每个元素占用4 个存储单元,第一个元素的存储地址为100,则第12 个元素的存储地址是__B____。

A.112 B.144 C.148 D.4125. 线性表是__A____。

A.一个有限序列,可以为空B.一个有限序列,不能为空C.一个无限序列,可以为空D.一个无限序列,不能为空6.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为__C____。

A.O(n)O(n)B.O(n)O(1)C.O(1)O(n)D.O(1)O(1) 7.若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,首先需要移动表中___A____中数据元素。

A.n-i B.n+i C.n-i+1 D.n-i-1 8.对顺序存储的线性表,设其长度为n,在任何位置插入或删除操作都是等概率的。

删除一个元素时平均要移动表中的____C____个元素。

A.n/2 B.(n+1)/2 C.(n-1)/2 D.n 9.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为__C____。

(1≤i≤n+1)A.O(0)B.O(1)C.O(n)D.O(n2)10.线性表中各链接点之间的地址___C____。

A.必须连续B.部分地址必须连续C.不一定连续D.连续与否无所谓11.在n个结点的线性表的数组表示中,算法的时间复杂度是O(1)的操作是_A______。

A.访问第i个结点后插入一个新结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)B.在第i个结点后插入一个新结点(1≤i≤n)C.删除第i 个结点(1≤i≤n)D.以上都不对12.单链表中,增加一个头结点的目的是为了____C_____。

数据结构与算法(线性表)练习题

数据结构与算法(线性表)练习题

三、写一个算法合并两个已排序的线性表。

〔用两种方法:数组表示的线性表〔顺序表〕和指针表示的线性表〔链表〕〕要求: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 的元素的后一个元素。

数据结构--线性表习题及答案

数据结构--线性表习题及答案第⼆章线性表⼀、选择题1、若长度为n的线性表采⽤顺序存储结构,在其第i个位置插⼊⼀个新元素算法的时间复杂度()。

A. O(log2n)B.O(1)C. O(n)D.O(n2)2、若⼀个线性表中最常⽤的操作是取第i个元素和找第i个元素的前趋元素,则采⽤()存储⽅式最节省时间。

A. 顺序表B. 单链表C. 双链表D. 单循环链表3、具有线性结构的数据结构是()。

A. 图B. 树C. ⼴义表D.栈4、在⼀个长度为n的顺序表中,在第i个元素之前插⼊⼀个新元素时,需向后移动()个元素。

A. n-iB. n-i+1C. n-i-1D. i5、⾮空的循环单链表head的尾结点p满⾜()。

A. p->next==headB. p->next==NULLC. p==NULLD. p==head6、链表不具有的特点是()。

A. 可随机访问任⼀元素B. 插⼊删除不需要移动元素C. 不必事先估计存储空间D. 所需空间与线性表长度成正⽐7、在双向循环链表中,在p指针所指的结点后插⼊⼀个指针q所指向的新结点,修改指针的操作是()。

A. p->next=q;q->prior=p;p->next->prior=q;q->next=q;B. p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;C. q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;D. q->next=p->next;q->prior=p;p->next=q;p->next=q;8、线性表采⽤链式存储时,结点的存储地址()。

A. 必须是连续的B. 必须是不连续的C. 连续与否均可D. 和头结点的存储地址相连续9、在⼀个长度为n的顺序表中删除第i个元素,需要向前移动()个元素。

数据结构练习题 线性表

补充习题2 线性表2.1 单项选择题1. 一个向量(即一批地址连续的存储单元)第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是__ __。

A. 110B. 108C. 100D. 1202. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址__ _。

A. 必须是连续的B. 部分地址必须是连续的C. 一定是不连续的D. 连续或不连续都可以3. 在以下的叙述中,正确的是__ _。

A.线性表的顺序存储结构优于链表存储结构B.线性表的顺序存储结构适用于频繁插入/删除数据元素的情况C.线性表的链表存储结构适用于频繁插入/删除数据元素的情况D.线性表的链表存储结构优于顺序存储结构4. 每种数据结构都具备三个基本运算:插入、删除和查找,这种说法__ _。

A. 正确B. 不正确5. 不带头结点的单链表head为空的判定条件是____。

A. head= =NULLB. head->next= =NULLC. head->next= =headD. head!=NULL6. 带头结点的单链表head为空的判定条件是____。

A. head= =NULLB. head->next= =NULLC. head->next= =headD. head!=NULL7. 在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p 之间插入s结点,则执行____。

A. s->next=p->next; p->next=s; C. p->next=s->next; s->next=p;B. q->next=s; s->next=p; D. p->next=s; s->next=q;8. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行____。

A. s->next=p; p->next=s;B. s->next=p->next; p->next=s;C. s->next=p->next; p=s; C. p->next=s; s->next=p;9. 在一个单链表中,若删除p所指结点的后续结点,则执行____。

数据结构(线性表)练习题与答案1

1、线性表是()。

A.一个有限序列,可以为空B.一个有限序列,不可以为空C.一个无限序列,可以为空D.一个无限序列,不可以为空正确答案:A解析:线性表是具有n(n≥0)个数据元素的有限序列。

2、线性表的基本运算ListInsert(&L,i,e)表示在线性表L中第i 个位置上插入一个元素e,若L的长度为n,则i的合法取值是()。

A.1≤i≤nB.1≤i≤n+1C.0≤i≤n-1D. 0≤i≤n正确答案:B解析:线性表的基本运算ListInsert(&L,i,e)中,位置i是指逻辑序号,可以在L的位置1到位置n+1插入元素。

3、顺序表具有随机存取特性,指的是()。

A.查找值为x的元素与顺序表中元素个数n无关B.查找值为x的元素与顺序表中元素个数n有关C.查找序号为i的元素与顺序表中元素个数n无关D.查找序号为i的元素与顺序表中元素个数n有关正确答案:C解析:一种存储结构具有随机存取特性指的是,对于给定的序号i,在O(1)时间内找到对应元素值。

4、在顺序表中删除一个元素所需要的时间()。

A.与删除元素的位置及顺序表的长度都有关B.只与删除元素的位置有关C.与删除任何其他元素所需要的时间相等D.只与顺序表的长度有关正确答案:A解析:当从顺序表中删除元素时,为了保持顺序表的逻辑特性,需要移动元素以覆盖该删除的元素。

因此在顺序表中删除一个元素与该元素的位置及顺序表的长度都有关。

5、在n(n>1)个运算的顺序表中,算法时间复杂度为O(1)的运算是()。

A.访问第i个元素(2≤i≤n)并求其前驱元素B.在第i个元素之后插入一个新元素C.删除第i个元素D.将这n个元素递增排序正确答案:A解析:访问第i个元素(2≤i≤n)即L->data[i-1]和求其前驱元素L->data[i-2]的时间复杂度均为O(1)。

6、关于线性表的顺序存储结构和链式存储结构的描述中,正确的是()。

Ⅰ.线性表的顺序存储结构优于链式存储结构Ⅱ.顺序存储结构比链式存储结构的存储密度高Ⅲ.如需要频繁插入和删除元素,最好采用顺序存储结构Ⅳ.如需要频繁插入和删除元素,最好采用链式存储结构A.Ⅰ、Ⅱ、ⅢB.Ⅱ、ⅣC.Ⅱ、ⅢD.Ⅲ、Ⅳ正确答案:B解析:线性表的顺序存储结构和链式存储结构各有优缺点,不能简单比较好坏,所以Ⅰ错误。

数据结构(线性表)习题与答案

1、线性表是具有n 个______ 的有限序列。

A.数据项B.字符C.数据元素D.表元素正确答案:C2、线性表是_______。

A.一个无限序列,可以为空B.一个有限序列不可以为空C.一个无限序列,不可以为空D.一个有限序列,可以为空正确答案:D3、关于线性表的正确说法是_______。

A.每一个元素都有一个前驱和一个后继元素B.除第一个元素和最后一个元素外,其余元素有且仅有一个前驱和一个后继元素C.表中元素的排序顺序必须是由小到大或者由大到小D.线性表中至少有一个元素正确答案:B4、线性表采用链表存储时,其存放各个元素的单元地址是_______。

A.连续与否均可以B.部份地址必须是连续的C.一定是不连续的D.必须是连续的5、链表不具备的特点是_______。

A.插入删除不需要挪移元素B.所需空间与其长度成正比C.不必事先估计存储空间D.可随机访问任一节点正确答案:D6、线性表的静态链表存储结构与顺序存储结构相比,优点是_______。

A.所有的操作算法实现简单B.便于利用零散的存储器空间C.便于随机存取D.便于插入和删除正确答案:D7、线性表的顺序存储结构和链式存储结构相比,优点是_______。

A.便于随机存取B.便于插入和删除C.所有的操作算法实现简单D.节省存储空间正确答案:A 8、设线性表有n 个元素,以下操作中,_______在顺序表上实现比在链表上实现效率高。

A.交换第1 个元素第2 个元素的值B.输出与给定值x 相等的元素在线性表中的符号C.输入第i ( 1<=i<=n )个元素值D.顺序输出这n 个元素的值正确答案:C9、对于一个线性表,既要求能够较快地进行插入和删除操作,又要求存储结构能够反映数据元素之间的逻辑关系,则应采用_______ 存储结构。

A.顺序B.链式C.散列D.索引正确答案:B10、设线性表中有n 个元素,以下操作,_______ 在单链表上实现要比在顺序表上实现效率高。

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

20122058 张伟 信计1班 1 第二章:线性表练习题 基础题 2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。 解:头指针是指向链表中第一个结点的指针。首元结点是指链表中存储第一个数据元素的结点。头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。它可以对空表、非空表以及首元结点的操作进行统一处理。

2.2已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

(1)、在P结点后插入S结点的语句序列是: S->next=P->next; P->next=S; (2)、在P结点前插入S结点的语句序列是: Q=P; P=L; while(P->next!=Q) P=P->next; S->next=P->next; P->next=S; (3)、在表首插入S结点的语句序列是: S->next=L; L=S; (4)、在表尾插入S结点的语句序列是: while(P->next!=NULL) P=P->next; P->next=S; S->next=NULL;

2.3、已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。 (1)、删除P结点的直接后继结点的语句序列是: Q=P->next; P->next=P->next->next; free(Q); (2)、删除P结点的直接前驱结点的语句序列是: Q=P; P=L; while(P->next->next!=Q) P=P->next; P->next=P->next->next; free(Q); (3)、删除P结点的语句序列是: 20122058 张伟 信计1班 2 Q=P; P=L; while(P->next!=Q) P=P->next; P->next=P->next->next; free(Q); (4)、删除首元结点的语句序列是: P=L Q=P->next; P->next=P->next->next; free(Q); (5)、删除尾元结点的语句序列是: while(P->next->next!=NULL) P=P->next; Q=P->next; P->next=P->next->next; free(Q);

编程题 2.2、设A=(,…,) 和B=(,…,) 均为顺序表,A'和B'分别为 A 和 B 中除去最大共同前缀后的子表(例如,A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为(x,y,y,z),在两表中除去最大共同前缀后的子表分别为A'=(x,z) 和 B'=(y,x,x,z))。若 A'= B'= 空表,则 A = B;若 A'= 空表,而 B'≠ 空表,或者两者均不为空表,且 A'的首元小于 B'的首元,则 A则 A>B。试写一个比较 A、B 大小的算法。(请注意:在算法中,不要破坏原表 A 和 B,并且,也不一定先求得 A'和 B'才进行比较) char Compare(SqList A, SqList B)// 已知顺序表A和B, 返回 '<'(若 'A'(若 'A>B')

结果如下:

程序如下: #include #include #define N 100 char Compare(char A[],char B[]) { 20122058 张伟 信计1班 3 int i,k,j; k=strlen(A)>strlen(B)?strlen(A):strlen(B); for(i=0;i则A>B if(A[i]>B[i]) return '>'; if(A[i] return '<'; } if(strlen(A)>k) return'>';//B为空表,A>B if(strlen(B)>k) return'<';//A为空表,A if(strlen(A)==strlen(B)) return'=';//A,B均为空表,A=B }

main() { char A[N],B[N]; printf("please input A[N]:"); scanf("%s",A); printf("please input B[N]:"); scanf("%s",B); int i,j; printf("%c\n",Compare(A,B)); }

2.4、试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表naa,,1逆置为1,,aan。

运行结果:

程序如下: 方法一:运用函数嵌套 20122058 张伟 信计1班 4 #include #define N 100 void fun(char *a) { if(*a) { fun(a+1); printf("%c",*a); } } main() { char a[N]; printf("please input a[N]:"); scanf("%s",a); printf("处理前的字符串为:%s\n处理后的字符串为:",a); fun(a); printf("\n"); }

方法二:运用数组循环 #include #define N 100 #include void fun(char a[],int n) { int i; char t; for(i=0;i{ t=a[i]; a[i]=a[n-i-1]; a[n-i-1]=t; } } main() { char b[N]; printf("please input b[N]:"); scanf("%s",b); int i; printf("\nthe original data:\n"); for(i=0;iprintf("%4c",b[i]); 20122058 张伟 信计1班 5 printf("\n"); fun(b,strlen(b)); printf("\nthe data after invert:\n"); for(i=0;iprintf("%4c",b[i]); printf("\n"); }

2.6、假设有两个按元素值递增有序排列的线性表 A 和 B,均以单链表作存储结构,请编写算法将 A 表和 B 表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表 C,并要求利用原表(即 A 表和 B 表)的结点空间构造 C 表。

分析: 方法一: ,先将A和B合并为一个链表,用选择法进行升序排序后,最后逆序存入C输出,不过这样过于浪费内存,时间复杂度较大。这里不再给出其程序,注意的是若要合并两个链表,可以直接利用两个for循环即可(第一个结尾加分号,第二个不加)。

方法二: 利用MergeList算法。结果与程序如下(这个程序,我不会编,参见网上):

#include using namespace std; const int N = 8;

struct Node { int data; Node* next; Node(int d = 0, Node* n = 0):data(d), next(n){} }; void Print(Node* p) { do { cout << p->data << " "; p = p->next ; }while(p); cout << endl; } 20122058 张伟 信计1班 6 void Create(Node*& List) { int i; Node* tail = 0;

for(i = 0; i < N; i++) { Node* q = new Node; q->data = (rand()%100);

if(tail == 0) tail = q, List = q; else { tail->next = q; tail = tail->next; } } }

void Sort(Node*& List) { for(Node* p = List; p != 0; p = p->next) { for(Node* q = p; q != 0; q = q->next) { if(q->data < p->data) swap(q->data, p->data); } } } void Converse(Node*& List) //将链表中指针逆向,实际上就是将递增序列变为递减序列 { Node* p, *q, *temp; p = List; //第一个节点 q = p->next; //第二个节点 temp = q->next; //第三个节点 List->next = 0; while(temp) { q->next = p; p = q; q = temp; temp = temp->next; }

相关文档
最新文档