有了前面的章节的铺垫,那么我们努力的·方向就非常明确了,就是想尽一切的办法把我们的前面的代码进行实现和添加更多更为复杂的程序函数。
创建线性表,我们肯定需要内存空间的申请,至于申请多大的内存,这和我们的结构体的大小有关
当我们去申请内存了之后,我们知道我们得到了一个数组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;//释放内存
}