数据结构

154 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情

一、数据结构的基本概念

  1. 算法
  • 5个特性 : 输入 、输出 、有穷 、确定 、可行性。
  1. 数据结构分类
  • 逻辑结构

    • 集合 元素之间没有关系,都是平等,不去探讨

    • 线性 1:1 关系 除了第一个元素没有前驱,最后一个元素没有后继,其他元素都有唯一的前驱和唯一的后继

    • 树形 1:n

    • 图形 n:n

  • 物理结构

    • 顺序存储

    • 链式存储

二、动态数组

  1. 初始化

  2. 插入数据

    • 判断是否已经满载,如果满载动态开辟内存

    • 插入数据

  3. 遍历数据

    • 将数组中的每个元素进行遍历,利用到回调函数
  4. 删除数据

    • 按位置进行删除

    • 按值进行删除

  5. 销毁数组

  6. 分文件编写

动态数据设计思路解析图

动态.jpg

三、单向链表

  1. 节点结构体

    • 数据域 void *

    • 指针域 struct LinkNode * next

  2. 链表结构体

    • struct LinkNode pHeader 头节点

    • int m_Size 链表长度

  3. 初始化链表

  4. 插入链表

  5. 遍历链表

  6. 删除节点

    • 按照位置进行删除

    • 按值进行删除 利用两个辅助指针变量

  7. 清空链表

  8. 返回链表长度

  9. 销毁链表

单向链表解析图

单向.jpg 示例程序如下

#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++; //更新链表的长度

}