1.什么是数据结构?
1.数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
2.精心选择的数据结构可以带来更高的运行或者存储效率,这往往同高效的检索算法和索引技术有关。
2.不同种类的数据结构特点
- 顺序表:一种较为简单的数据结构,元素的插入、删除、查找等操作均可以通过数组的索引进行,具有高效性。
- 链表:通过链式存储方法实现的一种线性表,元素的插入、删除无需移动大量元素,能够高效地处理大量元素的情况。
- 栈:一种特殊的线性表,只允许在表的一端进行插入和删除操作,通常被称为“后进先出”(LIFO)的数据结构。栈常被用于实现子程序调用和递归算法等功能。
- 队列:一种特殊的线性表,只允许在表的前端进行插入操作和在表的后端进行删除操作,通常被称为“先进先出”(FIFO)的数据结构。队列常被用于实现多线程的同步等功能。
- 树:一种非线性的数据结构,可以表示层次关系和分支关系。树的节点可以有多个子节点,每个子节点都包含一个指向其父节点的指针。树在计算机科学中被广泛应用,如文件系统、搜索引擎、操作系统等。
- 图:一种较为复杂的数据结构,可以表示任意两个元素之间的关系。图的顶点可以代表各种实体,边可以代表实体之间的关系。图在计算机科学中被广泛应用,如社交网络分析、交通路网规划、人工智能等领域。
- 哈希表:一种通过哈希函数将关键字映射到存储位置的数据结构。哈希表可以在常数时间内完成查找、插入、删除等操作,因此具有很高的效率。
- 堆:一种特殊的完全二叉树,其中的每个节点都大于或等于其子节点。堆常被用于实现优先队列等功能。
3.今天的主角《顺序表》
1.顺序表的结构大多由数组完成,在内存中申请一块完整的空间开辟数组,使用数组来存储数据
2.每一个数据结构都有增删查改功能,比如在顺序表的末尾插入一个数据,或者在下标为3的地方插入一个数据,这些功能通过整合,封装成不同的接口(函数)来提供给使用者
3.顺序表的优缺点
优点:顺序表的内存空间连续,支持随机访问,可以高效地按下标进行操作,这使得在需要频繁访问元素时,顺序表可以提供较高的效率。
缺点:在顺序表中间插入或删除元素时,都涉及到元素的移动,效率较低,这是因为在插入或删除元素时,为了保证顺序表的连续性,需要对元素进行移动。
4.先看一下顺序表的使用(这里使用打印界面调用)
void menu()
{
printf("*****************************\n");
printf("**** 1.头插 2.头删********\n");
printf("**** 3.尾插 4.尾删********\n");
printf("**** 5.查找 6.任插********\n");
printf("**** 7.任删 8.查看********\n");
printf("**** 0.退出 ********\n");
printf("*****************************\n");
}
void test(SeqList* ps)
{
int input;
do
{
menu();
这里调用顺序表的增删查改(略)
} while (input);
}
int main()
{
SeqList s; 1.创建一个顺序表
SeqListInit(&s); 2.初始化一下
test(&s); 3.对顺序表增删查改
SeqListDestroy(&s); 4.销毁顺序表
return 0;
}
5.用C语言写一个顺序表
顺序表的功能由如下:
typedef int SLDateType;
typedef struct SeqList 定义一个SeqList(顺序表)类型
{
SLDateType* a;
int size;
int capacity;
}SeqList;
//初始化
void SeqListInit(SeqList* ps);
//退出
void SeqListDestroy(SeqList* ps);
//打印
void Seqlistprint(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps);
//尾删
int SeqListPopBack(SeqList* ps);
//头插
void SeqListPushFront(SeqList* ps);
//头删
void SeqListPopFront(SeqList* ps);
//顺序表查找
void SeqListFind(SeqList* ps);
//任意位置插入
void SeqListInsert(SeqList* ps, int pos);
//任意位置删除
void SeqListErase(SeqList* ps, int pos);
功能实现
void ChckCapaity(SeqList* ps)
{
if (ps->size == ps->capacity)
{
SLDateType* tmp = (SLDateType*)realloc(ps->a, ((ps->capacity)+2) * sizeof(SLDateType) );
if (tmp == NULL)
{
perror("realloc:");
exit(-1);
}
ps->a = tmp;
ps->capacity *= ps->capacity;
}
}
void SeqListInit(SeqList* ps)
{
ps->a = (SLDateType*)malloc(5 * sizeof(SLDateType));
ps->size = 0;
ps->capacity = 5;
}
void SeqListDestroy(SeqList* ps)
{
free(ps->a);
ps->a = NULL;
}
void Seqlistprint(SeqList* ps)
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void SeqListPushBack(SeqList* ps)
{
ChckCapaity(ps);
int input;
printf("请输入\n");
scanf("%d", &input);
ps->a[ps->size] = input;
ps->size++;
printf("尾插成功\n");
}
int SeqListPopBack(SeqList* ps)
{
if (ps->size == 0)
{
printf("无数据\n");
return 1;
}
else
{
ps->size--;
printf("尾删成功\n");
}
}
void SeqListPushFront(SeqList* ps)
{
ChckCapaity(ps);
int i = 0;
for(i = ps->size - 1; i >= 0; i--)
{
ps->a[i + 1] = ps->a[i];
}
int input;
printf("请输入\n");
scanf("%d", &input);
ps->a[0] = input;
ps->size++;
printf("头插成功\n");
}
void SeqListPopFront(SeqList* ps)
{
if (ps->size == 0)
{
printf("无数据\n");
return 1;
}
int i = 0;
for (i = 1; i <=ps->size; i++)
{
ps->a[i -1] = ps->a[i];
}
printf("头删成功\n");
ps->size--;
}
void SeqListFind(SeqList* ps)
{
int input = 0;
printf("请输入要查找的内容\n");
scanf("%d", &input);
int i = 0;
int flag = 0;
for (i = 0; i < ps->size; i++)
{
if (ps->a[i] == input)
{
printf("找到了是%d\n", ps->a[i]);
flag = 1;
}
}
if (flag == 0)
printf("没找到\n");
}
void SeqListInsert(SeqList* ps, int pos)
{
ChckCapaity(ps);
int input = 0;
int i = 0;
for (i = ps->size-1; i >=pos-1; i--)
{
ps->a[i + 1] = ps->a[i];
}
printf("请输入要插入的数\n");
scanf("%d", &input);
ps->a[pos - 1] = input;
ps->size++;
printf("插入成功\n");
}
void SeqListErase(SeqList* ps, int pos)
{
if (ps->size == 0)
{
printf("无数据\n");
return 1;
}
int i = 0;
for (i = pos; i <ps->size; i++)
{
ps->a[i - 1] = ps->a[i];
}
ps->size--;
printf("已删除\n");
}
如果觉得还不错请点赞👍鼓励