线性顺序表

数据结构—P2线性顺序表

在这里插入图片描述

简介

在这里插入图片描述

线性表

概念

线性结构中的数据元素之间是一对一的关系,线性表List)表示零个或多个数据元素的有限序列

若将线性表记为(data(1)…data(n)),则表中的data(i-1)领先于data(i),称data(i-1)是data(i)的前驱元素,data(i)是data(i-1)的后继元素

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

在这里插入图片描述


描述

线性表L可用二元组形式描述

L=(D,R)

D表示数据元素的集合

D={ai|i=0,1,2,…n}

R表示关系集合

R={<ai,ai+1>|0<=i<=n-2}

特征

1.对非空表,表头无前驱
2.对非空表,表尾无后继
3.其他的每个元素都有一个直接前驱和一个直接后继

顺序表

概念

顺序存储结构是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系存储关系是一致的

即表中的各元素依次存储在一片连续的存储空间中


特征

优点

1.逻辑上相连的元素其存储位置也是相邻的
2.对数据元素的存取为随机存取或按地址存取
3.存储密度高

缺点

1.对表的插入和删除等运算的时间复杂度较差

实现

在这里插入图片描述

结构体创建

在开始线性顺序表实现之前,先来构思一下表应该用什么方式来实现呢?

在此之前,先来构建整个文件的结构

创建之前

这里需要sqlist.csqlist.h作为表实现的主体test.c作为测试程序Makefile文件实现整体编译

在这里插入图片描述

然后进入到sqlist.h编写基本的结构

在这里插入图片描述

然后是sqlist.c

在这里插入图片描述

最后是test.c

在这里插入图片描述

创建结构体

在sqlist.h下创建线性顺序表结构体

在这里插入图片描述

#ifndef __SQLIST_H__
#define __SQLIST_H__
#include <stdio.h>

//定义int类型的数据的别名为data_t
typedef int data_t;

//定义线性顺序表结构体,并创建结构体和结构体指针别名为sqlist和*sqlink
#define N 1024//创建常量N,为表长度
typedef struct{
	data_t data[N];//表数据组
	int last;//表尾数据下标,表数据长度=last+1
}sqlist,*sqlink;



#endif

表的创建与销毁

创建完结构体之后,就需要创建表格销毁表格的函数了

首先在sqlist.h定义这两个函数

在这里插入图片描述

然后在sqlist.c实现这两个函数

在这里插入图片描述

创建表函数

//创建表函数
sqlink sqlist_create(){

	//创建表并申请内存空间
	sqlink L;
	L = (sqlink)malloc(sizeof(sqlist));
	if(L == NULL){
		printf("list malloc failed\n");
		return L;
	}

	//初始化表
	memset(L,0,sizeof(sqlist));
	L->last = -1;

	//返回表
		return L;
}

释放表函数

//释放表函数
int sqlist_free(sqlink L){
	
	//判断表是否创建
	if(L == NULL){
		return -1;
	}

	//释放表
	free(L);
	L = NULL;

	return 0;
}

基础插入与状态属性

创建完表之后,接下来就需要在表中插入数据

这里先来讲讲最简单的表尾插入

同样的在sqlist.h里进行定义

在这里插入图片描述

sqlist.c实现功能

在这里插入图片描述

//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
	int i;//判断表是否为满
	if(L->last == N-1){
		printf("list is  full\n");
		return -1;
	}


	//将数据插入表尾
	L->data[L->last+1] = value;
	L->last++;
		
	return 0;
}

好的表尾插入实现了,但是这里对于是否为满和长度的这些基本信息会在后面的其他函数中经常引用,这里给这些经常用的内容做一个封装

建立状态属性函数

sqlist.h定义函数

在这里插入图片描述

sqlist.c实现功能

在这里插入图片描述

判断表是否为空函数

//判断表是否为空(输入为表指针,输出为1时为空,为0时不空)
int sqlist_isempty(sqlink L){
	if(L->last == -1){
		return 1;
	}else{
		return 0;
	}
}

判断表是否为满函数

//判断表是否为满(输入为表指针,输出为1时为满,为0时不满)
int sqlist_isfull(sqlink L){
	if(L->last == N-1){
		return 1;
	}else{
		return 0;
	}
}

获取表长度函数

//表长度(输入为表指针,表为空时输出-1,表不为空时输出长度)
int sqlist_length(sqlink L){
	if(sqlist_isempty(L)){
		return -1;
	}else{
		return (L->last+1);
	}
}

判断是否在范围内函数

//判断是否在范围内(输入为表指针,表不在范围内输出1,在范围内输出为0)
int sqlist_inlist(sqlink L,int pos){
	if(pos <  0 || pos > L->last+1){
		return 1;
	}else{
		return 0;
	}
}

然后就可以对之前的表尾插入函数做出一定的修改

在这里插入图片描述

//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
	int i;//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}
	//数据插入表尾
	if(sqlist_isempty(L)){
		L->data[0] = value;
	}else{
		L->data[sqlist_length(L)] = value;
	}
	L->last++;
		
	return 0;
}

测试程序与Makefile

做完这些,需要先来测试一下程序的可行性

编写测试程序test.c

在这里插入图片描述

#include <stdio.h>
#include "sqlist.h"

int main(int argc, const char *argv[])
{
	//创建表
	sqlink L;
	L =sqlist_create();
	//插入内容
	sqlist_downinsert(L,2);
	//释放表
	sqlist_free(L);

	return 0;
}

然后呢,编写Makefile

在这里插入图片描述

test:test.o sqlist.o
	gcc -o test test.o sqlist.o
test.o:test.c sqlist.h
	gcc -c test.c
sqlist.o:sqlist.c sqlist.h
	gcc -c sqlist.c
.PHONY:clean
clean:
	rm *.o

好的,万事具备,只差测试

在这里插入图片描述

好的编译成功了,但是没有任何效果,所以接下来就要将如何把表的内容显示出来

但是在讲这个之前先来个知识点
使用vs指令,可以在vim里进行多窗口编辑

在这里插入图片描述

在这里插入图片描述

内容显示与更多插入

内容显示

在这里插入图片描述

在这里插入图片描述

//显示表所有内容
int sqlist_show(sqlink L){
	int i;
	//判断表是否被创建
	if(L == NULL){
		return -1;
	}
	printf("sqlist:\n");
	//判断表是否为空
	if(sqlist_isempty(L)){
		printf("list is empty\n");
	}
	//打印表数据
	for(i = 0;i < sqlist_length(L);i++){
		printf("%d  ",L->data[i]);
	}
	printf("\n");

	return 0;
}

好的写好了显示内容的函数,就先来测测效果吧

当然在此之前先修改一下test.c

在这里插入图片描述

#include <stdio.h>
#include "sqlist.h"

int main(int argc, const char *argv[])
{
	//创建表
	sqlink L;
	L =sqlist_create();

	//插入内容
	sqlist_downinsert(L,3);
	sqlist_downinsert(L,1);
	sqlist_downinsert(L,0);

	//显示内容
	sqlist_show(L);
	
	//释放表
	sqlist_free(L);

	return 0;
}

测试程序

在这里插入图片描述

我们看到了显示的效果

除了在表尾插入内容外,是不是还可以在表头插入内容呢?

或者指定一个位置插入内容,如果想一次插入多个内容又该怎么办呢?

接下将会一一实现这些功能

表头插入

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//在表头插入数据函数
int sqlist_topinsert(sqlink L,data_t value){
	int i;
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	//将表数据后移
	for(i = L->last;i >= 0;i--){
		L->data[i+1] = L->data[i];
	}

	//将数据插入表头
	L->data[0] = value;
	L->last++;

	return 0;
}


优化测试程序

编写test.c

在这里插入图片描述

#include <stdio.h>
#include "sqlist.h"

int insert_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//表尾插入内容
	sqlist_downinsert(L,3);
	sqlist_downinsert(L,1);
	sqlist_downinsert(L,0);

	//显示内容
	sqlist_show(L);

	//表头插入内容
	sqlist_topinsert(L,5);
	sqlist_topinsert(L,7);

	//显示内容
	sqlist_show(L);
	
	//释放表
	sqlist_free(L);
	
}

int main(int argc, const char *argv[])
{
	
	insert_test();
	return 0;
}

测试程序

在这里插入图片描述


指定位置插入

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//指定位置插入数据函数
int sqlist_insert(sqlink L,data_t value,int pos){
	int i;
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	if(sqlist_inlist(L,pos)){
		printf("pos is invalid\n");
		return -1;
	}

	//将表数据后移
	for(i = L->last;i >= pos;i--){
		L->data[i+1] = L->data[i];
	}

	//将数据插入指定位置
	L->data[pos] = value;
	L->last++;

	return 0;
	
}

编写test.c

在这里插入图片描述

int insert_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//表尾插入内容
	sqlist_downinsert(L,3);
	sqlist_downinsert(L,1);
	sqlist_downinsert(L,0);

	//显示内容
	sqlist_show(L);

	//表头插入内容
	sqlist_topinsert(L,5);
	sqlist_topinsert(L,7);

	//显示内容
	sqlist_show(L);

	//在指定位置插入内容
	sqlist_insert(L,6,1);
	sqlist_insert(L,4,3);

	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);
	
}

测试程序

在这里插入图片描述

指定位置插入一组数据

这里做一个小小的扩展,指定位置插入一组数据,方便后的讲解

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//在指定位置插入一组数据
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos){
	int i;
	for(i = 0;i < n;i++){
		sqlist_insert(L,array[i],pos+i);
	}	
}

编写test.c

在这里插入图片描述

int insert_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//表尾插入内容
	sqlist_downinsert(L,3);
	sqlist_downinsert(L,1);
	sqlist_downinsert(L,0);

	//显示内容
	sqlist_show(L);

	//表头插入内容
	sqlist_topinsert(L,5);
	sqlist_topinsert(L,7);

	//显示内容
	sqlist_show(L);

	//在指定位置插入内容
	sqlist_insert(L,6,1);
	sqlist_insert(L,4,3);

	//显示内容
	sqlist_show(L);

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,6);
	sqlist_show(L);

	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);
	
}

测试程序

在这里插入图片描述

优化

在这里插入图片描述

删除相关

好的,线性顺序表已经初具成形了,接下来如果需要删除不要的内容,就需要用到删除操作

清空表

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//清空表
int sqlist_clear(sqlink L){
	if(L == NULL){
		return -1;
	}
	memset(L,0,sizeof(sqlist));
	L->last = -1;

	return 0;
}

编写test.c

在这里插入图片描述

//删除测试程序
int delete_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	
	//显示内容
	sqlist_show(L);

	sqlist_clear(L);

	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);
}

int main(int argc, const char *argv[])
{
	int chn,n = 1;
	while(n){
		printf("选择测试程序\n");
		printf("0.退出1.插入操作2.删除操作:");
		scanf("%d",&chn);
		switch(chn){
			case 0:n = 0;break;
			case 1:insert_test();break;
			case 2:delete_test();break;
			default:printf("不在输入范围内请重新输入!\n");
		}
	}
	
	return 0;
}

测试程序

在这里插入图片描述

删除指定位置的内容

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//删除指定位置的内容
int sqlist_posdelete(sqlink L,int pos){
	int i;
	if(sqlist_isempty(L)){
		printf("list is empty\n");
		return -1;
	}
	if(sqlist_inlist(L,pos)){
		printf("delete pos is invalid\n");
		return -1;
	}
	for(i = pos+1; i < sqlist_length(L);i++){
		L->data[i-1] = L->data[i];
	}

	L->last--;
	return 0;
}

编写test.c

在这里插入图片描述

在这里插入图片描述

//删除测试程序
int delete_test(int c){
	//创建表
	sqlink L;
	L =sqlist_create();

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	
	//显示内容
	sqlist_show(L);
	if(c == 1){
		sqlist_clear(L);
	}else if(c == 2){
		sqlist_posdelete(L,2);
	}else if(c == 3){
		
	}

	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);
}

int main(int argc, const char *argv[])
{
	int chn,c1,n = 1;
	while(n){
		printf("选择测试程序\n");
		printf("0.退出1.插入操作2.删除操作:");
		scanf("%d",&chn);
		switch(chn){
			case 0:n = 0;break;
			case 1:insert_test();break;
			case 2:
			printf("选择类型(0.返回1.清空表2.定位删除3.内容删除):");
			scanf("%d",&c1);
			switch(c1){
				case 0:break;
				case 1:delete_test(1);break;
				case 2:delete_test(2);break;
				case 3:delete_test(3);break;
			}
			break;
			default:printf("不在输入范围内请重新输入!\n");
		}
	}
	
	return 0;
}

测试程序

在这里插入图片描述


删除指定内容

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//删除指定内容
int sqlist_valuedelete(sqlink L,data_t value){
	int pos,i;
	for(i = 0;i <= L->last;i++){
		if(L->data[i] == value){
			pos = i;
		}
	}
	sqlist_posdelete(L,pos);
	return 0;
}

编写test.c

在这里插入图片描述

测试程序

在这里插入图片描述

查找相关

指定位置查找内容

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//查找指定位置的内容
data_t sqlist_poslocate(sqlink L,int pos){
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	if(sqlist_inlist(L,pos)){
		printf("pos is invalid\n");
		return -1;
	}

	return (L->data[pos]);
}

编写test.c

在这里插入图片描述

int locate_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	
	//显示内容
	sqlist_show(L);
	
	printf("%d\n",sqlist_poslocate(L,2));



	//释放表
	sqlist_free(L);
}

测试程序

在这里插入图片描述

指定内容查找位置

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//查找指定内容的位置
int sqlist_valuelocate(sqlink L,data_t value){
	int i;
	for(i = 0;i <= L->last;i++){
		if(L->data[i] == value){
			return i;
		}
	}

	return -1;
}

编写test.c

在这里插入图片描述

测试程序

在这里插入图片描述

修改相关

修改指定位置内容

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//修改指定位置内容
int sqlist_posmodify(sqlink L,int pos,data_t value){
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	if(sqlist_inlist(L,pos)){
		printf("pos is invalid\n");
		return -1;
	}

	L->data[pos] = value;
	return 0;
}

编写test.c

在这里插入图片描述

int modify_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	
	//显示内容
	sqlist_show(L);
	
	sqlist_posmodify(L,2,20);
	
	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);

}

测试程序

在这里插入图片描述


修改指定内容的指定内容

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//修改指定内容为指定内容
int sqlist_valuemodify(sqlink L,data_t rvalue,data_t value){
	int pos;
	pos = sqlist_valuelocate(L,rvalue);
	sqlist_posmodify(L,pos,value);
}

编写test.c

在这里插入图片描述

测试程序

在这里插入图片描述

整体优化

插入优化

对于插入其实在表尾表头插入都是指定位置插入的特殊情况,因此可以简化代码量

编写sqlist.c

在这里插入图片描述

/*-----------------------------------插入操作--------------------------------*/

//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
	sqlist_insert(L,value,L->last+1);	
}

//在表头插入数据函数
int sqlist_topinsert(sqlink L,data_t value){
	sqlist_insert(L,value,0);
}
//指定位置插入数据函数
int sqlist_insert(sqlink L,data_t value,int pos){
	int i;
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	if(sqlist_inlist(L,pos)){
		printf("pos is invalid\n");
		return -1;
	}

	//将表数据后移
	for(i = L->last;i >= pos;i--){
		L->data[i+1] = L->data[i];
	}

	//将数据插入指定位置
	L->data[pos] = value;
	L->last++;

	return 0;
	
}

//在指定位置插入一组数据
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos){
	int i;
	for(i = 0;i < n;i++){
		sqlist_insert(L,array[i],pos+i);
	}	
}

测试程序

在这里插入图片描述


删除优化

编写sqlist.c

在这里插入图片描述

测试程序

在这里插入图片描述

扩展

表合并

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//表合并
int sqlist_merge(sqlink L1,sqlink L2){
	int i = 0;
	int ret;

	while(i <= L2->last){
		ret = sqlist_valuelocate(L1,L2->data[i]);
		if(ret == -1){
			if(sqlist_downinsert(L1,L2->data[i]) == -1){
				return -1;
			}
		}
		i++;
	}
	return 0;
}

编写test.c

在这里插入图片描述

int merge_test(){
	//创建表
	sqlink La,Lb;
	La = sqlist_create();
	Lb = sqlist_create();

	int a[]={11,12,13,14,15};
	int b[]={11,16,12,17,14,18};

	int n1 = sizeof(a)/sizeof(int);
	int n2 = sizeof(b)/sizeof(int);

	sqlist_arrayinsert(La,a,n1,0);
	sqlist_arrayinsert(Lb,b,n2,0);
	sqlist_show(La);
	sqlist_show(Lb);

	sqlist_merge(La,Lb);
	sqlist_show(La);
	sqlist_show(Lb);

	sqlist_free(La);
	sqlist_free(Lb);

}

测试程序

在这里插入图片描述

表去重

编写sqlist.h

在这里插入图片描述

编写sqlist.c

在这里插入图片描述

//表去重
int sqlist_purge(sqlink L){
	int i,j;

	if(L->last == 0){
		return 0;
	}

	i = 1;
	while(i <= L->last){
		j = i-1;
		while(j >= 0){
			if(L->data[i] == L->data[j]){
				sqlist_posdelete(L,i);
				break;
			}else{
				j--;
			}
		}

		if(j < 0){
			i++;
		}
	}

	return 0;
}

编写test.c

在这里插入图片描述

int purge_test(){
	//创建表
	sqlink L;
	L = sqlist_create();

	int a[]={11,12,13,15,14,15,16,12,11};
	int n =sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	sqlist_show(L);
	
	sqlist_purge(L);
	sqlist_show(L);

	sqlist_free(L);
}

测试程序

在这里插入图片描述

整体代码

实现的功能总结

在这里插入图片描述

sqlist.h

#ifndef __SQLIST_H__
#define __SQLIST_H__
#include <stdio.h>

//定义int类型的数据的别名为data_t
typedef int data_t;

//定义线性顺序表结构体,并创建结构体和结构体指针别名为sqlist和*sqlink
#define N 1024//创建常量N,为表长度
typedef struct{
	data_t data[N];//表数据组
	int last;//表尾数据下标,表数据长度=last+1
}sqlist,*sqlink;

//创建与删除
sqlink sqlist_create();//创建表
int sqlist_free(sqlink L);//释放表
int	sqlist_clear(sqlink L);//清空表
int sqlist_posdelete(sqlink L,int pos);//删除指定位置的内容
int sqlist_valuedelete(sqlink L,data_t value);//删除指定内容

//状态属性
int sqlist_isempty(sqlink L);//判断表是否为空
int sqlist_isfull(sqlink L);//判断表是否为满
int sqlist_length(sqlink L);//表长度
int sqlist_inlist(sqlink L,int pos);//判断是否在范围内

//查找操作
int sqlist_show(sqlink L);//显示表所有内容
data_t sqlist_poslocate(sqlink L,int pos);//查找指定位置的内容
int sqlist_valuelocate(sqlink L,data_t value);//查找指定内容的位置

//插入操作
int sqlist_downinsert(sqlink L,data_t value);//在表尾插入内
int sqlist_topinsert(sqlink L,data_t value);//在表头插入内容
int sqlist_insert(sqlink L,data_t value,int pos);//在指定位置插入内容
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos);//在指定位置插入一组数据

//修改操作
int sqlist_posmodify(sqlink L,int pos,data_t value);//修改指定位置的内容
int sqlist_valuemodify(sqlink L,data_t rvalue,data_t value);//修改指定内容都为指定内容

//扩展操作
int sqlist_merge(sqlink L1,sqlink L2);//合并表
int sqlist_purge(sqlink L);//表去重

#endif

sqlist.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlist.h"

/*-----------------------------------创建与删除--------------------------------*/

//创建表函数
sqlink sqlist_create(){

	//创建表并申请内存空间
	sqlink L;
	L = (sqlink)malloc(sizeof(sqlist));
	if(L == NULL){
		printf("list malloc failed\n");
		return L;
	}

	//初始化表
	memset(L,0,sizeof(sqlist));
	L->last = -1;

	//返回表
		return L;
}

//释放表函数
int sqlist_free(sqlink L){
	
	//判断表是否创建
	if(L == NULL){
		return -1;
	}

	//释放表
	free(L);
	L = NULL;

	return 0;
}

//清空表
int sqlist_clear(sqlink L){
	if(L == NULL){
		return -1;
	}
	memset(L,0,sizeof(sqlist));
	L->last = -1;

	return 0;
}

//删除指定位置的内容
int sqlist_posdelete(sqlink L,int pos){
	int i;
	if(sqlist_isempty(L)){
		printf("list is empty\n");
		return -1;
	}
	if(sqlist_inlist(L,pos)){
		printf("delete pos is invalid\n");
		return -1;
	}
	for(i = pos+1; i < sqlist_length(L);i++){
		L->data[i-1] = L->data[i];
	}
	L->last--;
	return 0;
}

//删除指定内容
int sqlist_valuedelete(sqlink L,data_t value){
	int pos;
	pos = sqlist_valuelocate(L,value);
	sqlist_posdelete(L,pos);
	return 0;
}



/*-----------------------------------状态属性--------------------------------*/


//判断表是否为空(输入为表指针,输出为1时为空,为0时不空)
int sqlist_isempty(sqlink L){
	if(L->last == -1){
		return 1;
	}else{
		return 0;
	}
}

//判断表是否为满(输入为表指针,输出为1时为满,为0时不满)
int sqlist_isfull(sqlink L){
	if(L->last == N-1){
		return 1;
	}else{
		return 0;
	}
}

//表长度(输入为表指针,表为空时输出-1,表不为空时输出长度)
int sqlist_length(sqlink L){
	if(sqlist_isempty(L)){
		return -1;
	}else{
		return (L->last+1);
	}
}

//判断是否在范围内(输入为表指针,表不在范围内输出1,在范围内输出为0)
int sqlist_inlist(sqlink L,int pos){
	if(pos <  0 || pos > L->last+1){
		return 1;
	}else{
		return 0;
	}
}
/*-----------------------------------查找操作--------------------------------*/

//显示表所有内容
int sqlist_show(sqlink L){
	int i;
	//判断表是否被创建
	if(L == NULL){
		return -1;
	}
	printf("sqlist:\n");
	//判断表是否为空
	if(sqlist_isempty(L)){
		printf("list is empty\n");
	}
	//打印表数据
	for(i = 0;i < sqlist_length(L);i++){
		printf("%d  ",L->data[i]);
	}
	printf("\n");

	return 0;
}

//查找指定位置的内容
data_t sqlist_poslocate(sqlink L,int pos){
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	if(sqlist_inlist(L,pos)){
		printf("pos is invalid\n");
		return -1;
	}

	return (L->data[pos]);
}

//查找指定内容的位置
int sqlist_valuelocate(sqlink L,data_t value){
	int i;
	for(i = 0;i <= L->last;i++){
		if(L->data[i] == value){
			return i;
		}
	}

	return -1;
}


/*-----------------------------------插入操作--------------------------------*/

//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
	sqlist_insert(L,value,L->last+1);	
}

//在表头插入数据函数
int sqlist_topinsert(sqlink L,data_t value){
	sqlist_insert(L,value,0);
}
//指定位置插入数据函数
int sqlist_insert(sqlink L,data_t value,int pos){
	int i;
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	if(sqlist_inlist(L,pos)){
		printf("pos is invalid\n");
		return -1;
	}

	//将表数据后移
	for(i = L->last;i >= pos;i--){
		L->data[i+1] = L->data[i];
	}

	//将数据插入指定位置
	L->data[pos] = value;
	L->last++;

	return 0;
	
}

//在指定位置插入一组数据
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos){
	int i;
	for(i = 0;i < n;i++){
		sqlist_insert(L,array[i],pos+i);
	}	
}

/*-----------------------------------修改操作--------------------------------*/

//修改指定位置内容
int sqlist_posmodify(sqlink L,int pos,data_t value){
	//判断表是否为满
	if(sqlist_isfull(L)){
		printf("list is  full\n");
		return -1;
	}

	if(sqlist_inlist(L,pos)){
		printf("pos is invalid\n");
		return -1;
	}

	L->data[pos] = value;
	return 0;
}


//修改指定内容为指定内容
int sqlist_valuemodify(sqlink L,data_t rvalue,data_t value){
	int pos;
	pos = sqlist_valuelocate(L,rvalue);
	sqlist_posmodify(L,pos,value);
}


/*-----------------------------------扩展操作--------------------------------*/
//表合并
int sqlist_merge(sqlink L1,sqlink L2){
	int i = 0;
	int ret;

	while(i <= L2->last){
		ret = sqlist_valuelocate(L1,L2->data[i]);
		if(ret == -1){
			if(sqlist_downinsert(L1,L2->data[i]) == -1){
				return -1;
			}
		}
		i++;
	}
	return 0;
}

//表去重
int sqlist_purge(sqlink L){
	int i,j;

	if(L->last == 0){
		return 0;
	}

	i = 1;
	while(i <= L->last){
		j = i-1;
		while(j >= 0){
			if(L->data[i] == L->data[j]){
				sqlist_posdelete(L,i);
				break;
			}else{
				j--;
			}
		}

		if(j < 0){
			i++;
		}
	}

	return 0;
}

test.c

#include <stdio.h>
#include "sqlist.h"

//插入测试程序
int insert_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//表尾插入内容
	sqlist_downinsert(L,3);
	sqlist_downinsert(L,1);
	sqlist_downinsert(L,0);

	//显示内容
	sqlist_show(L);

	//表头插入内容
	sqlist_topinsert(L,5);
	sqlist_topinsert(L,7);

	//显示内容
	sqlist_show(L);

	//在指定位置插入内容
	sqlist_insert(L,6,1);
	sqlist_insert(L,4,3);

	//显示内容
	sqlist_show(L);

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,6);


	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);
	
}

//删除测试程序
int delete_test(int c){
	//创建表
	sqlink L;
	L =sqlist_create();

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	
	//显示内容
	sqlist_show(L);
	
	if(c == 1){
		sqlist_clear(L);
	}else if(c == 2){
		sqlist_posdelete(L,2);
	}else if(c == 3){
		sqlist_valuedelete(L,11);
	}

	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);
}

int locate_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	
	//显示内容
	sqlist_show(L);
	
	printf("%d\n",sqlist_poslocate(L,2));

	printf("%d\n",sqlist_valuelocate(L,12));

	//释放表
	sqlist_free(L);
}

int modify_test(){
	//创建表
	sqlink L;
	L =sqlist_create();

	//在指定位置插入一组数据
	int a[]={8,9,10,11,12};
	int n = sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	
	//显示内容
	sqlist_show(L);
	
	sqlist_posmodify(L,2,20);
	
	//显示内容
	sqlist_show(L);

	sqlist_valuemodify(L,11,21);

	//显示内容
	sqlist_show(L);

	//释放表
	sqlist_free(L);

}

int merge_test(){
	//创建表
	sqlink La,Lb;
	La = sqlist_create();
	Lb = sqlist_create();

	int a[]={11,12,13,14,15};
	int b[]={11,16,12,17,14,18};

	int n1 = sizeof(a)/sizeof(int);
	int n2 = sizeof(b)/sizeof(int);

	sqlist_arrayinsert(La,a,n1,0);
	sqlist_arrayinsert(Lb,b,n2,0);
	sqlist_show(La);
	sqlist_show(Lb);

	sqlist_merge(La,Lb);
	sqlist_show(La);
	sqlist_show(Lb);

	sqlist_free(La);
	sqlist_free(Lb);

}

int purge_test(){
	//创建表
	sqlink L;
	L = sqlist_create();

	int a[]={11,12,13,15,14,15,16,12,11};
	int n =sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	sqlist_show(L);
	
	sqlist_purge(L);
	sqlist_show(L);

	sqlist_free(L);
}

int main(int argc, const char *argv[])
{
	int chn,c1,n = 1;
	while(n){
		printf("选择测试程序\n");
		printf("0.退出1.插入操作2.删除操作3.查找操作4.修改操作5.表合并6.表去重:");
		scanf("%d",&chn);
		switch(chn){
			case 0:n = 0;break;
			case 1:insert_test();break;
			case 2:
			printf("选择类型(0.返回1.清空表2.定位删除3.内容删除):");
			scanf("%d",&c1);
			switch(c1){
				case 0:break;
				case 1:delete_test(1);break;
				case 2:delete_test(2);break;
				case 3:delete_test(3);break;
			}
			break;
			case 3:locate_test();break;
			case 4:modify_test();break;
			case 5:merge_test();break;
			case 6:purge_test();break;
			default:printf("不在输入范围内请重新输入!\n");
		}
	}
	
	return 0;
}

Makefile

test:test.o sqlist.o
	gcc -o test test.o sqlist.o
test.o:test.c sqlist.h
	gcc -c test.c
sqlist.o:sqlist.c sqlist.h
	gcc -c sqlist.c
.PHONY:clean
clean:
	rm *.o

更多内容

数据结构 P1简介与分类

数据结构 P2线性顺序表

数据结构 P3线性单链表

数据结构 P4 栈

数据结构 P5 队列

数据结构 P6 树和二叉树

数据结构 P7 基础查找

数据结构 P8 哈希表

数据结构 P9 基础排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CagePan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值