线性表之顺序表基本操作的实现

这里我们实现顺序表的基本操作

1.构建顺序表

int InitList(SqlList *L,int List_Size)
{
    L->elem=(int *)malloc(List_Size*sizeof(int));      //开辟一个大小为List_Size的存储空间
    if(!L->elem) return -1;
    L->List_Size=List_Size;           //表示储存空间大小,这里的空间应该<=List_Size
    L->length=0;       //空表,即表的长度为0
    return 0;
}

2.在某个位置添加数据

int AddOneIntoList(SqlList *L,int index,User user)
{
    int j;
    if(index<1 || index>L->length+1 || index==L->List_Size)      //判断当前位置是否合理
    {
        return -1;
    }
    for(j=L->length-1;j>=index-1;j--)       //将当前位置后面的结点都往后移动一位
    {
        L->elem[j+1]=L->elem[j];
    }
    L->elem[index-1]=user;         //将目标结点放置在当前位置
    ++L->length;        //顺序表整体长度加1
    return 0;
}

3.获取某个位置的结点

User GetElemByIndex(SqlList *L,int index)
{
    if(index<1 || index>L->length)          //如果当前的位置不合理,返回一个自定义的User对象
    {
        User user;
        strcpy(user.username, "error");
        return user;
    }
    return L->elem[index-1];                //返回目标结点
}

4.查找目标结点在顺序表中的位置

int FindIndexByUser(SqlList *L,User user)          //如果没有找到,返回-1;如果找到了,返回下标
{
    int i=0,index=-1;
    for(;i<L->length;i++)
    {
        User user1=L->elem[i];
        if(strcmp(user.username,user1.username)==0)
        {
            index=i;
            break;
        }
    }
    return index;
}

5.修改某个下标对应的结点的数据

int UpdateElemByIndex(SqlList *L,int index,User user)
{
    if(index<1 || index>L->length)
    {
        return -1;
    }
    User user1=L->elem[index-1];
    strcpy(user1.username,user.username);          //使用strcpy将String的数据赋值给字符数组
    strcpy(user1.password,user.password);
    L->elem[index-1]=user1;
    return 0;
}

6.删除某个位置对应的结点

int DeleteElemByIndex(SqlList *L,int index)
{
    if(index<1 || index>L->length)
    {
        return -1;
    }
    int i=index;
    for(;i<L->length;i++)            //从当前位置开始,后面的结点都向前移一位,注意,index-1代表目标结点下标
    {
        L->elem[i-1]=L->elem[i];
    }
    --L->length;
    return 0;
}

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXSIZE 100
typedef struct
{
    char username[20];
    char password[50];
}User;
typedef struct
{
    User *elem;
    int List_Size;       //表示储存空间的大小
    int length;             //表示顺序表的大小
}SqlList;
//创建一个空的顺序表
int InitList(SqlList *L,int List_Size)
{
    L->elem=(int *)malloc(List_Size*sizeof(int));
    if(!L->elem) return -1;
    L->List_Size=List_Size;       //表示储存空间大小
    L->length=0;     //空表
    return 0;
}
//在某个位置添加一个数据
int AddOneIntoList(SqlList *L,int index,User user)
{
    int j;
    if(index<1 || index>L->length+1 || index==L->List_Size)
    {
        return -1;
    }
    for(j=L->length-1;j>=index-1;j--)
    {
        L->elem[j+1]=L->elem[j];
    }
    L->elem[index-1]=user;
    ++L->length;
    return 0;
}
//获取某个位置的数据
User GetElemByIndex(SqlList *L,int index)
{
    if(index<1 || index>L->length)
    {
        User user;
        strcpy(user.username, "error");
        return user;
    }
    return L->elem[index-1];
}
//查找给定user在顺序表中的位置
int FindIndexByUser(SqlList *L,User user)
{
    int i=0,index=-1;
    for(;i<L->length;i++)
    {
        User user1=L->elem[i];
        if(strcmp(user.username,user1.username)==0)
        {
            index=i;
            break;
        }
    }
    return index;
}
//修改某个位置数据
int UpdateElemByIndex(SqlList *L,int index,User user)
{
    if(index<1 || index>L->length)
    {
        return -1;
    }
    User user1=L->elem[index-1];
    strcpy(user1.username,user.username);
    strcpy(user1.password,user.password);
    L->elem[index-1]=user1;
    return 0;
}
//删除某个位置的数据
int DeleteElemByIndex(SqlList *L,int index)
{
    if(index<1 || index>L->length)
    {
        return -1;
    }
    int i=index;
    for(;i<L->length;i++)
    {
        L->elem[i-1]=L->elem[i];
    }
    --L->length;
    return 0;
}
int main()
{
    SqlList L;
    //创建顺序表
    InitList(&L,MAXSIZE);
    //在某个位置添加一个数据
    User user;
    strcpy(user.username, "admin");
    strcpy(user.password, "gjw123");
    AddOneIntoList(&L,1,user);
    strcpy(user.username, "admin1");
    strcpy(user.password, "gjw123");
    AddOneIntoList(&L,1,user);
    strcpy(user.username, "admin2");
    strcpy(user.password, "gjw123");
    AddOneIntoList(&L,2,user);
    //获取某个位置的数据
    //User user1=GetElemByIndex(&L,1);
    //printf("%s",user1.username);
    //查找给定user在顺序表中的位置
    //int index=FindIndexByUser(&L,user);
    //printf("%d",index);
    //修改某个位置数据
    //UpdateElemByIndex(&L,1,user);
    //删除某个位置的数据
    DeleteElemByIndex(&L,1);
    return 0;
}

好了,顺序表的基本操作就演示完毕了,是不是不难呀?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值