欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 14:59:28
...

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

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

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