赞
踩
搭配食用更佳哦~~
创建一个头文件 SeqList.h,进行准备工作
- #pragma once
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<stdio.h>
- #include<stdlib.h>
- #include<assert.h>
- #include"Contact.h"
- //定义顺序表的结构
- //动态顺序表
- typedef struct SeqList
- {
- SLDataType* arr;
- int size; //有效数据个数
- int capacity; //空间大小
- }SL;
添加上要实现的方法:
- //顺序表初始化
- void SLInit(SL* ps);
- //顺序表的销毁
- void SLDestroy(SL* ps);
- void SLPrint(SL s);
-
- //头部插入删除 / 尾部插入删除
- void SLPushBack(SL* ps, SLDataType x);
- void SLPushFront(SL* ps, SLDataType x);
-
- void SLPopBack(SL* ps);
- void SLPopFront(SL* ps);
-
- //指定位置之前插入/删除/查找数据
- void SLInsert(SL* ps, int pos, SLDataType x);
- void SLErase(SL* ps, int pos);
- int SLFind(SL* ps, SLDataType x);

创建一个 .c 文件
- #include"SeqList.h"
- void SLInit(SL* ps)
- {
- ps->arr = NULL;
- ps->size = ps->capacity = 0;
- }
- //顺序表的销毁
- void SLDestroy(SL* ps)
- {
- if (ps->arr) //等价于 if(ps->arr != NULL)
- {
- free(ps->arr);
- }
- ps->arr = NULL;
- ps->size = ps->capacity = 0;
- }
- void SLCheckCapacity(SL* ps)
- {
- //插入数据之前先看空间够不够
- if (ps->capacity == ps->size)
- {
- //申请空间
- //malloc calloc realloc int arr[100] --->增容realloc
- //三目表达式
- int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
- SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//要申请多大的空间
- if (tmp == NULL)
- {
- perror("realloc fail!");
- exit(1);//直接退出程序,不再继续执行
- }
- //空间申请成功
- ps->arr = tmp;
- ps->capacity = newCapacity;
- }
- }

- //尾插
- void SLPushBack(SL* ps, SLDataType x)
- {
- 温柔的解决方式
- //if (ps == NULL)
- //{
- // return;
- //}
- assert(ps); //等价与assert(ps != NULL)
-
- //ps->arr[ps->size] = x;
- //++ps->size;
- SLCheckCapacity(ps);
- ps->arr[ps->size++] = x;
- }
- //头插
- void SLPushFront(SL* ps, SLDataType x)
- {
- assert(ps);
- SLCheckCapacity(ps);
- //先让顺序表中已有的数据整体往后挪动一位
- for (int i = ps->size; i > 0; i--)
- {
- ps->arr[i] = ps->arr[i - 1];//arr[1] = arr[0]
- }
- ps->arr[0] = x;
- ps->size++;
- }

- //在指定位置之前插入数据
- void SLInsert(SL* ps, int pos, SLDataType x)
- {
- assert(ps);
- assert(pos >= 0 && pos <= ps->size);
- //插入数据:空间够不够
- //申请空间
- SLCheckCapacity(ps);
-
- //让pos及其之后的数据整体往后移动
- for (int i = ps->size; i > pos ; i--)
- {
- ps->arr[i] = ps->arr[i - 1];//arr[pos+1]=arr[pos]
- }
- ps->arr[pos] = x;
- ps->size++;
- }

- //删除指定位置数据
- void SLErase(SL* ps, int pos)
- {
- assert(ps);
- assert(pos >= 0 && pos < ps->size);
- for (int i = 0; i < ps-> size-1 ; i++)
- {
- ps->arr[i] = ps->arr[i + 1];//当arr[size-2]等于arr[size-1]的时候
-
- }
- ps->size--;
- }
2.7顺序表查找数据
- 顺序表的查找
- int SLFind(SL* ps, SLDataType x)
- {
- assert(ps);
- for (int i = 0; i < ps->size; i++)
- {
- if (ps->arr[i] == x)
- {
- //找到啦
- return i;
- }
- }
- //没有找到返回-1
- return -1;
- }
当我们可以使用这些基本操作后,我们就可以将里面的字符数字替换成结构体,来实现更复杂的操作~~~例如通讯录的实现~~
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/508004
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。