赞
踩
目录
顺序表是线性表的存储结构,用一组地址连续的存储单元依次存储线性表的数据元素。在顺序表中,在逻辑结构上连续的,物理结构也连续。一般采用数组储存
顺序表和数组的区别?
顺序表实质上就是对数组的封装,完成了对数组的增删改查的操作。
其实这一张图就能充分解释数组和顺序表的关系
- typedef int SLDataType;
- typedef struct SeqList
- {
- SLDataType* arr;
- int size;
- int capacity;
-
- }SL;
-
- void SeqListInit(SL* ps)
- {
- ps->arr = NULL;
- ps->size = ps->capacity = 0;
- }
我们将arr 的首地址定义成NULL,方便之后增加数据,size表示有效数据,capacity表示当前顺序表容量。
- void SeqListDestory(SL* ps)
- {
- if (ps->arr)
- {
- free(ps->arr);
- }
- ps->arr = NULL;
- ps->size = ps->capacity = 0;
- }
销毁时,我们先释放顺序表中的数组空间,然后将释放后的指针指向NULL,size和capacity都赋值为0;
- void SLCheckCapacity(SL* ps)
- {
- if (ps->size == ps->capacity)
- {
- int newcapactity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
- SLDataType* tmp = (SLDataType*)realloc(ps->arr, sizeof(ps->capacity));
- if (tmp == NULL)
- {
- perror("realloc fail");
- exit(1);
-
- }
- ps->arr = tmp;
- ps->capacity = newcapactity;
- }
-
- }
当size和capacity相等时,说明空间满了,如果在想加入数据,需要进行扩容,这时候就要用到realloc函数了,对现有空间进行扩容,代码意思是申请ps->capacity个字节数的类型为SLDataType*的空间给ps->arr上。
- void SeqListPushBack(SL* ps, SLDataType x)//尾插
-
- {
-
- assert(ps);
- SLCheckCapacity(ps);
- ps->arr[ps->size++] = x;
- }//因为size的位置总是在最后一位有效元素的下一个位置的,所以直接插入就好
-
-
-
- void SeqListPushFront(SL* ps, SLDataType x)//头插
- {
- assert(ps);
- SLCheckCapacity(ps);
- for (int i = ps->size; i > 0; i--)
- {
- ps->arr[i] = ps->arr[i - 1];
-
- }
- ps->arr[0] = x;
- ps->size++;
-
-
- }//头插需要将所有现有元素向后移动一位,在下标为0的元素插入
- void SeqListpopBack(SL* ps, SLDataType x)
- {
- assert(ps);
- SLCheckCapacity(ps);
- //ps->arr[ps->size - 1] = -1;
- ps->size--;
- }//对size直接进行--即可
- void SeqListpopFront(SL* ps, SLDataType x)
- {
- for (int i = ps->size; i > 0; i--)
- {
- ps->arr[i] = ps->arr[i + 1];
-
-
- }
- ps->size--;
- }//头删需要将所有元素向前移动一位即可,有效数据进行--
- void SeqListprint(SL* ps)
- {
- for (int i = 0; i < ps->size; i++)
- {
- printf("%d", ps->arr[i]);
-
- }
- printf("\n");
- }
- void SeqListInsert(SL* ps, int pos, SLDataType x)//顺序表指定位置插入
- {
- assert(ps);
- assert(pos >= 0 && pos <= ps->size);
- SLCheckCapacity(ps);
- for (int i = ps->size; i > pos; i--)
- {
- ps->arr[i] = ps->arr[i - 1];
-
- }
- ps->arr[pos] = x;
- ps->size++;
- }//pos位置之后的位置进行向后移动一位,然后再下表为pos位置进行插入
- void SeqListErase(SL* ps, int pos)
- {
- assert(ps);
- assert(pos >= 0 && pos <= ps->size);
- SLCheckCapacity(ps);
- for (int i = ps->size; i < pos; i++)
- {
- ps->arr[i - 1] = ps->arr[i];
-
- }
- ps->size--;
-
-
-
- }//pos之后的向前移动一位,将pos位置的值进行覆盖,有效数据-1;
- int SeqListFind(SL* ps, SLDataType x)
-
- {
- int flag = 1;
- assert(ps);
- for (int i = 0; i < ps->size; i++)
- {
- if (ps->arr[i] == x)
- {
-
- flag = 0;
- return x;
-
- }
-
-
- }
- return -1;
-
-
- }//遍历顺序表中的所有有效数据,如果与查找的数相等,直接返回查找数,遍历完毕之后,没有发现,返回-1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。