数据结构(C实现)------- 顺序表

线性表是由n(n>=0)个具有相同数据类型的数据元素组成的有限序列,通常记为:(a1,a2,..,ai-1,ai,ai+1,...,an),表中相邻元素之间存在着序偶关系,即<ai-1,ai>,其中ai-1称为ai的前驱,ai称为ai-1的后继,2<=i<=n。表中数据元素的个数n,称为线性表的长度,长度为0的线性表称为空表。在非空的线性表中,每个数据元素都有一个确定的位置,如a1是第一个元素,an是最后一个元素,ai是第i个元素,称i 为数据元素ai在线性表上的位序.

顺序表是线性表的顺序存储结构,是指用一组连续的存储单元依次存储线性表的数据元素。在顺序表中,逻辑关系相邻的两个元素在物理位置上也相邻,元素之间的逻辑关系是通过下标反映出来的。

数组可以用来描述顺序表,但考虑到顺序表的长度是不断变化的,所以通常将一维数据和顺序表的长度封装成一个结构体来描述顺序表。如下所示:

// 定义顺序表
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int
typedef struct{
	ElemType *elem;//存储空间基址
	int length;	//当前长度 
	int listsize; 	//当前分配的存储容量
}SqList;

针对线性表,有初始化,插入,删除,清空,得到表长度,打印顺序表,销毁,定位等操作,分另如下:

//宏定义
#define Status int
#define OK 1
#define OVERFLOW 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

顺序表的各种操作:

// 初始化
Status InitList_Sq(SqList *L){
	L->elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L->elem)
		exit(OVERFLOW);
	L->length = 0;
	L->listsize = LIST_INIT_SIZE;
	return OK;
}

// 在指定位置插入元素
Status ListInsert_Sq(SqList *L,int i,ElemType e){
	//在顺序表L中的第i个位置之前插入新的元素e
	ElemType *q,*p;
	if(i < 1 || i > L->length+1){
		printf("位置不合法\n");
		return ERROR;
	}
	if(L->length >= L->listsize){
		ElemType *newbase = (ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)
			exit(OVERFLOW);
		L->elem = newbase;
		L->listsize = L->listsize+LISTINCREMENT;
	}
	q = &(L->elem[i-1]);// 插入位置
	for (p = &(L->elem[L->length - 1]);p>=q;p--)
		*(p+1) = *p;

	*q = e;
	L->length++;
	printf("元素%d已被插入到顺序表中\n",e);
	return OK;
}

//  打印顺序表
Status ListPrint_Sq(SqList *L){
	ElemType *p,*q;
	if(L->length == 0){
		printf("顺序表为空\n");
		return ERROR;
	}
	p = L->elem;//取出顺序表的首地址
	q = L->elem + L->length - 1;//取出顺序表的末地址
	printf("顺序表元素为:");
	while(p <= q ){
		printf("%d\t",*p);
		p++;
	}
	printf("\n");
	return OK;
}

// 删除顺序表中的第i个元素 
Status ListDelete_Sq(SqList *L,int i){
	ElemType *p,*q,e;
	if(i < 1 ||  i > L->length){
		printf("位置不合法\n");
		return ERROR;
	}
	p = &(L->elem[i-1]);//取出被删除元素的地址
	e = *p;//取出被删除元素
	q = L->elem + L->length -1;
	while(p < q){
		*p = *(p+1);
		p++;
	}
	L->length--;
	printf("元素%d已被删除\n",e);
	return OK;

}

//得到顺序表的长度
int  ListLength_Sq(SqList *L){
	return L->length;
}

//判断是否为空表
Status ListEmpty_Sq(SqList *L){
	if(L->length == 0){
		printf("表为空\n");
		return TRUE;
	}
	else{
		printf("表不空\n");
		return FALSE;

	}
}
//清空顺序表
Status ClearList_Sq(SqList *L){
	L->length = 0;
}

//销毁顺序表
Status DestroyList_Sq(SqList *L){
	free(L->elem);
	L->length = 0;
	return OK;
}

//查找指定位置的元素
Status GetListElem_Sq(SqList *L,int i){
	ElemType *p;
	if( i < 1 || i > L->length){
		printf("位置不合法\n");
		return ERROR;
	}
	p = &(L->elem[i-1]);
	printf("查找成功,顺序表的第i个元素为%d",*p);
	return OK;

}
// 查找满足条件的元素,并返回查找到第一个的位置
int LocateList_Sq(SqList *L,ElemType e){
	ElemType *p,*q;
	int l=0,flg=0;
	p = L->elem;
	q = L->elem + L->length -1;
	while(p  <= q){
		if( e == *p){
			flg = 1;
			break;
		}
		l++;
		p++;
	}
	if(flg == 0){
		printf("顺序一中没有这个元素\n");
		return 0;
	}
	printf("查找成功,该元素在顺序表中的第%d个位置",l);
	return l;

}

测试时,在主函数里先定义一个结构体SqList L,然后就可以测试相关的函数了,如InitList_Sq(&L);或ListPrint_Sq(&L);

时间: 2024-10-10 17:23:56

数据结构(C实现)------- 顺序表的相关文章

C#(数据结构):1.顺序表结构(2)

人生总有那么多未完的篇章,但是有时候今天你没完成的可能你以后再也不会完成.承诺的一切兴许也变成了过眼云烟.想抓住,握紧的拳头却使他们溜的更快.人生恰如初见,几多的欣喜. ----------------------------------------------------------------------------------------------万恶的分割线------------------------------------------------ 分割线都受不了了.好吧之前我们说

C#(数据结构):1.顺序表结构

我们程序员有三大优点:懒.困.自负.很荣幸我这三点都占了.但是木有关系这丝毫动摇不了我学习的决心.因为技术没有止境. -------------------------------------------------------------------------------------万恶的分割线------------------------------------------------------ 一个人生的分割线. 曾多少次我告诉自己要和昨天的自己说再见.不带走自己的过去,新中幻想着永

C#(数据结构):1.顺序表结构(3)

程序员的道路艰难险阻,如果有新生派的小学生问我他可以做程序员吗?我会毫不犹豫的告诉他放下程序立地成佛,千万不要踏足这一行.虽然这行妹子很多,但是勿来,勿入,勿学.不要问我为什么,说多了全是泪... -----------------------------------------------------------------------------------万恶的分割线------------------------------------------------- 好吧情感戏也就这么多了,

数据结构笔记(二)--顺序表

线性表 线性结构:最常用,最简单的一种数据结构,其中的数据元素是有序且是有限的,其 基本特点: 存在一个唯一的被称为 第一个 的数据元素 存在一个唯一的被称为 最后一个 的数据元素 除第一个元素外,每一个元素均有唯一 一个直接前驱 除最后一个元素外,每一个元素均有唯一 一个直接后继 2.1 线性表的逻辑结构 2.1.1线性表的定义 线性表(Linear List) :是由n个数据类型相同的数据元素(结点)组成的有限序列.其中 n 为不小于0的整数.数据元素的个数 n 称为线性表的长度 相关术语:

【数据结构】之顺序表和链表的比较

1.顺序表 顺序表的优点: (1) 方法简单,各种高级语言中都有数组,容易实现.(2) 不用为表示结点间的逻辑关系而增加额外的存储开销.(3) 顺序表具有按元素序号随机访问的特点. 顺序表的缺点: (1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低.(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 2.链表 链表的优点: (1) 在链表中做插入删除操作时,不会影响前面和后面的节点,因此对n较大的链表

数据结构实践项目——顺序表

[项目1 - 顺序表的基本运算] 领会"0207将算法变程序"部分建议的方法,将顺序表部分的算法变成程序. 实现顺序表基本运算有算法(对应视频0204创建线性表的实现和0205顺序表基本运算的实现),依据"最小化"的原则进行测试.所谓最小化原则,指的是利用尽可能少的基本运算,组成一个程序,并设计main函数完成测试. 作为第一个这种类型的实践(后续每一部分均有这种实践,这是我们学习的基础,也是实践成果积累的基础),结合相关的算法,给出建议的过程: (1)目的是要测试

【数据结构】之顺序表(Java语言描述)

之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中,为我们提供了专门的顺序表的数据结构API-- ArrayList . Java中的ArrayList的基本存储思路和C语言中的思路相似,即将所有元素存储在一个数组中,当数组中的元素个数达到某种标准时,就要扩容.由于顺序表中的其他操作在Java和C中的实现方式大同小异,因此,本文不再详细介绍这些操作

数据结构实现之顺序表

所谓数据结构,就是定义一组有关系的数据以及在这些数据上的操作,也就是ADT(抽象数据类型). 包括三个方面; ADT List{ 数据对象:  数据关系:基本运算:} 以顺序表为例,它的顺序存储类型: typedef struct { ElemType data[MaxSize]; // <span style="font-family: Arial, Helvetica, sans-serif;">ElemType存放数据类型</span> int lengt

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

数据结构与算法 顺序表 链表

内存 计算机的作用 用来存储和运算二进制的数据 衡量计算机内存大小的单位: bit(位): 字节:8bit kb:1024字节 mb:1024kb 问题:计算机如何计算1+2? 必须先在计算机的内存开辟内存空间 才将对应的数值存储到该内存中 变量的概念 a = 10 在计算机中表示的含义(内存图) 内存空间开辟好了之后,每一块内存空间都会有两个默认的属性 内存空间的大小:算机内存大小的单位 内存空间的地址:十六进制的数值 地址作用:用来定位(追踪)指定内存空间,就可以获取该内存空间中存储的数据