当前位置:文档之家› 线性表的实现与操作(二)

线性表的实现与操作(二)

线性表的实现与操作(二)
线性表的实现与操作(二)

数据结构第2章作业 线性表(答案)

第2章线性表 班级学号__________-姓名 一、判断正误 (×)1. 链表的每个结点中都恰好包含一个指针。 链表中的结点可含多个指针域,分别存放多个指针。例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继结点的指针。 (×)2. 链表的物理存储结构具有同链表一样的顺序。 链表的存储结构特点是无序,而链表的示意图有序。 (×)3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。 链表的结点不会移动,只是指针内容改变。 (×)4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存放记录型数据。 (×)5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 正好说反了。顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜” (×)6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。 前一半正确,但后一半说法错误,那是链式存储的优点。顺序存储方式插入、删除运算效率较低,在表长为n的顺序表中,插入和删除一个数据元素,平均需移动表长一半个数的数据元素。 (×)7. 线性表在物理存储空间中也一定是连续的。 线性表有两种存储方式,顺序存储和链式存储。后者不要求连续存放。 (×)8. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。 线性表有两种存储方式,在顺序存储时,逻辑上相邻的元素在存储的物理位置次序上也相邻。 (×)9. 顺序存储方式只能用于存储线性结构。 顺序存储方式不仅能用于存储线性结构,还可以用来存放非线性结构,例如 完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式。(后一节介绍) (×)10. 线性表的逻辑顺序与存储顺序总是一致的。 理由同7。链式存储就无需一致。 二、单项选择题 (C )1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:(A)存储结构(B)逻辑结构(C)顺序存储结构(D)链式存储结构( B )2. 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是(A)110 (B)108 (C)100 (D)120 ( A )3. 在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是: (A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) (B)在第i个结点后插入一个新结点(1≤i≤n) (C)删除第i个结点(1≤i≤n) (D)将n个结点从小到大排序 ( B )4. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动个元素(A)8 (B)63.5 (C)63 (D)7 ( A )5. 链式存储的存储结构所占存储空间:

线性表的顺序存储结构定义和基本操作算法实现

#include "" /***********************线性表的顺序存储结构定义*******************/ #define MAX 11 /*线性表可能达到的最大长度值*/ typedef int datatype; typedef struct {datatype data[MAX]; int last;}list; /************************1.线性表的初始化***************************/ void init(list *lp) {lp->last=0;} /************************2.求线性表的长度***************************/ int length(list *lp) { return (lp->last);} /***************3.插入运算,在表第i个位置插入一个值为 x的新元素******/ void insert(list *lp,int i,datatype x) { int j; if(lp->last==MAX-1) printf("Overflow!\n"); /*表已满*/ else if(i<1||i>lp->last+1) printf("Error!\n"); /*插入位置错误*/ else {for(j=lp->last;j>=i;j--) lp->data[j+1]=lp->data[j]; /*数据元素后移*/ lp->data[i]=x; /*插入x */ lp->last++; /*表长度加1*/ } } /***************4.删除运算,在表中删除第i个数据元素***************/ void delete(list *lp,int i) { int j; if(i<1||i>lp->last) /*检查空表及删除位置的合法性*/ printf("The %dth element is not exist!",i); /*不存在第i个元素*/ else {for(j=i+1;j<=lp->last;j++) lp->data[j-1]=lp->data[j]; /*向前移动元素*/ lp->last--; /*表长度减1 */ } } /*****************5.查找运算,在表中查找x数据元素*****************/ int locate(list *lp,datatype x) { int i=lp->last; while(i>0 && lp->data[i]!=x)i--; return i; }

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

数据结构第一次作业及答案--线性表

第一次作业------------线性表 题目1、下列图1单链表执行R->data=P->next->data语句后,P->next->data值为 A. 5 B. 7 C. 2 D. 3 题目2、在顺序表中,只要知道( ),就可在相同时间内求出任一结点的存储地址。 A. 向量大小 B. 基地址和结点大小 C. 结点大小 D. 基地址 题目3、非空的循环单链表head的尾节点(由r所指向)满足 ( ) A. r->next=NULL B. r->next=head C. r=NULL D. r=head 题目4、设线性表(a1,a2,a3···an)按顺序存储,且每个元素占有m个存储单元,则元素ai 的地址为 A. LOC(a1) + i×m ,其中LOC(a1)表示元素a1的地址 B. 元素ai的地址无法计算 C. LOC(a1) + (i-1)×m, D. LOC(a1) + (i-2)×m 题目5、在()运算中,使用顺序表比链表好。 A. 根据元素值查找 B. 插入 C. 根据序号查找 D. 删除 题目6、在一个单链表中,若P所指结点不是最后结点,在P之后插入S所指结点 A. P→next=S;S→next=P B. S→next=P→next; P=S C. S→next=P→next;P→next=S D. S→next=P;P→next=S 题目7、在双向循环链表的*p结点之后插入*s结点的操作是 A. s->prior=p; s->next=p->next; p->next=s; p->next->prior=s; B. s->prior=p; s->next=p->next; p->next->prior=s; p->next=s; C. p->next=s; s->prior=p; p->next->prior=s; s->next=p->next D. p->next=s; p->next->prior=s; s->prior=p; s->next=p->next 题目8、单链表表示的整数数列如下图,值P->next->next->data为:

线性表的顺序存储结构定义和基本操作算法实现

/************线性表的顺序存储结构定义和基本操作算法实现************/ #include "stdio.h" /***********************线性表的顺序存储结构定义*******************/ #define MAX 11 /*线性表可能达到的最大长度值*/ typedef int datatype; typedef struct {datatype data[MAX]; int last;}list; /************************1.线性表的初始化***************************/ void init(list *lp) {lp->last=0;} /************************2.求线性表的长度***************************/ int length(list *lp) { return (lp->last);} /***************3.插入运算,在表第i个位置插入一个值为x的新元素******/ void insert(list *lp,int i,datatype x) { int j; if(lp->last==MAX-1) printf("Overflow!\n"); /*表已满*/ else if(i<1||i>lp->last+1) printf("Error!\n"); /*插入位置错误*/ else {for(j=lp->last;j>=i;j--) lp->data[j+1]=lp->data[j]; /*数据元素后移*/ lp->data[i]=x; /*插入x */ lp->last++; /*表长度加1*/ } } /***************4.删除运算,在表中删除第i个数据元素***************/ void delete(list *lp,int i) { int j; if(i<1||i>lp->last) /*检查空表及删除位置的合法性*/ printf("The %dth element is not exist!",i); /*不存在第i个元素*/ else {for(j=i+1;j<=lp->last;j++) lp->data[j-1]=lp->data[j]; /*向前移动元素*/ lp->last--; /*表长度减1 */ } } /*****************5.查找运算,在表中查找x数据元素*****************/ int locate(list *lp,datatype x) { int i=lp->last; while(i>0 && lp->data[i]!=x)i--; return i;

201560140140--袁若飞--实验1:线性表的基本操作及其应用

数据结构 实验1:线性表的基本操作及其应用 班级:RB软工移151 学号:201560140140 姓名:袁若飞

实验一线性表 一、实验目的 1、帮助读者复习C++语言程序设计中的知识。 2、熟悉线性表的逻辑结构。 3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。 二、实验内容 本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,题目一、二是必做题。题目三、题目四选作。 三、实验准备知识 1、请简述线性表的基本特性和线性表的几种基本操作的机制 ①答:线性表的基本特性是:对线性表中某个元素ai来说,称其前面的元素ai-1为ai的直接前驱,称其后前面的元素ai+1为ai的直接后继。显然,线性表中每个元素最多有一个直接前驱和一个直接后继。 ②答:线性表的几种基本操作的机制有六个: (1)初始化线性表initial_List(L)——建立线性表的初始结构,即建空表。这也是各种结构都可能要用的运算。 (2)求表长度List_length(L)——即求表中的元素个数。 (3)按序号取元素get_element(L,i)——取出表中序号为i的元素。(4)按值查询List_locate(L,x)——取出指定值为x的元素,若存在该元素,则返回其地址;否则,返回一个能指示其不存在的地址值或标记。 (5)插入元素List_insert(L,i,x)——在表L的第i个位置上插入值为x的元素。显然,若表中的元素个数为n,则插入序号i应满足1<=i<=n+1。(6)删除元素List_delete(L,i)——删除表L中序号为i的元素,显然,待删除元素的序号应满足1<=i<=n。 2、掌握线性表的逻辑结构。 3、掌握线性表的链式存储结构。 4、熟练掌握线性表的插入、删除等操作。

作业-概述和线性表

第1章数据结构概述 一、选择题 1.在数据结构中,从逻辑上可以把数据结构分为( )。 A.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.内部结构和外部结构 2.线性表的顺序存储结构是一种( )的存储结构。 A.随机存取B.顺序存取C.索引存取D.Hash存取 3.计算机算法指的是( (1) ),它必须具备输入、输出和( (2) )等五个特征。 (1) A.计算方法B.排序方法C.解决某一问题的有限运算序列D.调度方法 (2) A.可行性、可移植性和可扩充性B.可行性、确定性和有穷性C.确定性,有穷性和稳定性D.易读性、稳定性和安全性 4.线性表若采用链表存储结构,要求内存中可用存储单元的地址( )。 A.必须是连续的B.部分必须是连续的C.一定是不连续的D.连续不连续都可以 5.根据数据元素之间关系的不同特性,以下四类基本的逻辑结构反映了四类基本的数据组织形式,其中解释错误的是( )。 A.集合中任何两个结点之间都有逻辑关系但组织形式松散B.线性结构中结点按逻辑关系依次排列形成一条“锁链”C.树形结构具有分支、层次特性,其形态有点像自然界中的树D.图状结构中的各个结点按逻辑关系互相缠绕,任何两个结点都可以邻接 二、判断题 ╳1.数据元素是数据的最小单位。 √2.数据结构是带有结构的数据元素的集合。 √3.数据结构、数据元素、数据项在计算机中的映像分别称为存储结构、结点、数据域。 ╳4.数据项是数据的基本单位。 √5.数据的逻辑结构是指各数据元素之间的逻辑关系,是用户按使用需要建立的。 √6.数据的物理结构是数据在计算机中实际的存储形式。 ╳7.算法和程序没有区别,所以在数据结构中二者是通用的。 ╳8.顺序存储结构属于静态结构,链式存储结构属于动态结构。 三、填空题 1.所谓数据的逻辑结构指的是数据元素之间的____逻辑关系_____。 2,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,它包括三方面的内容___数据的逻辑结构、数据的存储结构、对数据施加的操作___。 3.数据的逻辑结构包括_____集合结构___、_____线性结构___、____树型结构_____和__图状结构_____四种类型。4.在线性结构中,开始结点__没有_前驱结点,其余每个结点有且只有__一个_个前驱结点。 5.在树形结构中,根结点只有___一个___,其余每个结点有且只有___一个___前驱结点;叶结点没有___后继__结点,其余每个结点的后继结点可以有__任意个__· 6.在图形结构中,每个结点的前驱结点和后继结点可以有___任意个___。 7.算法的五个重要特性是__可行性___、___确定性___、___有穷性___、___输入__、___输出__。 8.下列程序段的时间复杂度是__O(n)___。 for (i=1;i<=n;i++) A[i,i]=0; 10.存储结构是逻辑结构的___物理__实现。 11.从数据结构的观点看,通常所说的“数据”应分成三个不同的层次,即__数据__、__数据元素_和__数据项___。12.一个算法的时空性能是指该算法的_时间复杂度___和___空间复杂度_,前者是算法包含的__计算量__,后者是算法需要的___存储量__。 13.数据结构的基本任务是数据结构的__设计__和__实现__。 四、应用题 1.分析下列程序段的时间复杂度。 …… i=1; WHILE (i<=n) i=i*2; …… 答:O(log2n) 2.叙述算法的定义及其重要特性。 答:算法是对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。算法应该具有下列特性:可行性、确定性、有穷性、输入和输出。 3.简述下列术语:数据,数据元素,数据结构,数据对象。 答:数据是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据元素是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等。数据结构是指相互之间存在着一种或多种关系的数据元素的集合。数据对象是性质相同的数据元素的集合。 4.逻辑结构与存储结构是什么关系?

第2章线性表(课堂作业)

第2章线性表 1.下面关于线性表的叙述中,错误的是哪一个?()A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 2.线性表是具有n个()的有限序列(n>0)。 A.表元素 B.字符 C.数据元素 D.数据项 E.信息项 3.线性表( a1,a2,…,an)以链接方式存储时,访问第i位置 元素的时间复杂性为() A.O(i) B.O(1) C.O(n) D.O(i-1) 4.若长度为n的线性表采用顺序存储结构,在其第i个位置插 入一个新元素的算法的时间复杂度为()(1<=i<=n+1)。 A. O(0) B. O(1) C. O(n) D. O(n2) 5. 对于顺序存储的线性表,访问结点和增加、删除结点的时间 复杂度为()。 A.O(n) O(n) B. O(n) O(1) C. O(1) O(n) D. O(1) O(1) 6.对于一个头指针为head的带头结点的单链表,判定该表为空 表的条件是()

A.head==NULL B.head→next==NULL C.head→next==head D.head!=NULL 7.链表不具有的特点是() A.可随机访问任一元素 B.插入、删除不需要移动元素 C.不必事先估计存储空间 D.所需空间与线性长度成正比 8.在双向链表指针p的结点前插入一个指针q的结点操作是()。 >Llink=q;q->Rlink=p;p->Llink->Rlink=q;q->Llink=q; >Llink=q;p->Llink->Rlink=q;q->Rlink=p;q->Llink=p->Llink ; C. q->Llink=p->Llink;q->Rlink=q;p->Llink=q;p->Llink=q; >Rlink=p;q->Llink=p->Llink;p->Llink->Rlink=q;p->Llink=q ; 9.在单链表指针为p的结点之后插入指针为s的结点,正确的 操作是:()。 A. s->next=p->next;p->next=s; B. p->next=s;s->next=p->next; C.p->next=s;p->next=s->next; D. p->next=s->next;p->next=s; 10.对于一个头指针为head的带头结点的单链表,判定该表为

线性表的基本操作讲解

实验二线性表的基本操作 一、实验目的 1.掌握用C++/C语言调试程序的基本方法。 2.掌握线性表的顺序存储和链式存储的基本运算,如插入、删除等。 二、实验要求 1.C++/C完成算法设计和程序设计并上机调试通过。 2.撰写实验报告,提供实验结果和数据。 3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。 三、实验内容: 1. 分析并运行以下各子程序的主要功能。 程序1:顺序存储的线性表和运算 #include #define MAXSIZE 100 int list[MAXSIZE]; int n; /*insert in a seqlist*/ int sq_insert(int list[], int *p_n, int i, int x) {int j; if (i<0 || i>*p_n) return(1); if (*p_n==MAXSIZE) return(2); for (j=*p_n+1; j>i; j--) list[j]=list[j-1]; list[i]=x; (*p_n)++; return(0); } /*delete in a seq list*/ int sq_delete(int list[], int *p_n, int i) {int j; if (i<0 || i>=*p_n) return(1); for (j = i+1; j<=*p_n; j++) list[j-1] = list[j]; (*p_n)--; return(0); } void main() {int i,x,temp; printf("please input the number for n\n"); printf("n="); scanf("%d",&n); for (i=0; i<=n; i++) {printf("list[%d]=",i); scanf("%d",&list[i]);}

实验一 线性表的基本操作

实验一线性表的基本操作 一、实验目的 1. 熟悉C/C++语言上机环境; 2. 掌握线性表的基本操作:查找、插入、删除等运算在顺序存储、链式存储结构上的运算。 二、实验环境 1. 装有Visual C++6.0的计算机。 2. 本次实验共计2学时。 三、实验内容 1. 建立顺序表,基本操作包括:初始化、建立顺序表、输出顺序表、判断是否为空、取表中第i个元素、查找、插入和删除。并在主函数中完成对各种函数的测试。 2. 设有两个非递增有序的线性表A和B,均已顺序表作为存储结构。编写算法实现将A表和B表合并成一个非递增有序排列的线性表(可将线性表B插入线性表A中,或重新创建线性表C)。 3. 建立单链表,基本操作包括:初始化、判断是否为空、取表中第i个元素、查找、插入和删除。并在主函数中完成对各种函数的测试。 四、源程序 #include #include #include #define MaxSize 50 typedef char ElemType; //-------存储结构---------- typedef struct { ElemType elem[MaxSize]; //存放顺序表中的元素 int length; //存放顺序表的长度 } SqList; //-------初始化线性表---------- void InitList(SqList *&L) //初始化线性表,构造一个空的线性表,并将长度设置为0 { L=(SqList *)malloc(sizeof(SqList)); L->length=0;

线性表习题2

线性表典型例题 一、单项选择题 [例7-1]在数据结构中,与所使用计算机无关的数据叫( ①)结构;链表是一种采用( ②)存储结构存储的线性表;链表适用于( ③)查找;在链表中进行( ④)操作的效率比在线性表中进行该操作的效率高。 ①A.存储B.物理C.逻辑D.物理和逻辑 ②A.顺序B.网状C.星式D.链式 ③A.顺序B.二分法C.顺序及二分法D.随机 ④A.二分法查找B.快速查找C.顺序查找D.插入 解析:本题考查的是基本概念。本题答案为:①C;②D;③A;④D。 [例7-2] 链表不具备的特点是( )。 A.插入和删除不需要移动元素B.可随机访问任一结点 C.不必预分配空间D.所需空间与其长度成正比 解析:线性表可随机访问任一结点,而链表必须从第一个数据结点出发逐一查找每个结点。本题答案为:B。 [例7-3] 不带头结点的单链表head为空的判定条件是( )。 A.head==NULL B.head_>next==NULL C.head_>next==head D.head!=NULL 解析:在不带头结点的单链表head中,head指向第一个数据结点。空表即该表没有结点,head==NULL表示该单链表为空。本题答案为:A。 [例7-4] 带头结点的单链表head为空的判定条件是( )。 A.head==NULL B.head—>next==NULL C.head—> next==head D.head!=NULL 解析:在带头结点的单链表head中,head指向头结点。空表即该表只有头结点,head —>next==NULL表示该单链表为空。本题答案为:B。 [例7-5] 带头结点的循环单链表head中,head为空的判定条件是( )。 A.head==NULL B.head—>next==NULL C.head—> next==head D.head!=NULL 解析:在带头结点的循环单链表head中,head指向头结点。空表即该表只有头结点,head—>next==head表示该单链表为空。本题答案为:C。 [例7-6] 线性表采用链式存储时其存储地址( )。 A.必须是连续的B.部分地址必须是连续的 C.一定是不连续的D.连续不连续都可以 解析:链式存储采用动态存储,地址一般不连续。本题答案为:D。 [例7-7] 在双向链表的* p结点前插入新结点*s的操作为( )。 A.p—>prior=s;s—>next=p;p—>prior—>next=s;s—>prior=p—>prior; B.p—>prior=s;p—>prior—>next=s;s—>next=p;s—>prior=p—>prior; C.s—>next=p;s—>prior=p—>prior;p—>prior=s;p—>prior—>next=s; D.s—>next=p;s—>prior=p—>prior;p—>prior—>next=s;p—>prior=s; 解析:在双向链表的* p结点前插入新结点* s的操作如图7.12所示,图中虚线为所作的操作,序号为操作顺序。本题答案为:D。

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

三、写一个算法合并两个已排序的线性表。(用两种方法:数组表示的线性表(顺序表)和指针表示的线性表(链表)) 要求: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 函数中进行测试:先构建一个存储池,然后在该存储池中创建两个静态 表,最后将这两个静态表合并。 七、利用指针表示的线性表(链表)表示一个多项式,并实现两个多项式的相加和相乘运算。假设多项式形式为:11 11...)(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 函数中,构建两个多项式,并测试相加和相乘运算。

线性表算法题

已知线性表(a1 a2 a3 …an)按顺序存于内存,每个元素都是整数,试设计用最少时间把所有值为负数的元素移到全部正数值(假设0为正数)元素前边的算法:例:(x,-x,-x,x,x,-x …x)变为(-x,-x,-x…x,x,x)。 .两个整数序列A=a1,a2,a3,…,am和B=b1,b2,b3,…,bn已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的子序列。 设用带头结点的双向循环链表表示的线性表为L=(a1,a2, …a n)。写出算法将L改造成:L=(a1,a3,…a n,…a4,a2)。 已知A、B、C是三个顺序表且其元素按递增顺序排列,每个表中元素均无重复。在表A删去既在表B中出现又在表C中出现的元素。试设计实现上述删除操作的算法Delete。 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。例如:(7,10,10,21,30,42,42,42,51,70)将变作(7,10,21,30,42,51,70)。 假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。 试编写在带头结点的单链表中删除(一个)最小值结点的(高效)算法。void delete(Linklist &L) 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。例如:(7,10,10,21,30,42,42,42,51,70)将变作(7,10,21,30,42,51,70)。 设有一个正整数序列组成的有序单链表(按递增次序有序,且允许有相等的整数存在),试编写能实现下列功能的算法:(要求用最少的时间和最小的空间) ⑴确定在序列中比正整数x大的数有几个(相同的数只计算一次,如序列 {20,20,17,16,15,15,11,10,8,7,7,5,4}中比10大的数有5个); ⑵在单链表将比正整数x小的数按递减次序排列; ⑶将正整数(比)x大的偶数从单链表中删除。

线性表 习题

第二章 一选择题 1.一个线性表第一个元素的存储地址是100,每个元素的长度为4,则第5个元素的地址是( ) A.110 B.116 C.100 D.120 2. 向一个有128个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。 A.64 B.63 C.63.5 D.7 3.在循环双链表的p所指接点之前插入s所指接点的操作是 A.p-> prior =s;s-> next t=p;p-> prior t->left=s;s-> prior =p-> prior; B. p-> prior =s;p-> prior -> next =s;s-> next =p;s-> prior =p-> prior; C.s-> next =p;s-> prior =p-> prior;p-> prior =s;p-> prior -> next =s; D.s-> next =p;s-> prior =p-> prior;p-> prior -> next =s;p-> prior =s; 4.从一个具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需平均比较()个结点。 A.n B.n/2 C.(n-1)/2 D.(n+1)/2 5.线性表是具有n个()的有限序列(n≠0) A.表元素 B.字符 C.数据元素 D.数据项 6.非空的循环单链表head的尾结点(由P指向)满足 A. p->next=NULL B. p=NULL C. p->next=head D.p=head 7.在一个单链表中已知q所指的结点是p所指结点的前驱结点,若在q和p之间插入s 结点,则执行( ) A. s->next=p->next;p->next=s; B.p->next=s->next;s->next=p; C. q->next=s;s->next=p; D.p->next=s;s->next=q; 8.已知一个顺序存储线性表,若第1个结点的地址d,第3个的地址是5d,则第n个结点的地址为( ) A.[2*(n-1)+1]*d B.2*(n-1)*d C.[2*(n-1)-1]*d D.(n+1)*d 9.在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( ) A.O(1) B.O(n) C.O(n2) D.O(nlog2n) 10.如果最常用的操作是提取第i个结点及其前驱,则采用( )存储方式最节省时间。 A.单链表 B.顺序表 C.循环链表 D.双链表 11.在一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤n)之前插入一个新元素时,需要从后向前依次后移( )个元素。 A.n-i B.n-i+1 C.n-i-1 D.i 12.在一个长度为n的顺序存储线性表中,删除第i个元素(0≤i≤n-1)时,需要从后向

线性表的基本操作实验报告

实验一:线性表的基本操作 【实验目的】 学习掌握线性表的顺序存储结构、链式存储结构的设计与操作。对顺序表建立、插入、删除的基本操作,对单链表建立、插入、删除的基本操作算法。 【实验内容】 1.顺序表的实践 1) 建立4个元素的顺序表s=sqlist[]={1,2,3,4,5},实现顺序表建立 的基本操作。 2) 在sqlist []={1,2,3,4,5}的元素4和5之间插入一个元素9,实现 顺序表插入的基本操作。 3) 在sqlist []={1,2,3,4,9,5}中删除指定位置(i=5)上的元素9, 实现顺序表的删除的基本操作。 2.单链表的实践 3.1) 建立一个包括头结点和4个结点的(5,4,2,1)的单链表,实现单链 表建立的基本操作。 2) 将该单链表的所有元素显示出来。 3) 在已建好的单链表中的指定位置(i=3)插入一个结点3,实现单链表插 入的基本操作。 4) 在一个包括头结点和5个结点的(5,4,3,2,1)的单链表的指定位置 (如i=2)删除一个结点,实现单链表删除的基本操作。 5) 实现单链表的求表长操作。 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了刚创

建的工程之中。 4.写好代码 5.编译->链接->调试 1、#include "stdio.h" #include "malloc.h" #define OK 1 #define OVERFLOW -2 #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType; typedef int Status; typedef struct { ElemType *elem; int length; int listsize; } SqList; Status InitList( SqList &L ) { int i,n; L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof (ElemType)); if (!L.elem) return(OVERFLOW); printf("输入元素的个数:"); scanf("%d",&n); printf("输入各元素的值:"); for(i=0;i

线性表插入类排序算法

软件基础基础实验报告 系别:地质工程系班级:09测绘学号:0910205006 姓名:严康文实验时间:实验地点:网教中心 实验环境:Turbo c++3.0(vc6.0) 实验名称:线性表的插入类排序算法 实验目的: (1)掌握简单插入排序算法 (2)掌握希尔排序算法★ 实验内容: a)对无序序列P(1:n)进行插入排序。 备注:需要用到的算法是:insort( ) b)对无序序列P(1:n)进行希尔排序。 备注:需要用到的算法是:shlsort( ) 程序代码:(请写上详细的程序注释!注意这是重要的评分依据!) #include"stdio.h" #include"stdlib.h" void input(int *v,int *n) { int i; printf("请输入%d元素到线性表\n",*n); for(i=0;i<*n;i++) {scanf("%d",v+i);printf("\n请输入下一个元素到线性表\n");} printf("输入完成,停止输入\n");

} void output(int *v,int *n) {int i; for(i=0;i<*n;i++) printf("线性表的第%d个元素为%d\n",i+1,*(v+i)); } int *initsl(int m,int *n) { int *v; v=(int *)malloc(m*sizeof(int)); return v; } void insl(int *v,int m,int *n,int i,int b) {int j; if(*n==m) {printf("overflow\n"); return; } if(i>*n-1) i=*n+1; if(i<1) i=1; for(j=*n;j>=i;j--) v[j]=v[j-1];

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

《数据结构》填空作业题答案 第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. 对于某一类特 定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。

相关主题
文本预览
相关文档 最新文档