顺序表专题;

顺序表专题

一结构体:

因为顺序表中的成员类型只靠int,char,double,这些类型是不够的。列如:在一个顺序表中存入学生的基本信息,这仅靠int,char这些是无法成功的。这就需要自定义类型结构体。Struct  stu{

char name【】;

int age 【】;

};

二顺序表的实现:

顺序表的底层逻辑就是数组,在数组的基础上实现增删查改。数组只能存int等类型但顺序表可以顺序存储结构体类型。

1顺序表类型的定义;

typedef int  idate;//通过typedef将int定义为idate方便后续更改顺序表的元素

typedef struct SeqList {

   idate* arr;

   int size;

   int capicty;

}SL;此种定义为动态顺序表,可以通过使用内存申请函数动态的申请空间

typedef struct SeqList {

   idate arr【MAXSIZE】;

   int size;

}SL

此种为静态顺序表。

大多数情况下使用动态顺序表,因为我们在创建顺序表时不确定我会使用多少空间,

2顺序表的增删查改;

(1)顺序表的插入

再顺序表中实现插入操作时都需要判断这个顺序的空间是否满了我门可以实现一个函数来判断空间是否满。

void SLCheak(SL*sq) {

    if (sq->size == sq->c) {

       int newc = sq->capicty == 0 ? 4 : 2 * sq->capicty;//如果空间为0则直接让capicty=4,不为0则为原来值的2倍。

       idate* s = (idate*)realloc(sq->arr, newc * sizeof(idate));

       if (s == NULL) {

           perror("realloc");

           exit(1);

       }

       else

           sq->arr = s;

       sq->capicyt = newc;

    }

}

在判断完之后再进行插入操作

void SLInsert(SL* sq, int pos, idate x) {

   assert(sq);

   assert(pos >= 0 && pos <= sq->size);

   SLCheak(sq);

   int i = 0;

   for (i = sq->size; i>pos; i--) {

      sq->arr[i] = sq->arr[i - 1];

   }

   sq->arr[pos] = x;

   sq->size++;//插入完之后一定要让顺序表中元素个数加1

}实现插入操作只需要让插入位置及其该位置之后的元素都往后移一位,然后让空出的位置放入要插入的元素。

(2)顺序中元素的删除

在删除元素之前要判断是否为空表如果为空表则报错。

void SLErase(SL* sq, int pos) {

    assert(sq);

    assert(pos >=0 && pos < sq->size);

    int i = 0;

    for (i =pos; i<sq->size-1; i++) {

       sq->arr[i] = sq->arr[i+1];

    }

    sq->size--;//删除完后一定要让顺序表中元素-1.

}

(3)顺序表元素的查找

int SLFind(SL* sq, idate x) {

    assert(sq);

    int i = 0;

    for (int i = 0; i < sq->size; i++) {

        if (sq->arr[i] == x) {

        printf("找到了");

                return i;

        }

        else

            printf("找不到 ");

        return -1;

    }

}

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值