将x插入到递增有序的顺序表

合集下载

第二章线性表答案

第二章线性表答案

2.11 设顺序表va中的数据元素递增有序。

试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

Status OrderListInsert-sq(SqList va, ElemType x) {//将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法1)if (va.length==va.listsize){newbase=(ElemType*)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType));if (!newbase) exit(OVERFLOW);va.elem=newbase;va.listsize+=LISTINCREMENT;}//当前存储空间已满,增加分配空间if (!va.length) {va.elem[0]=x; ++va.length; return OK;}q=&(va.elem[0]);while (*q<=x)&&(q<=&(va.elem[va.length-1])) ++q; //查找插入位置for (p=&(va.elem[va.length-1]); p>=q; --p) *(p+1)=*p;*q=x;++va.length;return OK;}//OrderListInsert-sqStatus OrderListInsert-sq(SqList va, ElemType x) {//将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法2)if (va.length==va.listsize){newbase=(ElemType*)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType));if (!newbase) exit(OVERFLOW);va.elem=newbase;va.listsize+=LISTINCREMENT;}//当前存储空间已满,增加分配空间if (!va.length) {va.elem[0]=x; ++va.length; return OK;}p=&(va.elem[va.length-1]);while (P>=&(va.elem[0])&&*p>x) {*(p+1)=*p; --p;}*(p+1)=x;++va.length;return OK;}//OrderListInsert-sq2.12 设A=(a1,...,a m)和B=(b1,...,b n)均为顺序表,A'和B'分别为A和B中除去最大共同前缀后的子表。

例2.2设计一个算法,将x插入到一个有序(从小到大排序)的

例2.2设计一个算法,将x插入到一个有序(从小到大排序)的

SqList *merge(SqList *p, SqList *q) { SqList *r; int i=0,j=0,k=0; r=(SqList *)malloc(sizeof(SqList)); while (i<p->length && j<q->length) { if (p->data[i]<q-> data[j]) { r-> data[k]=p-> data[i]; i++;k++; } else { r-> data[k]=q-> data[j]; j++;k++; } }
本算法实际上是采用尾插法建立两个新表。 所以,尾插法建表算法是很多类似习题的基础!
例2.6 有一个带头结点的单链表head,其ElemType 类型为char,设计一个算法使其元素递增有序。
解:若原单链表中有一个或以上的数据结点 ,先构 造只含一个数据结点的有序表 (只含一个数据结点的 单链表一定是有序表 ) 。扫描原单链表余下的结点 *p( 直到 p==NULL 为止 ), 在有序表中通过比较找插入 *p 的前驱结点 *q, 然后将 *p 插入到 *q 之后 ( 这里实际 上采用的是直接插入排序方法)。
答:可以简单地推算,得容易得出D,A,B,C是 不可能的,因为D先出来,说明A,B,C,D均在栈中, 按照入栈顺序,在栈中顺序应为D,C,B,A,出栈的 顺序只能是D,C,B,A。所以本题答案为D。
例 3.3 已知一个栈的进栈序列是 1,2,3,…,n, 其输出 序列是p1,p2,…,pn,若p1=n,则pi的值 。 (A) i (B) n-i
/*r保存*p结点后继结点的指针*/

计算机学科专业基础综合数据结构-线性表(一)_真题-无答案

计算机学科专业基础综合数据结构-线性表(一)_真题-无答案

计算机学科专业基础综合数据结构-线性表(一)(总分104,考试时间90分钟)一、单项选择题1. 线性表是( )。

A. 一个有限序列,可以为空B. 一个有限序列,不可以为空C. 一个无限序列,可以为空D. 一个无限序列,不可以为空2. 在一个长度为n的顺序表中删除第i个元素(0<=i<=n)时,需向前移动____个元素。

A. n-iB. n-i+1C. n-i-1D. .i3. 在一个长度为n的顺序表中向第i个元素(0<i<n+1)之前插入一个新元素时,需向后移动( )个元素。

A. n-iB. n-i+1C. n-i-1D. .i4. 下述哪一条是顺序存储结构的优点?____A. 存储密度大B. 插入运算方便C. 删除运算方便D. 可方便地用于各种逻辑结构的存储表示5. 下面关于线性表的叙述中,错误的是哪一个?____A. 线性表采用顺序存储,必须占用一片连续的存储单元B. 线性表采用顺序存储,便于进行插入和删除操作C. 线性表采用链接存储,不必占用一片连续的存储单元D. 线性表采用链接存储,便于插入和删除操作6. 若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用____存储方式最节省时间。

A. 顺序表B. 双链表C. 带头结点的双循环链表D. 单循环链表7. 对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为____。

A. O(n),O(n)B. O(n),O(1)C. O(1),O(n)D. O(1),O(1)8. (1)静态链表既有顺序存储的优点,又有动态链表的优点,所以,它存取表中第i个元素的时间与i无关。

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

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

以上错误的是____。

A. (1),(2)B. (1)C. (1),(2),(3)D. (2)9. 某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用____存储方式最节省运算时间。

设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。

设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。

设顺序表中的数据元素递增有序,试着写⼀算法,将x插⼊到顺序表上的适当位置上,以保持该表的有序性。

天勤例题【2-1】:设顺序表va中的数据元素递增有序。

试写⼀算法,将x插⼊到顺序表的适当位置上,以保持该表的有序性先建⽴⼀个待插⼊的结点,然后依次与与链表中的各结点的数据域⽐较⼤⼩,找到插⼊该结点的位置,最后插⼊该结点。

算法如下://设顺序表中的数据元素递增有序,//试着写⼀算法,将x插⼊到顺序表上的适当位置上,//以保持该表的有序性。

#include<stdio.h>#include<cstring>#define MaxSize 200#define ElemType int#define Status int#define OK 1#define ERROR 0using namespace std;typedef struct{ElemType data[MaxSize];int length;} SqList; //定义结构体Status initList(SqList *L){L->length = 0;return0;}//初始化顺序表SqList createList(SqList * L, int n){int startNumber, step;printf("请输⼊初始值和步长:\n");scanf("%d %d", &startNumber, &step);for(int i=0; i<n; i++){L->data[i] = startNumber + (i)*step;}L->length = n;return *L;}//建造顺序表void showList(SqList *L){for(int i=0; i<=L->length-1; i++){printf("%d ", L->data[i]);}printf("\n\n\n");}//屏幕输出顺序表Status locateList(SqList *L, ElemType e){if(e <= L->data[0])return0;if(e >= L->data[L->length - 1])return L->length;else{for(int i=0; i<L->length-1; i++){if(e > L->data[i] && e <= L->data[i+1]){return i+1;}}}}//定位某元素在数据表中的位置Status inorderList(SqList *L, ElemType location, ElemType e){for(int i = L->length-1; i >= location; i--){L->data[i+1] = L->data[i];}L->data[location] = e;L->length ++;return OK;}//插⼊指定位置的数据int main(){SqList L;initList(&L);int n;printf("输⼊顺序表的元素个数:\n");scanf("%d",&n);createList(&L,n);showList(&L);while(true){printf("请输⼊插⼊的元素:\n");int InputNumber;scanf("%d",&InputNumber);int Location=locateList(&L,InputNumber);inorderList(&L, Location, InputNumber);showList(&L);}return0;}执⾏结果:注意:⼀定要注意当值⼩于第⼀个、⼤于最后⼀个,还有和某个数相同的各种类似特殊情况,测试⼀定要全⾯!!这个算法过⼀段时间我会更⼀个更简洁的。

数据结构(第二版)习题

数据结构(第二版)习题

第一章绪论一、问答题1.什么是数据结构?2.叙述四类基本数据结构的名称与含义。

3.叙述算法的定义与特性。

4.叙述算法的时间复杂度。

5.叙述数据类型的概念。

6. 叙述线性结构与非线性结构的差别。

7.叙述面向对象程序设计语言的特点。

8.在面向对象程序设计中,类的作用是什么?9.叙述参数传递的主要方式及特点。

10.叙述抽象数据类型的概念。

二、判断题(在各题后填写“√”或“×”)1.线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。

()2.算法就是程序。

()3. 在高级语言(如C或PASCAL)中,指针类型是原子类型。

()三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;四、试编写算法,求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…anxn的值Pn(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。

注意:本题中的输入ai(i=0,1,…,n),x和n,输出为Pn(x0)。

通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递。

(2)通过全局变量隐式传递。

试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出。

第二章线性表2.1描述以下三个概念的区别:头指针,头结点,首元素结点。

2.2填空:(1)在顺序表中插入或删除一个元素,需要平均移动____元素,具体移动的元素个数与__插入或删除的位置__有关。

(2)在顺序表中,逻辑上相邻的元素,其物理位置______相邻。

在单链表中,逻辑上相邻的元素,其物理位置______相邻。

(3)在带头结点的非空单链表中,头结点的存储位置由______指示,首元素结点的存储位置由______指示,除首元素结点外,其它任一元素结点的存储位置由____指示。

例题

例题

1.设顺序表L中的数据元素递增有序,试写一算法,将x插入到顺序表的适当位置,以保持该表的有序性。

Status Insert_SqList(SqList &L,int x)//把x插入递增有序表L中{if(L.length+1>L.listsize) return ERROR;L.length++;//长度增加1,给x留出空间for(i=L.length-1;L.elem[i]>x&&i>=0;i--)L.elem[i+1]=L.elem[i];//当元素比x大,依次后退L.elem[i+1]=x;return OK;}//Insert_SqList2.试写一算法,实现单链表的就地逆置(即利用原表的存储空间将线性表逆置)。

void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法,假设表长大于2{ p=L->next;q=p->next;s=q->next;p->next=NULL;while(s->next){q->next=p;p=q;q=s;s=s->next; //把L的元素逐个插入新表表头}q->next=p;s->next=q;L->next=s;}//LinkList_reverse分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.3. 编写算法,从串s中删除所有和串t相同的子串。

int Delete_SubString(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=1;i<=Strlen(s)-Strlen(t)+1;i++)if(!StrCompare(SubString(s,i,Strlen(t)),t)){//以i控制,将s的子串逐一与t进行比较StrAssign(head,SubString(S,1,i-1));//生成一个串值等于s(i-1之前) StrAssign(tail,SubString(S,i+Strlen(t),Strlen(s)-i-Strlen(t)+1));//生成一个串值等于s(串t之后部分)StrAssign(S,Concat(head,tail)); //把head,tail连接为新串n++;}//ifreturn n,}//Delete_SubString4. 编写算法,求串s所含不同字符的总数和每种字符的个数。

李春葆数据结构教程第4版习题答案

李春葆数据结构教程第4版习题答案

1章答案1.简述数据与数据元素的关系与区别。

解:凡是能被计算机存储、加工的对象统称为数据,数据是一个集合。

数据元素是数据的基本单位,是数据的个体。

数据与元素之间的关系是元素与集合之间的关系。

2.数据结构和数据类型有什么区别?解:数据结构是互相之间存在一种或多种特定关系的数据元素的集合,一般包括三个方面的内容,即数据的逻辑结构、存储结构和数据的运算。

而数据类型是一个值的集合和定义在这个集合上的一组运算的总称,如C语言中的int数据类型是由-32768~32767(16位机)的整数和+、-、*、/、%等运算符组成。

3.设3个表示算法频度的函数f、g和h分别为:f(n)=100n3+n2+1000 g(n)=25n3+5000n2 h(n)=n1.5+5000nlog2n求它们对应的时间复杂度。

解:f(n)=100n3+n2+1000=O(n3),g(n)=25n3+5000n2=O(n3),当n→∞时,√n>log2n,所以h(n)=n1.5+5000nlog2n= O(n1.5)。

4.用C/C++语言描述下列算法,并给出算法的时间复杂度。

(1)求一个n阶方阵的所有元素之和。

(2)对于输入的任意三个整数,将它们按从小到大的顺序输出。

(3)对于输入的任意n个整数,输出其中的最大和最小元素。

解:(1)算法如下:本算法的时间复杂度为O(n2)。

(2)算法如下:本算法的时间复杂度为O(1)。

(3)算法如下:本算法的时间复杂度为O(n)。

5.设n为正整数,给出下列各种算法关于n的时间复杂度。

(1)(2)(3)解:(1)设while循环语句执行次数为T(n),则:(2)算法中的基本运算语句是if(b[k]>b[j])k=j,其执行次数T(n)为:(3)设while循环语句执行次数为T(n),则:则6.有以下递归算法用于对数组a[i..j]的元素进行归并排序:求mergesort(a,0,n-1)的时间复杂度。

数据结构实用教程习题答案

数据结构实用教程习题答案

1绪论1.1回答下列概念:数据结构,数据的逻辑结构,数据的存储结构,算法数据结构:按照某种逻辑关系组织起来的一批数据,用一定的存储方式存储在计算机的存储器中,并在这些数据上定义一个运算的集合,就称为一个数据结构。

数据的逻辑结构:数据元素之间的逻辑关系,是根据实际问题抽象出来的数学模型。

数据的存储结构:是指数据的逻辑结构到计算机存储器的映射。

算法:是指对数据元素进行加工和处理1.2数据结构研究的三方面内容是什么?它们之间有什么联系和区别?三方面内容:数据的逻辑结构、数据的存储结构和数据运算的集合。

联系和区别:数据的逻辑结构是数学模型,数据的存储结构是指逻辑结构到存储区域的映射,运算是定义在逻辑结构上,实现在存储结构上。

1.3简述数据结构中讨论的三种经典结构及其逻辑特征。

三种经典结构:线性表、树和图。

线性表:有且仅有一个开始结点和一个终端结点,其余的内部结点都有且仅有一个前趋结点和一个后继结点,数据元素间存在着一对一的相互关系。

树:有且仅有一个开始结点,可有若干个终端结点,其余的内部结点都有且仅有一个前趋结点,可以有若干个后继结点,数据元素间存在着一对多的层次关系。

图:可有若干个开始结点和终端结点,其余的内部结点可以有若干个前趋结点和若干个后继结点,数据元素间存在着多对多的网状关系。

1.4实现数据存储结构的常用存储方法有哪几种?简述各种方法的基本思想。

常用存储方法有四种:顺序存储、链接存储、索引存储、散列存储。

各种方法的基本思想:顺序存储:把逻辑上相邻的数据元素存储在物理位置上相邻的存储单元里。

链接存储:通过附加指针域表示数据元素之间的关系。

索引存储:除了存储数据元素,还要建立附加索引表来标识数据元素的地址。

散列存储:根据数据元素的关键字直接计算出该结点的存储地址,称为关键字-地址转换法。

1.5算法的特性是什么?如何定性的评价一个算法的优劣?算法的特性:有穷性、确定性、可行性、输入、输出。

算法的定性评价标准有:正确性、可读性、健壮性、简单性。

例2.2设计一个算法,将x插入到一个有序(从小到大排序)的

例2.2设计一个算法,将x插入到一个有序(从小到大排序)的

例2.4 已知长度为n的线性表A采用顺序存储结 构,编写一个时间复杂度为O(n)、空间复杂度为O(1) 的算法,该算法删除线性表中所有值为item的数据元 素。 解 : 用 k 记录顺序表 A 中等于 item 的元素个数 , 边 扫描A边统计k,并将不为item的元素前移k个位臵,最 后修改A的长度。对应的算法如下:
}
void delnode2(SqList &A,ElemType item) { int k=0,i=0; /*k记录值等于item的元素个数*/ while (i<A.length) { if (A.data[i]==item) k++; 算法2
else A.data[i-k]=A.data[i]; /*当前元素前移k个位臵*/
SqList *merge(SqList *p, SqList *q) { SqList *r; int i=0,j=0,k=0; r=(SqList *)malloc(sizeof(SqList)); while (i<p->length && j<q->length) { if (p->data[i]<q-> data[j]) { r-> data[k]=p-> data[i]; i++;k++; } else { r-> data[k]=q-> data[j]; j++;k++; } }
i++;
for (j=L->length-1;j>=i;j--) L->data[j+1]=L->data[j]; L->data[i]=x; L->length++; }

测试题(1)

测试题(1)

一、选择题1.从一个具有n个结点的单链表中查找值为x的结点,在查找成功情况下,需平均比较(n个节点,单链表。

如果x等于第一个元素的值。

则要比较1次x等于第二个元素的值,则要比较2次…最不巧:x值刚好等于第n个元素,则要比较x次所以总次数是1+2+3+……+n-1+n=(n+1)*n/2所以平均需要:(n+1)/2次。

顺序数组可以用折半查找,需要log2…为低…N 次个结点。

A.n B.n/2 C.(n-1)/2 D.(n+1)/22.(a )插入、删除速度快,但查找速度慢。

链表只需要修改前驱或者前驱与后继的指针就可以,查找时链表需要顺序查找,并且由于读取指针耗费时间A.链表B.顺序表C.有序顺序表D.上述三项无法比较3.若希望从链表中快速确定一个结点的前驱,则链表最好采用(c)方式。

双链表在结点前驱后继查找上的时间复杂度是O(1)A.单链表B.循环单链表C.双向链表D.任意4.在一个单链表中,若删除p所指结点的后继结点,则执行(d)。

p->next指向p指针的后继结点,p->next->next指向后继结点的后继结点。

A.p->next=p->next B.p=p->next->nextC.p=p->next;p->next=p->next->next; D.p->next=p->next->next5.带头结点的单链表head为空的判定条件是(b)。

A.head==NULL B.head->next==NULLC.head->next==head D.head!=NULL6.在循环双向链表的p所指结点之后插入s所指结点的操作是(d)。

A.p->next=s;s->prior=p;p->next->prior=s;s->next=p->next;B.p->next=s;p->next->prior=s;s->prior=p;s->next=p->next;C.s->prior=p;s->next=p->next;p->next=s;p->next->prior=s;D.s->prior=p;s->next=p->next;p->next->prior=s;p->next=s;7.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(a)存储方式最节省时间。

数据结构(C语言版)(第4版)习题

数据结构(C语言版)(第4版)习题

习题11.1选择题。

(1)计算机识别、存储和加工处理的对象统称为。

A.数据B.数据元素C.数据结构D.数据类型(2)数据结构通常是研究数据的及它们之间的联系。

A.存储和逻辑结构B.存储和抽象C.理想和抽象D.理想和逻辑(3)下列不是数据的逻辑结构的是。

A.散列结构 B.线性结构 C.树形结构 D.图状结构(4)数据结构被形式地定义<D,R>,其中D是的有限集,R是___的有限集。

A.算法 B.数据元素C.数据操作 D.逻辑结构(5)组成数据的基本单位是。

A.数据项 B.数据类型 C.数据元素 D.数据变量(6)设数据结构A=(D,R),其中,D={1,2,3,4},R={r},r={<1,2>,<2,3 >,<3,4>,<4,1>},则数据结构A是。

A.线性结构 B.树形结构 C.图状结构 D.集合(7)数据在计算机存储器中表示时,若物理地址与逻辑地址相同并且是连续的,则称为。

A.存储结构B.逻辑结构C.顺序存储结构D.链式存储结构(8)在数据结构的讨论中把数据结构从逻辑上分。

A.内部结构与外部结构B.静态结构与动态结构B.线性结构与非线性结构 D.紧凑结构与非紧凑结构(9)对于一个算法的评价,不包括以下方面的内容。

A.健壮性和可读性B.并行性C.正确性D.时间空间复杂度(10)算法分析的两个方面是。

A.空间复杂性和时间复杂性B.正确性和简明性C.可读性和文档性 D.数据复杂性和程序复杂性1.2填空题(1)数据结构是一门研究非数值计算的程序设计问题中计算机的以及它们之间的和运算等的学科。

(2)数据结构包括数据的结构和结构。

(3)数据结构从逻辑上划分为3种基本类型,即、和。

(4)数据的物理结构被分为、、和种类型。

(5)一种抽象数据结构类型包括和两个部分。

(6)数据的逻辑结构是指数据的存储结构是指(7)数据结构是指指数数据及其相互之间的当结点之间存在M对N(M:N)的联系时,称这种结构为当结点之间存在1对N(1:N)的联系时,称这种结构为(8)对算法从时间和空间两个方面进行衡量,分别称为分析。

2.11设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

2.11设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
if(a[i+1]>x){ break; } } //移动数据 for(j=7;j>i;j--){ a[i+1]=a[i]; } //插入
a[i+1]=x; return 0; } Sqlist::~Sqlist(void) { } Sqlist.h #pragma once #include "iostream" using namespace std; class Sqlist { private: int length; public: Sqlist(void); int coutSql(int a[]); int insertSql(int a[]); ~Sqlist(void); }; 2-11.cpp #include"Sqlist.h"
#include"iostream" using namespace std; int main() {
int a[7]={1,2,4,6,7,8,9}; Sqlist sqllist; cout<<"数组中的数据为:"<<endl; sqllist.coutSql(a); sqllist.insertSql(a); sqllist.coutSql(a); system("pause"); return 0; }
即:
1
2
3ห้องสมุดไป่ตู้
4
5
6
7
8
9
算法如下: Sqlist.cpp #include "Sqlist.h" Sqlist::Sqlist(void) { } int Sqlist::coutSql(int a[]){//输出数组中的数据

数据结构部分习题

数据结构部分习题

数据结构部分习题一、问答题1、简述下列术语:线性表,顺序表,链表。

2、何时选用顺序表,何时选用链表作为线性表的存储结构合适?各自的主要优缺点是什么?3、在顺序表中插入和删除一个结点平均需要移动多少个结点?具体的移动次数取决于哪两个因素?4、链表所表示的元素是否有序?如有序,则有序性体现于何处?链表所表示的元素是否一定要在物理上是相邻的?二、单选题1、在表长为n的单链表中,算法时间复杂度为O(n)的操作是( )。

A. 查找单链表中第i个结点B. 在p结点之后插入一个结点C. 删除表中第一个结点D. 删除p结点的直接后继结点2、在下列链表中不能从当前结点出发访问到其余各结点的是( )。

A. 单链表B. 单循环链表C. 双向链表D. 双向循环链表3、线性表采用顺序存储时,其地址( )A.必须是连续的B.部分地址必须是连续的C.一定是不连续的D.连续与否均可以4、线性表采用链式存储结构时,其地址( )A.必须是连续的B.部分地址必须是连续的C.一定是不连续的D.连续与否均可以5、在长度为n的顺序表的第i个数据元素(1≤i≤n)之前插入一个数据元素,元素的移动次数为( )。

A. n-i+1B. n-iC. iD. i-16、对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为( )。

A. 顺序表B. 用头指针表示的单循环链表C. 用尾指针表示的单循环链表D. 单链表7、在需要经常查找结点的前驱与后继的场合中,使用( )比较合适。

A.单链表B.双向链表C.单循环链表D.循环链表8、在一个单链表h中,若要删除由指针q所指向结点的直接后继结点,则执行()。

A.p = q->next ; p->next = q->next;B.p = q->next ; q->next = p;C.p = q->next ; q->next = p->next;D.q->next = q->next->next; q->next = q;9、9、链表不具有的特点是()。

数据结构名章节习题及答案

数据结构名章节习题及答案

p=p->next; } q=p; while (q!=NULL && q->data<max) q=q->next; r->next=q; r=p->next; while (r!=q) } } 3. 解:void dels(ListNode *head) { ListNode *p=head->next , *q, *pre, *r; while (p!=NULL) { q=p->next; pre=p; while (q!=NULL) { if (p->data==q->data) { r=q; pre->next=q->next; q=q->next; free®; } else { pre=q; q=q->next; } } p=p->next; } 4. 解 : 当 L 不空时从头开始扫描 L, 每次扫描找出一个最小值的结点*p1 及其前趋结点*pre1, 输出*p1 之值,再从表中删除。算法如下: void dels(ListNode *L) { ListNode *p, *pre, *pre1, *p1; while (L->next!=NULL) { pre=pre1=L; p=p1=L->next; while (p!=NULL) { if (p->data<p1->data) pre1=pre; p1=p; } pre=p; p=p->next; } cout <<p1->data<<end1; pre1->next=p1->next; free(p1); { { free(p); p=r; r=r->next;
解:由于是有序表,所以相同值域的结都是相信的。同 p 扫描递增单链表,若*p 结点的 值域等于其后结点的值域,删除后者。

数据结构课后习题答案第二章 线性表

数据结构课后习题答案第二章   线性表

第二章线性表2.1描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

并说明头指针和头结点的作用。

答:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识一个链表。

如链表H,链表L等,表示链表中第一个结点的地址存放在H、L中。

头结点是附加在第一个元素结点之前的一个结点,头指针指向头结点。

当该链表表示一个非空的线性表时,头结点的指针域指向第一个元素结点,为空表时,该指针域为空。

开始结点指第一个元素结点。

头指针的作用是用来惟一标识一个单链表。

头结点的作用有两个:一是使得对空表和非空表的处理得以统一。

二是使得在链表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。

2.2填空题1、在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关。

2、顺序表中逻辑上相邻的元素的物理位置(必定)相邻。

单链表中逻辑上相邻的元素的物理位置(不一定)相邻。

3、在单链表中,除了首元结点外,任一结点的存储位置由(其直接前驱结点的链域的值)指示。

4、在单链表中设置头结点的作用是(插入和删除元素不必进行特殊处理)。

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

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

2.基于时间的考虑。

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

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

2.10 Status DeleteK(SqList &a,int i,int k)//删除线性表a中第i个元素起的k个元素{if(i<1||k<0||i+k-1>a.length) return INFEASIBLE;for(count=1;i+count-1<=a.length-k;count++) //注意循环结束的条件a.elem[i+count-1]=a.elem[i+count+k-1];a.length-=k;return OK;}//DeleteK2.11设顺序表中的数据元素递增有序,试写一算法,将X插入到顺序表的适当位置上,以保持该表的有序性。

数据结构试题大题编程及参考答案

数据结构试题大题编程及参考答案
解:存储结构如下:
typedef struct Lnode
{ElemType data;
struct Lnode *next;
}Lnode, *LinkList;
算法如下:
void insert_y_before_x(LinkList L, ElemType x, ElemType y)
{ Lnode *q, *p=L;
解:
存储结构如下:
typedef struct Lnode
{ElemType data;
struct Lnode *next;
}Lnode, *LinkList;
算法如下:
void insert_after_k( LinkList L, int k, ElemType x)
{ if(k<0) return;
解:存储结构如下:
typedef struct Lnode
{ElemType data;
struct Lnode *next;
}Lnode, *LinkList;
算法如下:
int length(LinkList L)
{ int len=0;
Lnode *p=L;
while(p) { len++; p=p->next; }
while(p->next && p->next->data!=x) p=p->next; //找x的前驱结点p;
if(!p->next) return; //若不存在结点x,则返回;
q=new Lnode;
q->data=y; q->next=p->next; p->next=q;

递增有序顺序表的插入解题思路

递增有序顺序表的插入解题思路

递增有序顺序表的插入解题思路全文共四篇示例,供读者参考第一篇示例:递增有序顺表是一种特殊的顺序表,其中存储的元素是按照递增顺序排列的。

在递增有序顺表中插入元素是一个常见的操作,但是需要特别注意保持顺序表的有序性。

下面我将详细介绍关于递增有序顺表的插入解题思路。

我们需要明确递增有序顺表的特点,即表中元素是按照递增顺序排列的。

当插入一个新元素时,需要找到合适的位置将该元素插入进去,同时保持表的有序性。

插入操作可以分为两种情况:一种是插入的元素比表中所有元素都大,此时直接将新元素插入到表的末尾即可;另一种情况是插入的元素需要插入到表中间某个位置,这时需要找到合适的位置将新元素插入进去。

在找到合适的插入位置后,我们需要将插入位置后的元素依次后移,腾出插入位置。

这个过程需要谨慎处理,确保元素的顺序不会被打乱。

在实际的插入操作中,还需要考虑边界情况。

当插入的元素比表中所有元素都小,或者表已满时,需要做出相应的处理,避免出现越界或溢出的情况。

递增有序顺表的插入操作需要注意以下几点:1. 确定插入位置:根据插入元素的大小,找到合适的插入位置。

2. 移动元素:将插入位置后的元素依次后移,腾出插入位置。

3. 处理边界情况:考虑插入元素比表中所有元素都小或大、表已满等情况,做出相应处理。

4. 保持有序性:在插入操作过程中,确保表的有序性不会被打乱。

递增有序顺表的插入操作是一个相对简单但需要细心处理的过程。

通过合理的算法设计和实现,可以确保插入操作的准确性和高效性。

希望以上内容对你理解如何在递增有序顺表中进行插入操作有所帮助。

第二篇示例:递增有序顺表是指表中元素按照升序排列的顺序表,插入操作是在有序表中插入一个新的元素,并保持有序性。

插入元素的操作在实际的程序设计中非常常见,因此掌握递增有序顺表的插入解题思路对于数据结构和算法的学习至关重要。

本文将详细介绍递增有序顺表的插入操作的具体实现思路。

我们需要了解顺序表的基本概念。

数据结构1-4章习题答案

数据结构1-4章习题答案

第1章概论习题参考解答一、填空题1、数据的逻辑结构是数据元素之间的逻辑关系,通常有下列4类:()、()、()、()。

【答】集合、线性结构、树型结构和图状结构。

2、数据的存储结构是数据在计算机存储器里的表示,主要有4种基本存储方法:()、()、()、()。

【答】顺序存储方法、链接存储方法、索引存储方法和散列存储方法。

二、选择题1、一个算法必须在执行有穷步之后结束,这是算法的()。

(A)正确性(B)有穷性(C)确定性(D)可行性【答】B。

2、算法的每一步,必须有确切的定义。

也就是说,对于每步需要执行的动作必须严格、清楚地给出规定。

这是算法的()。

(A)正确性(B)有穷性(C)确定性(D)可行性【答】C。

3、算法原则上都是能够由机器或人完成的。

整个算法好像是一个解决问题的“工作序列”,其中的每一步都是我们力所能及的一个动作。

这是算法的()。

(A)正确性(B)有穷性(C)确定性(D)可行性【答】D。

三、简答题1、算法与程序有何异同?【答】尽管算法的含义与程序非常相似,但两者还是有区别的。

首先,一个程序不一定满足有穷性,因此它不一定是算法。

例如,系统程序中的操作系统,只要整个系统不遭受破坏,它就永远不会停止,即使没有作业要处理,它仍处于等待循环中,以待一个新作业的进入。

因此操作系统就不是一个算法。

其次,程序中的指令必须是计算机可以执行的,而算法中的指令却无此限止。

如果一个算法采用机器可执行的语言来书写,那么它就是一个程序。

2、什么是数据结构?试举一个简单的例子说明。

【答】数据结构是指数据对象以及该数据对象集合中的数据元素之间的相互关系(即数据元素的组织形式)。

例如,队列的逻辑结构是线性表(先进先出);队列在计算机中既可以采用顺序存储也可以采用链式存储;对队列可进行删除、插入数据元素以及判断是否为空队列、将队列置空等操作。

3、什么是数据的逻辑结构?什么是数据的存储结构?【答】数据元素之间的逻辑关系,也称为数据的逻辑结构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*(p+1)=x;
++va.length;
return OK;
}//OrderListInsert-sq
}//当前存储空间已满,增加分配空间
if (!va.length) {va.elem[0]=x; ++va.length; return OK;}
p=&(va.elem[va.length-1]);
while (P>=&(va.elem[0])&&*p>x) {*(p+1)=*p; --p;}
if (!newbase) exit(OVERFLOW);
va.elem=;
va.listsize+=LISTINCREMENT;
}//当前存储空间已满,增加分配空间
if (!va.length) {va.elem[0]=x; ++va.length; return OK;}
Status OrderListInsert-sq(SqList va, ElemType x) {
//将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法1)
if (va.length==va.listsize){
newbase=(ElemType *)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType));
q=&(va.elem[0]);
while (*q<=x)&&(q<=&(va.elem[va.length-1])) ++q; //查找插入位置
for (p=&(va.elem[va.length-1]); p>=q; --p) *(p+1)=*p;
*q=x;
++va.length;
return OK;
}//OrderListInsert-sq
Status OrderListInsert-sq(SqList va, ElemType x) {
//将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法2)
if (va.length==va.listsize){
newbase=(ElemType *)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType));
if (!newbase) exit(OVERFLOW);
va.elem=newbase;
va.listsize+=LISTINCREMENT;
相关文档
最新文档