线性表之顺序表基本操作的实现
程序员文章站
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;
}
好了,顺序表的基本操作就演示完毕了,是不是不难呀?