开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情。
一、数据结构的基本概念
- 算法
- 5个特性 : 输入 、输出 、有穷 、确定 、可行性。
- 数据结构分类
-
逻辑结构
-
集合 元素之间没有关系,都是平等,不去探讨
-
线性 1:1 关系 除了第一个元素没有前驱,最后一个元素没有后继,其他元素都有唯一的前驱和唯一的后继
-
树形 1:n
-
图形 n:n
-
-
物理结构
-
顺序存储
-
链式存储
-
二、动态数组
-
初始化
-
插入数据
-
判断是否已经满载,如果满载动态开辟内存
-
插入数据
-
-
遍历数据
- 将数组中的每个元素进行遍历,利用到回调函数
-
删除数据
-
按位置进行删除
-
按值进行删除
-
-
销毁数组
-
分文件编写
动态数据设计思路解析图
三、单向链表
-
节点结构体
-
数据域
void * -
指针域
struct LinkNode * next
-
-
链表结构体
-
struct LinkNode pHeader头节点 -
int m_Size链表长度
-
-
初始化链表
-
插入链表
-
遍历链表
-
删除节点
-
按照位置进行删除
-
按值进行删除 利用两个辅助指针变量
-
-
清空链表
-
返回链表长度
-
销毁链表
单向链表解析图
示例程序如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//链表结点
struct LinkNode
{
void * data; //数据域
struct LinkNode * next; //指针域
};
//链表结构体
struct LList
{
struct LinkNode pHeader; //头节点
int m_Size; //链表长度
};
typedef void * LinkList;
//初始化链表
LinkList init_LinkList()
{
struct LList * myList = malloc(sizeof(struct LList));
if (myList == NULL)
{
return NULL;
}
//初始化链表结构体
myList->pHeader.data = NULL;
myList->pHeader.next = NULL;
myList->m_Size = 0;
return myList;
}
//插入结点
void insert_LinkList(LinkList list,int pos , void * data)
{
if (list == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct LList * myList = list;
if (pos < 0 || pos >myList->m_Size)
{
//无效位置进行尾插
pos = myList->m_Size;
}
//创建临时节点
struct LinkNode * pCurrent = &myList->pHeader;
for (int i = 0; i < pos;i++)
{
pCurrent = pCurrent->next;
}
//通过循环 找到 插入位置的前驱节点
//创建出新节点
struct LinkNode * newNode = malloc(sizeof(struct LinkNode));
newNode->data = data;
newNode->next = NULL;
//将新节点 插入到 链表中
newNode->next = pCurrent->next;
pCurrent->next = newNode;
myList->m_Size++; //更新链表的长度
}