线性表(一)
问题:
有2个线性表LA,LB,现在要求组成一个新的集合A=A+B
void merge(sqList *LA,sqList *LB){
int i;
elemType e;
for(i=1;i<=listLength(LB);i++){
e = getElem(LB,i);
if(!locateElem(LA,e)){
listInsert(LA,listLength(LA)+1,e);
}
}
}
线性表的顺序表示和实现
线性表的顺序表示是指用一组地址连续的存储单元以此存储线性表的数据元素。
LOC(a[i]) = LOC(a[1]) + (i-1)*d
d表示每个元素所占的存储单元
LOC(a[1])是线性表的第一个数据元素a[1]的存储位置,通常叫做线性表的起始位置或基地址。
采用顺序存储的线性表,只要确定了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,线性表的顺序存储结构式一种随机存取的存储结构。
带动态分配存储空间功能的线性表顺序存储C语言表示:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 5
typedef int elemType;
typedef struct{
elemType *list;
int length;
int maxSize;
}sqList;
/*1.初始化线性表L,分配内存空间*/
void initList(sqList *L){
L->list = malloc(MAXSIZE * sizeof(elemType));
if(!L->list){
printf("空间分配失败!\n");
exit(0);
}
L->length = 0;
L->maxSize = MAXSIZE;
printf("空间分配成功!\n");
return;
}
/*2.销毁线性表,释放内存空间*/
void destroyList(sqList *L){
if(!L->list){
printf("该线性表不存在!\n");
exit(0);
}
free(L->list);
L->list = NULL;
L->length = L->maxSize = 0;
printf("线性表销毁成功!\n");
return;
}
/*3.将线性表置为空表,不释放存储空间*/
void clearList(sqList *L){
if(L->list != NULL){
L->length = 0;
}
return;
}
/*4.若L为空表,则返回TRUE,否则返回FALSE*/
int listEmpty(sqList *L){
return L->length == 0 ? TRUE : FALSE;
}
/*5.返回线性表L中数据元素的个数*/
int listLength(sqList *L){
return L->length;
}
/*6.获取线性表中指定位置的元素*/
elemType getElem(sqList *L,int i){
if(i<1 || i >listLength(L)){
printf("序号越界!");
exit(0);
}
return L->list[i-1];
}
/*7.返回L中第1个等于e的数据元素的位序,不存在,则返回0*/
int locateElem(sqList *L,elemType e){
elemType *p = L->list;
int i=0;
while(i<listLength(L) && *p!=e){
p++;
i++;
}
if(i == listLength(L)){
i=-1;
}
return i+1;
}
/*8.若cur_e是L的数据元素,且不是第一个,则用e返回它的前驱,否则操作失败*/
elemType priorElem(sqList *L,elemType cur_e){
int i;
elemType *p = L->list;
for(i=1;i<listLength(L);i++,p++){
if(*p == cur_e){
break;
}
}
if(i == listLength(L)){
printf("输入的不是该线性表的元素!");
exit(0);
}
if(i == 1){
printf("输入的元素没有前驱元素!");
exit(0);
}
return L->list[i-2];
}
/*9.若cur_e是L的数据元素,且不是最后一个,则用e返回它的后继,否则操作失败*/
elemType nextElem(sqList *L,elemType cur_e){
int i;
elemType *p = L->list;
for(i=1;i<listLength(L);i++,p++){
if(*p == cur_e){
break;
}
}
if(i == listLength(L)){
printf("输入的不是该线性表的元素!");
exit(0);
}
if(i == listLength(L)-1){
printf("输入的元素没有后继元素!");
exit(0);
}
return L->list[i];
}
/*10.在线性表L中第i个位置之前插入新的数据元素e,L的长度+1*/
void listInsert(sqList *L,int i,elemType e){
if(i < 1 || i >listLength(L)+1){
printf("序号越界,插入失败!\n");
exit(0);
}
if(listLength(L) == L->maxSize){
elemType *p = realloc(L->list,(L->maxSize+1) * sizeof(elemType));
if(!p){
printf("空间再分配失败!");
exit(0);
}
L->list = p;
L->maxSize++;
}
int j=listLength(L);
while(j >= i){
L->list[j] = L->list[j-1];
j--;
}
L->list[i-1] = e;
L->length++;
return;
}
/*11.删除线性表L的第i个元素,并使用e返回,L长度-1*/
void listDelete(sqList *L,int i,elemType e){
if(i < 1 || i >listLength(L)){
printf("序号越界,插入失败!\n");
exit(0);
}
e = L->list[i-1];
while(i<listLength(L)+1){
L->list[i-1] = L->list[i];
i++;
}
L->length--;
}
/*12.依次对线性表L的每个元素调用函数visit()*/
void listTraverse(sqList *L,void (*visit)(elemType)){
int i;
for(i=1;i<=listLength(L);i++){
visit(getElem(L,i));
}
printf("\n");
return;
}
void visit(elemType e){
printf("%d ",e);
}
int compare(elemType a,elemType b){
return a-b;
}
void merge(sqList *LA,sqList *LB){
int i;
elemType e;
for(i=1;i<=listLength(LB);i++){
e = getElem(LB,i);
if(!locateElem(LA,e)){
listInsert(LA,listLength(LA)+1,e);
}
}
}
int main(){
sqList L;
initList(&L);
int a[6] = {3,6,7,9,11,13};
int i;
printf("线性表 maxSize = %d \n",L.maxSize);
for(i=0;i<6;i++){
listInsert(&L,i+1,a[i]);
}
listTraverse(&L,visit);
printf("线性表 maxSize = %d \n",L.maxSize);
destroyList(&L);
return 0;
}
分享到:
相关推荐
数据结构--第二章 线性表 本章节主要介绍了线性表的基本概念、类型定义、链式表示和实现、顺序表示和实现,以及相关的操作。线性表是一种最简单的线性结构,它由有序的数据元素组成,每个元素都有唯一的前驱和后继...
数据结构第二章课件——线性表 本资源主要介绍了线性表的定义和抽象数据类型,线性表的顺序存储结构和链接存储结构,以及每种线性表操作在顺序存储结构和链接存储结构上的具体实现。 1. 线性表的定义和抽象数据...
使用线性表的间接寻址( class IndirectList )方法,实现二分查找; 查找的数据由键盘输入; 输出线性表和查找的结果(包括次数);
二、线性表的实现 线性表可以使用数组或链表来实现。数组实现的线性表可以使用静态分配的数组来存储元素,而链表实现的线性表可以使用动态分配的链表来存储元素。 在本实验中,我们使用链表来实现线性表。链表是一...
线性表的合并通常涉及到两个或更多线性表的组合,目标是形成一个新的线性表,其中包含所有原始线性表的元素。在C++中,我们可以使用数组、链表或者动态数组(如std::vector)来表示线性表。这里我们将主要讨论基于...
二、实验要求: 1. 精通线性表的顺序存储结构和其操作函数的实现。 2. 理解实验案例的算法,了解线性表在实际问题中的应用。 3. 完成所有上机程序的调试工作。 4. 独立完成至少一个实训项目,保存运行结果并进行...
#### 二、代码解析 给定的代码实现了基于顺序存储的线性表的基本操作。下面对各个部分进行详细解析: ##### 1. 定义线性表结构体 ```c struct seqlist { int len; // 当前线性表中元素的实际个数 int list[MAXLEN...
线性表的定义和基本操作 线性表的顺序存储结构 线性表的链式存储结构 线性表的应用举例
根据给定文件的信息,我们可以总结出关于数据结构中线性表的重要知识点,特别是涉及线性表的基本概念、操作以及相关的自测题目解析。下面将详细展开这些知识点。 ### 数据结构与线性表基本概念 #### 线性表定义 ...
二、链表实现线性表 1. 定义节点结构:链表的每个元素由节点表示,包含元素值和指向下一个节点的指针。 ```c typedef struct Node { int value; // 元素值 struct Node *next; // 指向下一个节点的指针 } Node; ...
《数据结构》第二章线性表习题 本资源是《数据结构》第二章线性表习题,涵盖了线性表的基本概念、顺序表和链表的存储结构、线性表的操作等知识点。 一、线性表的基本概念 线性表是一种有限序列,可以为空或不为空...
### 二、代码解析 #### 1. 数据结构定义 在给定的代码中,定义了一个名为`Seqlist`的数据结构,用来表示线性表,其中包含两个成员:一个整型数组`data`用于存放线性表中的数据元素;一个整型变量`length`用于记录...
第二个表包含记录:(5,60),(6,80), (7,76),(8,50)。 2. **建立有序表**:根据成绩由大到小建立两个有序表,一个是顺序表,另一个是链表。 3. **合并有序表**(选做):有能力的学生还需要实现将两个有序表合并成...
由于提供的文件内容是部分经过OCR扫描的文字,并存在一些识别错误和不连贯的地方,我们将尝试从中提取有关线性表的知识点,并进行系统的整理和解释。 线性表是数据结构中一个重要的概念,它是具有相同特性的数据...
查找效率取决于查找算法,简单的顺序查找时间复杂度为O(n),而二分查找等高级查找算法需要线性表有序,时间复杂度为O(logn)。 5. **更新元素**:修改线性表中某个位置的元素值。 6. **遍历线性表**:从头到尾访问...
二、顺序存储结构 顺序存储结构是指用一组地址连续的存储单元依次存储顺序表的数据元素。顺序表的基本操作包括: * 求长度:返回线性表的长度 * 插入:在线性表第 i(0)个位置插入元素 x * 删除:删除线性表中的第 ...
#### 二、单链表的基本概念 - **节点结构**:`typedef struct Node { ElemType data; struct Node* next; } Node,*LinkList;` - `data`:存储实际数据的字段。 - `next`:指向下一个节点的指针。 #### 三、线性表...