`
vaneng
  • 浏览: 18434 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

线性表-SqList

阅读更多
数据结构线性表-SqList 参考书:《数据结构(C语言)》作者:严蔚敏

如果发现错误,请帮忙指正,谢谢。

转载请注明@author vaneng

SqList.h:
/*@author vaneng
 *数组下标从0元素开始
 *指针定义格式:类型名 *类型名缩写+"_ptr"
 *struct名首字母大写
 *函数名首字母小写
 *函数指针写具体的函数名,便于对照
 *带下标的变量从0开始写
 *第几个都是从1开始,即:不存在第0个
 */
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct {
	ElemType *e_ptr;
	int length;
	int listsize;
}SqList;
SqList *initList();					//构造一个空的线性表
void destroyList(SqList *l_ptr);	//销毁线性表
void clearList(SqList *l_ptr);		//将线性表置为空
int listEmpty(SqList list);			//判断是否为空表
int listLength(SqList list);		//线性表长度
void getElem(SqList list, int i, ElemType *e_ptr);	//得到第i个元素存储到e
ElemType *locateElem(SqList list, ElemType e, int (*compare)(ElemType e0, ElemType e1));					//将第一个值为e的指针返回
void priorElem(SqList list, ElemType cur_e, ElemType *pre_e_ptr, int (*compare)(ElemType e1, ElemType e2));	//cur_e的前一个元素赋值到pre_e_ptr
void nextElem(SqList list, ElemType cur_e, ElemType *next_e_ptr, int (*compare)(ElemType e1, ElemType e2));	//cur_e的后一个元素赋值到next_e_ptr
void listInsertLast(SqList *l_ptr, ElemType e);				//从最后一个位置插入e
void listInsert(SqList *l_ptr, int i, ElemType e);			//将e插入到第i个位置
void listDelete(SqList *l_ptr, int i, ElemType *e_ptr);		//将第i个删除,结果放到e_ptr
void listTraverse(SqList list, void (*visit)(ElemType e));	//遍历list

void error(char *name, char *msg);		//显示错误信息msg为function名
int resize(SqList *l_ptr);	//realloc


SqList.c
/*@author vaneng*/
#include "SqList.h"
#include <malloc.h>
SqList *initList(){
	SqList *l_ptr = (SqList *)malloc(sizeof(SqList));
	l_ptr->length = 0;
	l_ptr->listsize = LIST_INIT_SIZE;
	l_ptr->e_ptr = (ElemType *)malloc(l_ptr->listsize*sizeof(ElemType));
	if(!l_ptr->e_ptr){
		error("initList","Malloc failed");
		return 0;
	}
	return l_ptr;
}
void destroyList(SqList *l_ptr){
	/*destroy之后程序应该把l_ptr=0*/
	if(l_ptr){
		free(l_ptr->e_ptr);
		l_ptr->e_ptr = 0;
		free(l_ptr);
	}else{
		error("destroyList", 
			"l_ptr is null");
	}
}
void clearList(SqList *l_ptr){
	/*我觉得这样就可以了,
	*initList是建造一个空表
	*clearlist是将有东西的表设为一个空表
	*/
	if(l_ptr){
		l_ptr->length=0;
	}else{
		error("clearList", "l_ptr is null");
	}
}
int listEmpty(SqList list){
	return list.length;
}
int listLength(SqList list){
	return list.length;
}
void getElem(SqList list, int i, ElemType *e_ptr){
	/*测试 0<i<=length
	这个地方应该是针对e的地址的一个赋值,直接
	将e = list->e_ptr+i 没有意义
	*/
	if(i<=0||i>list.length){
		error("getElem","i is larg or small");
	}else
		*e_ptr=*(list.e_ptr+i-1);
}
ElemType *locateElem(SqList list, ElemType e, int (*compare)(ElemType e1, ElemType e2)){
	ElemType *e_ptr = list.e_ptr;
	int i = 0;
	while(i++<list.length&&!compare(*(e_ptr++),e));
	if(i==list.length)
		return 0;
	else
		return e_ptr-1;
}
void priorElem(SqList list, ElemType cur_e, ElemType *pre_e_ptr, int (*compare)(ElemType e1, ElemType e2)){
	ElemType *e_ptr = locateElem(list, cur_e, compare);
	if(e_ptr == list.e_ptr || !e_ptr){
		error("priorElem", "Current element is the first element or it is not exist");
		*pre_e_ptr = 0;
	}else{
		*pre_e_ptr = *(--e_ptr);
	}
}
void nextElem(SqList list, ElemType cur_e, ElemType *next_e_ptr, int (*compare)(ElemType e1, ElemType e2)){
	ElemType *e_ptr = locateElem(list, cur_e, compare);
	if(e_ptr == list.e_ptr+list.length-1){
		error("nextElem", "There is no element after the current element");
	}else{
		*next_e_ptr = *(++e_ptr);
	}
}
void listInsertLast(SqList *l_ptr, ElemType e){
	int flag = 1;
	if(l_ptr->length == l_ptr->listsize){
		flag = resize(l_ptr);
	}
	if(flag){
		*(l_ptr->e_ptr+l_ptr->length)=e;
		l_ptr->length++;
	}else{
		error("listInsertLast", "InsertLast failed");
	}
}
void listInsert(SqList *l_ptr, int i, ElemType e){
	ElemType *flag_ptr = l_ptr->e_ptr+i-1;
	ElemType *cursor_ptr;
	int flag = 1;
	if(i<=0 ||i >l_ptr->length+1){
		/*i可以比length大1
		此刻相当于listInsertLast*/
		error("listInsert", "i is out of the array bound");
		return;
	}
	if(l_ptr->length == l_ptr->listsize && resize(l_ptr)){
		return;
	}
	for(cursor_ptr = l_ptr->e_ptr + l_ptr->length; cursor_ptr>flag_ptr;cursor_ptr--)
		/*    *cursor_ptr = *(--cursor_ptr)
		不要这么写,等式左右两边不知道先计算哪个
		*/
		*cursor_ptr = *(cursor_ptr-1);
	*cursor_ptr = e;
	l_ptr->length++;
}
void listDelete(SqList *l_ptr, int i, ElemType *e_ptr){
	ElemType *cursor_ptr;
	if(i<1 ||i >l_ptr->length){
		error("listDelete", "i is out of the array bound");
		return;
	}
	*e_ptr = *(l_ptr->e_ptr+i-1);
	for(cursor_ptr = l_ptr->e_ptr +i-1; cursor_ptr < l_ptr->e_ptr + l_ptr->length - 1;cursor_ptr++)
		/**cursor_ptr = *(++cursor_ptr)
		不要这么写,等式左右两边不知道先计算哪个
		*/
		*cursor_ptr = *(cursor_ptr+1);
	l_ptr->length--;
}
void listTraverse(SqList list, void (*visit)(ElemType e)){
	ElemType *e_ptr;
	for(e_ptr = list.e_ptr; e_ptr<list.e_ptr+list.length; e_ptr++){
		(*visit)(*e_ptr);
	}
	if(!list.length)
		printf("There is 0 element in the SqList!");
	printf("\n");
}

void error(char *name, char *msg){
	printf("-----Errors occured in \"%s\"!-----\n", name);
	printf("  %s!\n",msg);
	printf("\n");
}
int resize(SqList *l_ptr){
	l_ptr->e_ptr = (ElemType *)realloc(l_ptr->e_ptr, (l_ptr->listsize + LISTINCREMENT)*sizeof(ElemType));
	l_ptr->listsize += LISTINCREMENT;
	if(!l_ptr->e_ptr){
		l_ptr->listsize-=LISTINCREMENT;
		error("resize", "Realloc failed");
		return 0;
	}
	return 1;
}


test.c
#include "SqList.h"
#include <stdio.h>

void visit(ElemType e);
int compare(ElemType e1, ElemType e2);

int main(){
	SqList *list = initList();
	int i;
	printf("链表是否为空,%d\n", listEmpty(*list));
	for(i = 0 ; i < 10; i++){
		listInsertLast(list, i+1);
	}
	printf("链表长度 %d \n", listLength(*list));
	listTraverse(*list, visit);

	listInsert(list, 5, 50);
	listTraverse(*list, visit);
	
	getElem(*list, 5, &i);
	printf("getElem5: %d\n",i);

	priorElem(*list, 50, &i,compare);
	printf("priorElem50: %d\n",i);

	nextElem(*list, 50, &i, compare);
	printf("nextElem50: %d\n",i);

	listDelete(list, 5, &i);
	listTraverse(*list, visit);

	printf("%d\n", i);
	getElem(*list, 15, &i);
	printf("%d\n", i);

	clearList(list);
	listTraverse(*list, visit);

	destroyList(list);
	list = 0;
}

void visit(ElemType e){
	printf("%4d", e);
}
int compare(ElemType e1, ElemType e2){
	return e1==e2?1:0;
}
分享到:
评论

相关推荐

    数据结构---顺序线性表(SqList C++)

    顺序线性表(Sequential List,简称 SqList)是一种常见的数据结构,它按照元素的顺序存储数据,通常在内存中连续分配空间。在本项目中,我们使用 C++ 实现了一个基于顺序线性表的数据结构,并且支持从文本文件读取...

    数据结构实验报告1-线性表-两个有序表的归并-实验内容及要求.docx

    3. **归并两个有序线性表**:接下来,需要实现两个有序线性表的归并操作,即将两个有序线性表合并成一个新的有序线性表。 4. **输出归并后的有序线性表**:最后,程序需要输出归并后的有序线性表。 #### 存储结构的...

    线性表-数据结构与算法(C语言版) 定义线性表节点的结构.pdf

    线性表-数据结构与算法(C语言版)定义线性表节点的结构 线性表是一种基本的数据结构,它是由n个同类型数据元素的有限序列组成的,记为L=(a1,a2,…,an),其中i为数据元素ai在线性表中的位序,n为线性表的表长,n=0...

    数据结构线性表-顺序表(c++、java).pdf

    在线性表中,元素之间存在一对一的逻辑关系,而顺序表则是将这些逻辑上相邻的元素在内存中也保持相邻,通常通过数组实现。顺序表有静态分配和动态分配两种实现方式。 静态分配的顺序表使用一个预先分配好的定长数组...

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

    线性表是计算机科学中一种基础的数据结构,它是由n(n≥0)个相同类型元素构成的有限序列。在顺序存储结构中,线性表的元素被存储在一个一维数组中,按照它们在表中的相对位置来表示数据之间的逻辑关系。这种方式...

    实验一-线性表操作-实验报告.doc

    - **结构体**:定义了一个名为SqList的结构体,包含元素指针、长度和存储容量三个成员,表示顺序表的状态。 - **内存管理**:使用malloc和realloc进行动态内存分配和释放,确保了存储空间的灵活性。 - **函数设计...

    数据结构-- 线性表

    ADT(abstract data type)抽象数据类型 第一章: 线性表 线性表(linear list)是最基本、最简单、也是最常用的一种数据结构 线性表中数据元素之间的关系是一...SqList.h---线性顺序表. LinkList.h---线性单向链表.

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

    ### 线性表的应用(数据结构-线性表) #### 实验目的 通过本实验,学生将能够深入了解线性表的基本结构与操作方法,并掌握如何利用这些基本知识来解决实际问题。具体而言,学生应能够: - 理解线性表的基本概念...

    线性表实现插入删除数据

    线性表`sqlist`结构体包含三个成员:指向整型数组的指针`data`,表示当前线性表的长度`length`,以及表示线性表最大容量的`max`。初始化函数`Initlist`负责分配内存并设置线性表的初始状态,其中`maxsize`定义了...

    数据结构--线性表操作(C源代码)

    在这个项目中,我们看到的`SqList.cpp`文件很可能实现了顺序存储的线性表。 2. **C语言**: C语言是一种通用的、面向过程的编程语言,因其简洁和高效而被广泛用于系统编程和底层开发,包括数据结构的实现。`SqList....

    数据结构线性表快速排序

    ### 数据结构线性表快速排序知识点解析 #### 一、数据结构基础概念 - **数据结构**:数据结构是计算机科学中的一个核心概念,它主要研究数据的逻辑结构与存储结构,以及基于这些结构的数据操作方法。良好的数据...

    2.2Sqlist.cpp

    数据结构C语言实例动态线性表Sqlist,使用C/C++实现清华严蔚敏书中的例子的实例,动态线性表的初始化和增加功能。

    数据结构与算法分析--线性表实现

    首先,我们来看"SqList.java"文件,这通常代表顺序表(Sequential List)的实现。顺序表是线性表的一种静态存储方式,它将所有元素存储在一个连续的内存空间里。这种实现方式的优点是访问速度快,因为元素可以通过...

    顺序线性表实现代码

    在给定的代码片段中,顺序线性表通过结构体`SqList`定义。其中包含两个成员:`a[MAXSIZE]`用于存储线性表中的元素,`length`表示当前线性表中实际的元素个数。这里`MAXSIZE`定义了线性表的最大容量为100个元素。 ``...

    数据结构实验报告-线性表顺序存储结构的操作及其应用

    - **`Sort_Sq(SqList&L)`**:此函数实现了对线性表`L`的排序操作。具体采用的是插入排序算法,通过不断地将未排序的元素插入到已排序的部分来达到整个线性表的排序效果。 - **`InsertRear_Sq(SqList&L,constElemType...

    数据结构实验代码-线性表的加入与删除(类模板)

    通过上述实现,我们可以看到类模板 `Sqlist` 提供了基本的线性表操作功能,包括初始化、插入、删除和查找等。这些操作都是线性表中最基础也是最常用的操作之一。通过类模板的方式实现了数据类型的泛化处理,提高了...

    两个非递减存储顺序线性表归并为非递减顺序线性表

    在本文中,我们使用模板类 SqList 来实现线性表,构造函数的实现如下: ```cpp template SqList&lt;ElemType&gt;::SqList(int m) { len = 0; if (m == 0) elem = NULL; else elem = new ElemType[m]; size = m; } `...

    线性表的建立、插入和删除

    ### 数据结构之线性表的建立、插入与删除 #### 一、背景介绍 线性表是计算机科学中最基础的数据结构之一,它是由相同类型的若干数据元素构成的序列。线性表中的每个元素都有唯一的前驱和后继,除了第一个元素没有...

    数组实现线性表 数据结构

    根据提供的代码示例,我们定义了一个名为`Sqlist`的结构体来表示线性表: ```c typedef struct { Elemtype *elem; // 存储元素的指针 int length; // 当前列表中元素的数量 int listsize; // 分配的数组大小 } ...

    数据结构C语言版线性表算法2.4-数据结构c语言版严蔚敏顺序线性表12个基本操作及算法的实现... 定义线性表节点的结构.pdf

    在这个例子中,`SqList`是一个结构体类型,包含三个成员变量: 1. `ElemType *elem`:指向存储线性表元素的数组的指针,`ElemType`代表元素的类型。 2. `int length`:记录线性表当前的长度,即元素个数。 3. `int ...

Global site tag (gtag.js) - Google Analytics