`
housen1987
  • 浏览: 345389 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
阅读更多

线性表的定义类型

线性表(linear_list)

一个线性表是n个数据元素的有限序列。

一个数据元素可以由多个数据项(item)组成,这个时候把数据元素称为记录(record),含有大量记录的线性表又称为文件(file)。

同一线性表中的元素必定具有相同特性,即属同一数据对象。

线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为空表。

在非空表中的每个数据元素都有一个确定的位置,a[i]是第i个数据元素,称i为数据元素a[i]在线性表中的位序。

线性表的长度可根据需要而变化,对线性表的数据元素不仅可以访问,还可以进行插入和删除等。

抽象数据类型线性表的定义如下:

ADT List{
	数据对象:D={a[i],i=1,2,...,n,n>=0}
	数据关系:R1={<a[i-1],a[i]>,i=2,...,n}
	基本操作:
		initList(&L)
			操作结果:构造一个空的线性表
		destroyList(&L)
			初始条件:线性表已存在
			操作结果:销毁线性表L
		clearList(&L)
			初始条件:线性表L已存在
			操作结果:将L重置为空表
		listEmpty(&L)
			初始条件:线性表L已存在
			操作结果:若L为空表,则返回TRUE,否则返回FALSE
		listLength(&L)
			初始条件:线性表L已存在
			操作结果:返回L中数据元素个数
		GetElem(&L,i,e)
			初始条件:线性表L已存在,1<=i<=listLength(&L)
		locateElem(&L,e,compare())
			初始条件:线性表L已存在,compare()是数据元素判定函数
			操作结果:返回L中第1个与e满足关系compare()的数据元素的位序,若这样的元素不存在,则返回0
		priorElem(&L,cur_e,e)
			初始条件:线性表L已存在
			操作结果:若cur_e是L的数据元素,且不是第一个,则用e返回它的前驱,否则操作失败
		nextElem(&L,cur_e,e)
			初始条件:线性表L已存在
			操作结果:若cur_e是L的数据元素,且不是最后一个,则用e返回它的后继,否则操作失败
		listInsert(&L,i,e)
			初始条件:线性表L已存在,1<=i<=listLength(&L)+1
			操作结果:在L中第i个位置之前插入新的数据元素e,L的长度+1
		listDelete(&L,i,e)
			初始条件:线性表L已存在且非空,1<=i<=listLength(L)
			操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1
		listTraverse(L,visit())
			初始条件:线性表L已存在	
			操作结果:依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
}ADT List
 

C语言程序模拟线性表如下:

 

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 11

typedef int elemType;
typedef struct{
	elemType *list;
	int length;	
}sqList;
/*1.初始化线性表L,分配内存空间*/
void initList(sqList *L){
	L->length = 0;
	L->list = malloc(MAXSIZE * sizeof(elemType));
	if(!L->list){
		printf("空间分配失败!\n");
		exit(0);
	}
	printf("空间分配成功!\n");
	return;
}
/*2.销毁线性表,释放内存空间*/
void destroyList(sqList *L){
	if(!L->list){
		printf("该线性表不存在!\n");
		exit(0);
	}
	free(L->list);
	L->list = NULL;
	L->length = 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=0;
	}
	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) >= MAXSIZE){
		printf("元素已满,不能插入\n");
		exit(0);
	}
	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){
	int i;
	for(i=0;i<listLength(L);i++){
		printf("%d ",L->list[i]);
	}
	printf("\n");
	return;
}

int main(){
	sqList L;
	initList(&L);
	int i;
	for(i=1;i<=10;i++){
		listInsert(&L,i,i);
	}
	listTraverse(&L);
	elemType e;
	listDelete(&L,5,e);
	listTraverse(&L);
	e = L.list[3];
	printf("元素 %d 下一个元素是: %d\n",e,nextElem(&L,e));
	printf("元素 %d 前一个元素是: %d\n",e,priorElem(&L,e));
	printf("元素 %d 的位序是: %d\n",e,locateElem(&L,e));
	printf("线性表的第 %d 个元素是 : %d\n",9,getElem(&L,9));
	printf("当前线性表长度为:%d\n",listLength(&L));
	destroyList(&L);
	return 0;	
}
分享到:
评论

相关推荐

    数据结构线性表一元多项式的表示及相加PPT学习教案.pptx

    在线性表中,一元多项式的表示及相加是数据结构中的一个重要概念。本文将对一元多项式的表示及相加进行详细讲解。 一元多项式的表示 一元多项式的表示可以用一个关于系数的线性表来表示:P = (p0, p1, …, pn)。...

    其它课程c线性表一PPT教案学习.pptx

    【线性表】是计算机科学中一种基本的数据结构,它属于线性结构,具有单一的前后关系,每个元素都有且仅有一个直接前驱和一个直接后继。线性表的逻辑结构可以表示为 (a1, a2, ..., an),其中n代表元素的数量,当n等于...

    数据结构+实验报告+线性表及其应用(多项式相加、相乘)等

    每个节点存储多项式中的一项的系数和指数,其中高指数的节点位于低指数节点之前,从而确保线性表按指数递增有序排列。 #### 多项式加法算法 1. **初始化**:定义指针`p`、`q`分别指向两个多项式`ha`、`hb`的头部。 ...

    数据结构 线性表算法例题讲解.docx

    此算法的时间复杂度为O(La_len + Lb_len),因为它只需要遍历两个输入线性表一次。 **例3:顺序线性表的插入** 顺序线性表是指数据在内存中是连续存储的,插入操作通常涉及到移动元素。算法首先检查插入位置`i`是否...

    用线性表实现一个一元多项式Polynomial

    该源程序是数据结构的代码实现:用线性表实现一个一元多项式Polynomial

    将一个整数线性表拆分成奇数和偶数线性表

    标题 "将一个整数线性表拆分成奇数和偶数线性表" 涉及的核心知识点是数据结构中的线性表操作以及算法设计。线性表是一种基本的数据结构,它由有限个相同类型元素构成的有序序列,常见的实现方式有数组和链表。 在本...

    线性表

    我自己写的一个线性表一个枚,供大家参考,哈哈

    线性表实现一个多项式.rar

    在数据结构的学习中,线性表是一种基础且重要的数据结构,它可以用来表示各种类型的数据集合。在这个特定的实验“线性表实现一个多项式”中,我们关注的是如何利用线性表来存储和操作数学中的多项式。这篇实验报告...

    数据结构实验一线性表的基本操作.docx

    数据结构实验一线性表的基本操作 一、线性表的概念和类型 线性表是一种基本的数据结构,它是一种由零个或多个元素组成的有限序列,每个元素都是数据类型的实例。线性表可以分为两种类型:顺序存储结构和链式存储...

    线性表小程序,C#,可以实现线性表中某一元素的删除、插入,及线性表的连接

    线性表是一种基础的数据结构,它是由n(n&gt;=0)个相同类型元素构成的有限序列。在C#中,我们可以使用数组或者列表(List)来实现线性表。这个线性表小程序提供了对线性表的基本操作,包括元素的插入、删除以及线性表的...

    数据结构与算法实验报告-线性表.doc

    * 在顺序表的第 i 个位置上插入一个元素时,必须先将线性表的第 i 个元素之后的所有元素一次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。 * 当要删除第 i 个元素时,也只需将第 i 个元素之后的所有...

    线性表操作集合(网上整理)

    线性表是一种基础的数据结构,它是由相同类型元素构成的有限序列。在计算机科学中,线性表的操作集合通常包括创建、插入、删除、获取元素和合并等基本操作。以下是对给定文件中涉及的线性表操作的详细解释: 1. **...

    194(将一个整数线性表拆分成奇数和偶数线性表)

    将一个整数线性表拆分成奇数和偶数线性表,课后习题,完整好用

    用线性表实现的通讯录,C++代码实现

    线性表中的每个元素都有一个前驱元素和后继元素,除了第一个元素没有前驱,最后一个元素没有后继。在本通讯录管理系统中,使用了线性表来存储联系人的信息,包括姓名、性别、电话号码和地址等字段。 #### 三、代码...

    数据结构:线性表求一元多项式的值

    线性表作为最基础的数据结构之一,广泛应用于各种编程任务中,包括处理数学问题,如求解一元多项式的值。本篇文章将深入探讨如何利用C++实现线性表来解决这个问题。 一元多项式通常表示为 \( ax^n + bx^{n-1} + ......

    线性表的顺序存储 线性表的顺序存储

    在顺序存储结构中,线性表的元素被存储在一个一维数组中,按照它们在表中的相对位置来表示数据之间的逻辑关系。这种方式简单直观,易于理解和操作。 线性表的顺序存储具有以下特点: 1. **连续存储**:所有元素存储...

    数据结构实验2 线性表.doc

    一、 实验目的: (1) 理解线性表的逻辑结构、两种存储结构和数据操作; (2) 应用顺序表的基本算法实现集合A=AUB算法,应用顺序表的基本算法实现两有序顺序表的归并算法; (3) 掌握单链表的遍历、插入和删除等...

    线性表的应用(数据结构-线性表)

    合并函数用于将两个已排序的线性表合并成一个新的有序表。实现时需要注意保持原有表不变,并确保合并后的表也是有序的。这通常可以通过归并排序的思想来实现,即比较两个表的首元素,较小的元素加入新的表中,然后...

    C# 线性表使用实例

    在编程领域,线性表是一种基础且重要的数据结构,它由有限个相同类型元素组成,元素之间存在一对一的关系。在C#中,我们可以通过类和接口来实现线性表,同时利用泛型来提高代码的复用性。下面将详细探讨如何在C#中...

Global site tag (gtag.js) - Google Analytics