【数据结构-线性表】顺序表

关于顺序表

顺序表结构是指一块地址连续的存储空间依次存储数据元素
可以把顺序表看成一支队伍,执行插队,或者一个人出队这些操作就是顺序表的插入和删除操作

顺序表特点

  • 逻辑关系相邻的两个元素,物理位置也必须相邻(例如第0个元素与第1个元素,他们在顺序表中的位置是相邻的,他们在内存中也是相邻的)
  • 可以随机存取表中的元素
  • 运算复杂度O(n)

顺序表的插入操作

插入操作就是和插队一样,小明要插队,那么这个位置和后面的同学都要向后移动一个位置空出来这个位置,小明才能挤进去

  1. 首先检查插入元素的位置是否正确,不能小于顺序表的第0个位置,大于顺序表的长度-1
  2. 将要插入的位置的元素及其以后的元素整体向后移动一位,空出位置
  3. 插入元素,顺序表长度+1
/*往顺序表中插入数据,list表示顺序表,loc表示把元素插入到哪个位置,num表示要插入的元素*/
void insert(List *list, int loc, int num){
    if (loc < 0 || loc>list->length) {//判断loc的值是否符合要求
        return;
    }
    else {
        for (int i = list->length; i > loc; i--) {
            list->data[i] = list->data[i - 1];//将要插入位置的元素及其以后所有元素向后移动一位
        }
        list->data[loc] = num;//将顺序表loc位置赋值为num
        list->length++;//顺序表长度+1
    }
}

顺序表的删除操作

删除操作就和出队一样,小明正在排队,突然肚子痛要去厕所,小明走了,空出来这个位置,这个位置以后所有同学都要向前一个位置,来填补这个空位
1. 首先检查要删除的位置是否合法
2. 将要删除的这个元素保存下来
3. 将这个位置以后的所有元素整体向前移动一位,覆盖这个位置的元素
4. 顺序表长度-1

/*从线性表中删除元素,loc表示删除的位置,temp表示删除的元素*/
int delete(List *list, int loc, int *temp){
    if (loc < 0 || loc>list->length-1) {
        return 0;
    }
    else {
        *temp = list->data[loc];
        for (int i = loc; i < list->length - 1; i++) {
            list->data[i]= list->data[i + 1];//将要删除位置以后所有元素向前移动一位
        }
        list->length--;//顺序表长度-1
        return 1;
    }
}

顺序表的查询操作

查询元素所在位置


/*找出elem在顺序表中的位置*/
int locateElem(List *list, int elem) {
    int i = 0;
    while (i < list->length - 1 && list->data[i] != elem) {//当出界或者找到这个元素结束循环
        i++;
    }
    if (i >= list->length) {
        return 0;
    }
    else {
        return i;
    }
}

查询loc位置的元素是谁


/*取顺序表位置为loc的元素值*/
int getElem(List *list, int loc) {
    if (loc<0 || loc>list->length - 1) {
        printf("取数位置超出界限");
            return 0;
    }
    else {
        return list->data[loc];
    }
}

使用C语言实现顺序表

#include<stdio.h>
#define SIZE 10

/*顺序表结构*/
typedef struct{
    int data[SIZE];//数据存储数组
    int length;//顺序表目前的长度,初始值为0
}List;


/*往顺序表中插入数据,list表示顺序表,loc表示把元素插入到哪个位置,num表示要插入的元素*/
void insert(List *list, int loc, int num){
    if (loc < 0 || loc>list->length) {//判断loc的值是否符合要求
        return;
    }
    else {
        for (int i = list->length; i > loc; i--) {
            list->data[i] = list->data[i - 1];//将要插入位置的元素及其以后所有元素向后移动一位
        }
        list->data[loc] = num;//将顺序表loc位置赋值为num
        list->length++;//顺序表长度+1
    }
}

/*从线性表中删除元素,loc表示删除的位置,temp表示删除的元素*/
int delete(List *list, int loc, int *temp){
    if (loc < 0 || loc>list->length-1) {
        return 0;
    }
    else {
        *temp = list->data[loc];
        for (int i = loc; i < list->length - 1; i++) {
            list->data[i]= list->data[i + 1];//将要删除位置以后所有元素向前移动一位
        }
        list->length--;//顺序表长度-1
        return 1;
    }
}

/*取顺序表位置为loc的元素值*/
int getElem(List *list, int loc) {
    if (loc<0 || loc>list->length - 1) {
        printf("取数位置超出界限");
            return 0;
    }
    else {
        return list->data[loc];
    }
}

/*找出elem在顺序表中的位置*/
int locateElem(List *list, int elem) {
    int i = 0;
    while (i < list->length - 1 && list->data[i] != elem) {//当出界或者找到这个元素结束循环
        i++;
    }
    if (i >= list->length) {
        return 0;
    }
    else {
        return i;
    }
}

/*输出顺序表中的所有元素*/
void display(List *list) {
    for (int i = 0; i < list->length; i++) {
        printf("顺序表中的元素为%d\n", list->data[i]);
    }
}

int main()
{
    List list;
    list.length = 0;
    insert(&list, 0, 1);
    insert(&list, 1, 2);
    insert(&list, 2, 3);
    insert(&list, 3, 4);
    insert(&list, 4, 5);

    display(&list);
    int temp = 0;
    delete(&list, 2, &temp);
    printf("删除的元素为%d\n", temp);

    display(&list);

    int loc = locateElem(&list, 4);
    printf("元素4所在顺序表的位置为第%d个", loc);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值