线性表依据存储方式分为顺序表和链表(链表包括单链表、双链表、循环链表),依据操作限制分为栈、队列。
顺序表,即是数据在内存中占据连续的内存单元,方便访问成员,但是删除和插入操作不便。
定义数据
#define LIST_INIT_SIZE 5
#define LIST_INCREMENT 5
typedef int SeqType; //存储单元类型
typedef struct{
SeqType *elem; //存储空间基地址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;
初始化顺序表
/**
* 初始化顺序表,分配LIST_INIT_SIZE*int大小的内存空间
* 初始化实际长度和当前分配长度
*/
int initList_sq(SqList *L) {
L->elem = (SeqType *) malloc(sizeof(SeqType) * LIST_INIT_SIZE);
if (!L->elem)
return 0; //内存分配失败,存储空间不够
L->length = 0; //表示顺序表为空
L->listsize = LIST_INIT_SIZE; //表示顺序表里,最大存储单元个数
return 1;
}
插入操作
/**
* 插入顺序表
* 下标是负数就插入到结尾,下标大于实际长度则默认追加到末尾,长度不够则添加内存
* 第一个形参为结构体指针,第二个为插入元素位置,第三个为插入的值
*/
int insertList_sq(SqList *L,int index,SeqType val) {
if (L->length == L->listsize) { //顺序表的存储单元已经存满
printf("顺序表的存储单元已满,继续分配新的存储单元。\n");
SeqType* newBase = (SeqType*) realloc(L->elem,(L->listsize + LIST_INCREMENT) * sizeof(SeqType)); //继续分配存储单元
if (!newBase) {
printf("分配内存单元失败。\n");
return 0;
}
L->elem = newBase;
L->listsize += LIST_INCREMENT;
}
if (index < 0) //下标是负数,插入到结尾
index = L->length;
if (index > L->length) { //存储的下表超出顺序表实际的长度
printf("插入的下标超出顺序表的实际长度,默认插入到表尾。\n");
index = L->length;
}
//寻找合适的插入位置,index后面的元素向后移动
int i = L->length;
for (i;i>index;i--) {
L->elem[i] = L->elem[i - 1]; //向后移动
}
L->elem[index] = val; //插入元素
L->length++;
return 1;
}
删除操作
/**
* 输入参数为要删除的元素值,只删除第一个出现的值
*/
int removeList_sq(SqList *L, SeqType val) {
int index = -1; //记录匹配到的下标
int i,tmp;
for (i = 0; i < L->length; i++) {
if (L->elem[i] == val) {
//找到匹配的val,结束循环
index = i;
tmp = i;
break;
}
}
if (index < 0){
//printf("未找到该元素。\n");
return -1;
}
for (; tmp < L->length - 1; tmp++) {
L->elem[tmp] = L->elem[tmp + 1];
}
L->length--;
return index+1;
}
查找操作
/**
* 输入参数为要查找的元素值,只返回第一个出现的值在顺序表中的下标值
* 若返回值为-1则表示未找到
*/
int findList_sq(SqList *L, SeqType val) {
int i;
for (i = 0; i < L->length; i++) {
if (L->elem[i] == val) {
return i;
}
}
return -1;
}
销毁操作
/**
* 销毁顺序表
*/
void destoryList_sq(SqList *L) {
free(L->elem); //释放存储空间
L->length = 0;
L->listsize = 0;
}
打印顺序表
//打印顺序表
void display_sq(SqList *L){
int i;
for(i=0;i<L->length;i++)
printf("[%d]:%d ",i,L->elem[i]);
printf("\n");
}
附:开篇处下载链接需要3金币,如果实在需要又没有可以给我发邮件免费获取。实际上面的分步操作已经很完整了。