数据结构——第五节(顺序表的代码实现)

本文详细介绍了如何在C语言中创建线性表,包括内存申请、结构体初始化、last值的处理,以及使用malloc函数、memset函数进行操作。还探讨了线性表插入元素的过程,如判断表是否为空、插入位置合法性检查等。
摘要由CSDN通过智能技术生成

有了前面的章节的铺垫,那么我们努力的·方向就非常明确了,就是想尽一切的办法把我们的前面的代码进行实现和添加更多更为复杂的程序函数。

创建线性表,我们肯定需要内存空间的申请,至于申请多大的内存,这和我们的结构体的大小有关

当我们去申请内存了之后,我们知道我们得到了一个数组data[N]和last,并且我们应该知道如何对其进行初始化, 我们申请的内存空间当中是结构体,但是在结构体当中不止有数组data[N]还有last、所以我们申请的内存空间就是数组和last一起的内存空间

最后别忘了,我们要返回线性表的地址

第一步申请内存

第二部初始化

第三步返回初始的值

申请内存要使用malloc函数,将内存放在堆上、

malloc函数有几个特点,一个是需要头文件stdlib.h头文件,第二个是如果申请内存成功后返回的值为地址,如果失败就会返回NULL

在整个内存申请成功之后,我们只是申请了一个空的线性表,就是堆上的内存不会去做处理的,那么我申请的内存是不确定的,那么我们会存储一些默认值,一般会放0或者\0去占据内存

last代表的是最后一个元素的下标,最后一个有效元素的下标,last只要有值那么就代表了我的线性表里面就有内容。

对于last的值0到n-1的值都不可以用,所以一般是last=-1来说明线性表里面没有储值

数组的每一个元素我都要去清零的,就用memse函数来实现

memset函数功能的叙述如下

void *memset(void *s, int c,size_t n);就是从s开始的n个字节,我都用c去填充

一个函数当没有清晰的返回值的时候,我至少可以去判断他是否合法、

判断线性表是否是空表,就判断last是不是指向的是-1就可以了,要保持代码的逻辑一致性

关于线性表插入元素的操作讲解:

刚开始是空表的时候last = -1

insert(L,X,pos)这个函数的是对表L中的·pos位置插入x

第一步判断表是否还有空间去插入值

第二步是参数是否合法

第三步如果没有满,参数也合法那么pos属于 0 到 last+1

 第四步当在中间插入的时候就涉及了元素的整体的移动,一般是最后一个元素先移动,就是从后往前去一次移动

第五步存新值 last++

接下来我们就实现顺序表的几个基本的功能

test.c文件 用于测试线性表的功能

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


void test_insert();

int main(int argc, const char* argv)
{
	sqlink L;

	L = list_creat();
	if (L == NULL)
		return -1;

	list_insert(L, 10, 0);
	list_insert(L, 20, 0);
	list_insert(L, 30, 0);
	list_insert(L, 40, 0);
	list_insert(L, 50, 0);
	list_insert(L, 60, 0);/*10代表的是要插入的数据,0代表我要把他插入到表中0的那个位置,L代表
	操作的线性表*/

	list_show(L);
	list_insert(L,100,list_length(L));//这里就是将元素插入最后一个位置
	list_show(L);

	return 0;
}
//对测试功能进行了封装
void test_insert() {
	sqlink L;

	L = list_creat();
	if (L == NULL)
		return;

	list_insert(L, 10, 0);
	list_insert(L, 20, 0);
	list_insert(L, 30, 0);
	list_insert(L, 40, 0);
	list_insert(L, 50, 0);
	list_insert(L, 60, 0);/*10代表的是要插入的数据,0代表我要把他插入到表中0的那个位置,L代表
	操作的线性表*/

	list_show(L);
	list_insert(L, 100, list_length(L));//这里就是将元素插入最后一个位置
	list_show(L);

	return 0;

}

sqlist.h

#pragma once
typedef int data_t;
#define N 128

typedef struct {
	data_t data[N];
	int last;
}sqlist, * sqlink;//这就是创建的线性表·

sqlink list_creat();
int list_clear(sqlink L);
int list_empty(sqlink L);
int list_length(sqlink L);
int list_locate(sqlink L, data_t value);
int list_insert(sqlink L, data_t value, int position);
int list_show(sqlink L);//遍历函数
int list_delete(sqlink L);/*关于delete和clear区别就是clear是表在,
内容不在,而delete是连表都删除了*/

sqlist.c

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

sqlink list_creat() {
	//malloc
	sqlink L;//声明一个指针L,接收malloc的起始地址
	L = (sqlink)malloc(sizeof(sqlist));/*malloc函数有几个特点,需要头文件stdlib.h,
		这里涉及到了强制类型转换*/
		if (L == NULL) {
			printf("list malloc failed\n");
			return L;
	}

	//initialize
	memset(L, 0, sizeof(sqlist);//L代表的是结构体,结构体的指针指向的是L
	L ->last = -1;//注意这里的last和memset的位置是不可以进行调换的
	
	//return

	return L;

}
/*
* @ret 0-success -1-failed
*/
int list_clear(sqlink L){
	if (L = NULL)
		return -1;

	memset(L, 0, sizeof(sqlist));
	L->last = -1;//这里就是将线性表清空
}/*
 check:Is list empty?
 @ret 1 -- empty  0 -- not empty
 */
int list_empty(sqlink L){
	if (L->last == -1)
		return 1;
	else
		return 0;
}
int list_length(sqlink L){
	if (L == NULL)
		return -1;

	return(L->last + 1);

}
int list_locate(sqlink L, data_t value){
}
int list_insert(sqlink L, data_t value, int position){
	//full
	if (L->last == N - 1) {
		printf("list is full\n");
		return -1;
	}
	//check para  0<=pos<=Last+1 [0,last+1]
	if (pos < 0 || pos > L->last + 1) {
		printf("Pos is invaild\n");//插入的位置是非法的
		return -1;
	}
	//move
	for (i = L->last; i >= pos; i--) {
		L->data[i + 1] = L->data[i];
		}
	//updata last
	L->data[pos] = value;
	L->last++;

	return 0;
}
int list_show(sqlink L) {
	int i;

	if (L == NULL)
		return -1;
	if (L->last == -1)
		printf("list is empty\n");
	for (i = 0; i <= L->last; i++) {
		printf("%d", L->data[i]);
	}
	puts("");

	return 0;
}//遍历函数

int list_delete(sqlink L) {
	if (L == NULL)
		return -1;
	free(L);
	L = NULL;
	return 0;//释放内存
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值