数据结构-顺序表
顺序表概念
顺序表:
- 是可以动态增长的数组
- 顺序表的数据类型是抑一致的
- 数据是连续存储的(地址上连续)
两种顺序表定义及其区别
静态顺序表和动态顺序表。
静态顺序表的定义:
#define MAXSIZE 100
typedef int data_t;
typedef struct{
data_t data[MAXSIZE];
int last;
}seqlist_t;
动态顺序表的定义:
typedef struct {
int *data; //指示动态分配的指针
int MaxSize;//顺序表的最大容量
int length; //顺序表的当前长度
} SqList;
静态顺序表和动态顺序表的数据长度不同,前者的数据长度事先指定,后者可用malloc分配长度,常用的是动态顺序表。
动态顺序表和静态顺序表的操作基本一致。
静态顺序表的操作
seqlist_t *Creat_seqlist(void);//创建顺序表
void clear_seqlist(seqlist_t * L);//清空顺序表
int is_empty_seqlist(seqlist_t *L);//判断顺序表是否为空
int is_full_seqlist(seqlist_t *L);//判断顺序表是否满
void set_empty_seqlist(seqlist_t *L);//置空顺序表
int get_length_seqlist(seqlist_t *L);//得到顺序表的长度
void show_seqlist(seqlist_t *L);//显示顺序表
int insert_seqlist(seqlist_t *L, data_t x, int pos);//插入一个元素到顺序表
int delete_seqlist(seqlist_t *L, int pos);//删除一个顺序表的元素
int change_seqlist(seqlist_t *L, data_t x, int pos);//改变一个顺序表的元素
int search_seqlist(seqlist_t *L, data_t x);//查找一个顺序表的元素
静态态顺序表操作的实现
seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define MAXSIZE 100
typedef int data_t;
typedef struct{
data_t data[MAXSIZE];
int last;
}seqlist_t;
seqlist_t *Creat_seqlist(void);//创建顺序表
void clear_seqlist(seqlist_t * L);//清空顺序表
int is_empty_seqlist(seqlist_t *L);//判断顺序表是否为空
int is_full_seqlist(seqlist_t *L);//判断顺序表是否满
void set_empty_seqlist(seqlist_t *L);//置空顺序表
int get_length_seqlist(seqlist_t *L);//得到顺序表的长度
void show_seqlist(seqlist_t *L);//显示顺序表
int insert_seqlist(seqlist_t *L, data_t x, int pos);//插入一个元素到顺序表
int delete_seqlist(seqlist_t *L, int pos);//删除一个顺序表的元素
int change_seqlist(seqlist_t *L, data_t x, int pos);//改变一个顺序表的元素
int search_seqlist(seqlist_t *L, data_t x);//查找一个顺序表的元素
#endif
seqlist.c
#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
seqlist_t *Creat_seqlist(void)
{
seqlist_t *L=NULL;
L = (seqlist_t *)malloc(sizeof(seqlist_t));//malloc需要类型转换
if(L == NULL){
puts("no memory");
return NULL;
}
L->last = -1;//动态内存初始化
return L;
}
void clear_seqlist(seqlist_t * L)
{
if(L == NULL){
puts("seqlist_t is NULL");
return;
}
free(L);
return;
}
int is_empty_seqlist(seqlist_t *L)
{
if(L == NULL)
{
puts("seqlist_t *L is NULL");
return -1;
}
return (L->last == -1);
}
int is_full_seqlist(seqlist_t *L)
{
if(L == NULL){
puts("seqlist_t *L is NULL");
return -1;
}
return (L->last == MAXSIZE -1);
}
void set_empty_seqlist(seqlist_t *L)
{
if(L == NULL)
{
puts("seqlist_t *L is NULL");
return ;
}
L->last = -1;
return ;
}
int get_length_seqlist(seqlist_t *L)
{
if(L == NULL)
{
puts("seqlist_t *L is NULL");
return -1;
}
return (L->last+1);
}
void show_seqlist(seqlist_t *L)
{
int i = 0;
if(L == NULL){
puts("seqlist_t *L is NULL");
return;
}
for(i = 0 ;i <= L->last ;i++){
printf("L->data[%d] = %d\n", i, L->data[i]);
}
return;
}
int insert_seqlist(seqlist_t *L, data_t x, int pos)
{
int i = 0;
//处理非法情况
if(is_full_seqlist(L) || (pos < 0) || (pos > L->last+1)){
puts("input argv is invald");
return -1;
}
for(i = L->last ;i >= pos ; i--){
L->data[i+1] = L->data[i];
}
L->data[pos] = x;
L->last++;
return 0;//返回0成功,返回-1失败
}
int delete_seqlist(seqlist_t *L, int pos)
{
if((pos < 0) || (pos > L->last))
{
puts("intput pos is invalid");
return -1;
}
for(int i = pos; i < get_length_seqlist(L); i++)
{
L->data[i] = L->data[i+1];
}
L->last--;
return 0;
}
int change_seqlist(seqlist_t *L, data_t x, int pos)
{
if((pos < 0) || (pos > L->last))
{
puts("intput pos is invalid");
return -1;
}
L->data[pos] = x;
return 0;
}
int search_seqlist(seqlist_t *L, data_t x)
{
for(int i = 0; i < L->last; i++)
{
if(L->data[i] == x)
return i;
}
return -1;
}
test.c
#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
int main()
{
int i = 0;
seqlist_t *L = NULL;
L = Creat_seqlist();
for(i = 0 ; i <= 4 ; i++){
insert_seqlist(L , i, 0);
}
printf("seqlist L length is %d\n", get_length_seqlist(L));
show_seqlist(L);
printf("===============================================");
puts("search data = 3");
printf("data = 3 pos is %d\n", search_seqlist(L, 3));
printf("seqlist L length is %d\n", get_length_seqlist(L));
show_seqlist(L);
printf("===============================================");
puts("delete data = 3\n");
delete_seqlist(L, search_seqlist(L, 3));
printf("seqlist L length is %d\n", get_length_seqlist(L));
show_seqlist(L);
printf("===============================================");
puts("change data[2] = 99");
change_seqlist(L, 99, 2);
printf("seqlist L length is %d\n", get_length_seqlist(L));
show_seqlist(L);
printf("===============================================");
clear_seqlist(L);
return 0;
}
99");
change_seqlist(L, 99, 2);
printf("seqlist L length is %d\n", get_length_seqlist(L));
show_seqlist(L);
printf("===============================================");
clear_seqlist(L);
return 0;
}