1、什么是数据结构?
数据结构是计算机存储、组织数据的⽅式。
2、顺序表的概念及结构:
2.1.线性表:
线性表是n个具有相同特性的数据元素的有限序列,逻辑上是线性结构,但是在物理结构上并不⼀定是连续的。
2.2.顺序表分类:
(1)静态顺序表:使⽤定⻓数组存储元素。
(2)动态顺序表:(常用)
注:
1.扩容规则:通常以2倍或1.5倍进行扩容。
如初始4个空间,扩容为8,再扩容为16。
2.判断开辟内存失败时退出,if和assert区别:
assert更暴力,程序直接报错退出。
if(pr==NULL)return;相对柔和,只是所在函数退出。
3.开辟函数使用:realloc函数最好,可调整。
2.3.顺序表的实现:
头文件:
#pragma once
//动态顺序表
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* a;
int size;
int capacity;
}SL;
//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);
//扩容
void SLCheckCapacity(SL* ps);
//头部尾部 插入删除
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);
源文件:
#define _CRT_SECURE_NO_WARNINGS
#include "c.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void SLInit(SL* sl){
sl->a = NULL;
sl->size = sl->capacity = 0;
}
void SLDestroy(SL* ps) {
if (ps->a) free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SLPrint(SL* ps){
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
}
void SLCheckCapacity(SL* ps) {
if (ps->size == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* ret = realloc(ps->a, newcapacity * sizeof(SLDataType));
assert(ret);
ps->a = ret;
ps->capacity = newcapacity;
}
}
void SLPushBack(SL* ps, SLDataType x) {
assert(ps);
SLCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
void SLPushFront(SL* ps, SLDataType x) {
assert(ps);
SLCheckCapacity(ps);
for (int i = ps->size; i >0 ; i--)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[0] = x;
ps->size++;
}
void SLPopBack(SL* ps) {
assert(ps);
ps->size--;
}
void SLPopFront(SL* ps) {
assert(ps);
for (int i = 0; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
void SLInsert(SL* ps, int pos, SLDataType x) {
assert(ps);
SLCheckCapacity(ps);
for (int i = ps->size; i > pos; i--)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[pos] = x;
ps->size++;
}
void SLErase(SL* ps, int pos) {
assert(ps);
for (int i = pos; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
int SLFind(SL* ps, SLDataType x) {
assert(ps);
int flag = 0;
for (int i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
{
printf("找到了,是第%d个\n", i+1);
flag = 1;
}
}
if (flag==0) printf("没找到\n");
}
2.4.顺序表的应用:
基于顺序表实现通讯录:
【姓名 性别 年龄 电话 住址】