数据结构-静态顺序表

数据结构-顺序表

顺序表概念

顺序表:

  • 是可以动态增长的数组
  • 顺序表的数据类型是抑一致的
  • 数据是连续存储的(地址上连续)

两种顺序表定义及其区别

静态顺序表和动态顺序表。
静态顺序表的定义:

#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值