顺序表的操作

一、主要操作

Initlist(Sqlist* L)// 初始化
AddSize(Sqlist* L, int len)//线性表增加len个长度
ListInsert(Sqlist* L, int i, char e)//插入元素
GetList(Sqlist L, int i)//按位查找
GetList1(Sqlist L, char e)//按值查找
DeleteList(Sqlist *L,int i)//删除元素
outlist(Sqlist* L)//输出顺序表
ListEmpty(Sqlist L)//判线性表是否为空表
FreeList(Sqlist *L)//释放顺序表

二、实现过程

//Written by Z_bin
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define InitSize 5 //顺序表初始长度

typedef struct
{
    char* data; //存放数据
    int MaxSize;//最大长度
    int length; //当前长度
}Sqlist;

//顺序表初始化
void InitList(Sqlist *L)
{
    (*L).data = (char *)malloc(InitSize*sizeof(char));
    L->length = 0;
    // for(int i = 0;i<InitSize;i++)
    // {
    //     L->data[i] = 0;//所有元素初始化为0
    //     L->length++;
    // }
    L->MaxSize = InitSize;
}

//增加表长
void AddList(Sqlist *L,int len)
{
    char *p = L->data;
    L->data=(char *)malloc((L->MaxSize+len)*sizeof(char));
    for(int i = 0;i < L->length;i++)
    {
        L->data[i] = p[i];
    }
    L->MaxSize += len;

    free(p);
}
//1).将已存在的数据先备份;
//2).用malloc()开辟出新的空间
//3).将备份的数据存回新空间中,同时增加新表的长度
//4).用free()释放备份的数据
//插入元素
void ListInsert(Sqlist *L,int i,char e)
{
    if (i < 1 || i > L->MaxSize)
    {
        printf("插入失败,逻辑位序不对!\n");
         return;
    }
    for(int j = L->length;j >= i;j--)
    {
       L->data[j] = L->data[j-1];
    }
    L->data[i-1] = e;
    L->length++;
}
//1).对插入的位置进行判断;
//2).从最后一个元素开始向后移动一个位置,直到空出插入的位置停止移动;
//3).将要插入的元素存于该空位,同时表长+1;
//删除元素
void DeleteList(Sqlist *L,int i)
{
    if (i < 1 || i > L->length)
    {
        printf("删除失败,逻辑位序不对!\n");
        return;
    }
    for(int j = i;j < L->length;j++)
    {
        L->data[j-1] = L->data[j];
    }
    L->length--;
}
//1).对删除的位置进行判断;
//2).从要删除元素的后一个位置开始向前移动一个位置,直到最后位置向前移一位;
//3).同时表长+1;
//按位查找
char GetList(Sqlist L,int i)
{
    return L.data[i-1];
}

//按值查找
int GetList1(Sqlist L,char e)
{
    for(int i = 0;i < L.length;i++)
    {
        if(L.data[i] == e)
            return i+1;
    }
}
//判线性表是否为空表
void ListEmpty(Sqlist L)
{
    if(L.length != 0)  printf("非空表\n");
    else printf("空表\n");
}

void OutList(Sqlist *L)
{
    for(int i = 0;i < L->length;i++)
    {
        printf("%c ",L->data[i]);
    }
}

//释放顺序表
void FreeList(Sqlist *L)
{
    free((*L).data);
}
int main(void)
{
    Sqlist L;
    InitList(&L);

    ListInsert(&L,1,'A');
    ListInsert(&L,2,'B');
    ListInsert(&L,3,'C');
    ListInsert(&L,4,'D');
    ListInsert(&L,5,'E');//插入ABCDE

    OutList(&L);//遍历输出顺序表

    printf("\n插入元素A,B,C,D,E后表长:%d\n",L.length);
    ListEmpty(L);//判断顺序表是否为空
    printf("第4个元素:%c\n",GetList(L,4));//输出顺序表的第4个元素
    printf("元素B的位置:%d\n",GetList1(L,'B'));//输出元素B的位置

    printf("第2个位置插入F:");
    AddList(&L,1);//顺序表已达最大长度,增加一个长度,再插入‘F’
    ListInsert(&L,2,'F');//在第2个元素位置插入元素F
    OutList(&L);//遍历输出顺序表

    printf("\n删除第4个元素:");
    DeleteList(&L,4);//删除第4个元素
    OutList(&L);//遍历输出顺序表

    FreeList(&L);//释放顺序表
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值