线性链式存储结构c语言建立,线性表的链式存储结构(C语言版)

2023-05-16

上一篇博文我对数据结构中线性表的顺序存储结构顺序表(http://12172969.blog.51cto.com/12162969/1916336)按照我的理解做了总结,今天我继续对顺序表的另一种存储结构,链表谈一下我看法。

链表为什么会出现?按照我的理解,有需就有求,我们都知道,当顺序表存储的元素较多时,插入删除,就要耗费大量时间,这是不能满足当下的需求的,而链表就解决了这个问题,也不是说链表就是最好的没有问题了,链表是用空间换时间,牺牲空间,换取存储的方便,链表的读取元素操作就没有顺序表操作方便了,所以在一种特定的情况下,合适的才是最好的。ok,我们先来明确几个基本概念:

头指针:链表中第一个节点的存储位置叫头指针。

头结点:第一个结点前放的一个不存储任何数据的结点。

头结点与头指针的区别:

1、头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针;

2、头指针具有标识作用,所以常用头指针冠以链表的名字;

3、无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

4、头结点是为了操作的统一和方便而设立的,放在第一元素的借点之前,其数据域一般无意义(也可存储链表的长度);

5、有了头结点,对在第一个元素节点点之前插入结点和删除第一个结点,其他操作与其他结点的操作统一了;

6、头结点不一定是链表的必要元素

文字描述还是很抽象,让我们来看图,这样更直观:

3878a981dd555bb428f935d0cf5a6da9.png

理清了这几个概念,接下来我们开始用c语言实现单链表的基本操作(这里会把带头结点与不带头结点分别实现并区别两者的异同):

准备工作:定义节点类型,一些声明:

#pragma once

#define ElemType int

#define TRUE    1

#define FALSE   0

#define OK      1

#define ERROR   0

typedef int Status;

typedef int DataType;

//定义结点类型

typedef  struct Node

{

ElemType data;

struct Node  *next;

}SeqNode;

typedef  struct Node *LinkList;//定义指针类型

初始化:

//带头结点的初始化,建立一个只有头结点的空链表,头结点的数据域记录表长,并且头结点不计入长度。

//初始化成功返回OK,失败返回ERROR

Status Init_Head_SeqNode(LinkList *Head)

{

*Head = (LinkList)malloc(sizeof(SeqNode));

if((*Head) == NULL)

{

printf("out  of  memory\n");

return ERROR;

}

(*Head)->next = NULL;

(*Head)->data = 0;

return OK;

}

//不带头结点的初始化,建立一个只有头结点的空链表

Status  Init_SeqNode(LinkList *Head)

{

*Head = NULL;

return TRUE;

}

头插:下边分别是带头结点与不带头结点的头插方式,直接上代码,可能有些抽象,我自己画了一些图,来帮助理解,希望可以也可以帮助大家理解:

带头结点的头插:

cbbbd48704ee138ab9a5fdce06735a86.png

不带头结点的头插:

93d7678dd3176c6fd9e00410b19a7bab.png

头插代码:

//带头结点头插,插入成功返回TRUE,失败返回ERROR

Status Insert_Head_Fr(LinkList Head,ElemType x)

{

LinkList new_node; //保存新申请的结点

new_node = (LinkList)malloc(sizeof(Node));

if(NULL == new_node)

{

printf("out of memory\n");

return FALSE;

}

new_node->data = x;//把要插入的值赋值给新申请的结点的数据域

new_node->next = Head->next;//第一步:把头结点的下一元素即就是首元结点地地址赋给新的结点

Head->next = new_node;//第二步:把新申请的结点赋值給头结点

(Head->data)++;//带头结点的头节点的数据域用来保存链表的个数,每添加一个元素加1

return TRUE;

}

//不带头结点的头插,插入成功返回TRUE,失败返回FALSE

Status Isert_No_Head_Node(LinkList *Head,ElemType x)

{

LinkList new_node;//保存新申请的结点

new_node = (LinkList)malloc(sizeof(Node));

if(NULL == new_node)

{

printf("out of memory\n");

return FALSE;

}

new_node->data = x;

new_node->next = (*Head);

//第一步:先让新申请的结点指向首元结点,因为不带头结点的链表头指针保存首元结点的地址,那么就需要这样赋值

(*Head) = new_node;//第二步:让头指针指向新申请的结点。

return TRUE;

}

尾插:同样我也给出一些我自己绘的图:

带头结点的尾插:

a0c2eb761c3b9fb025dafbe4e35c7313.png

不带头结点的尾插:

179a5ac85f103c49c0bc7b45fc6a8b49.png

尾插代码:

/*不带头结点的与带头结点的进行尾插的时候,有人会认为两者是没有区别的,

**我想你可能忽略了当链表中没有元素时两着的插入还是有区别的。

*/

//带头结点尾插,插入成功返回TRUE,失败返回ERROR

Status Insert_Head_Ba(LinkList Head,ElemType  x)

{

LinkList new_node;                           //保存新申请的结点

LinkList temp = Head;                         //找到尾结点

new_node = (LinkList)malloc(sizeof(Node));

if(NULL == new_node )

{

printf("out of memory\n");

return FALSE;

}

//利用临时变量遍历所有链表,找到尾结点,因为temp本身是指向当前节点的next的,所以当temp等于NULL时就到了链表的最后一个结点

while(NULL != temp->next)

{

temp = temp->next;

}

new_node->data = x;

new_node->next = NULL;

temp->next = new_node;

Head->data++;//带头结点的头节点的数据域用来保存链表的个数,每添加一个元素加1

return TRUE;

}

//不带头结点尾插,插入成功返回TRUE,失败返回ERROR

Status Insert_No_Head_Ba(LinkList *Head,ElemType x)

{

LinkList new_node;

LinkList temp = (*Head);//保护头指针

new_node = (LinkList)malloc(sizeof(Node));//为新申请的结点分配空间

if(NULL == new_node)

{

printf("out of menory\n");

return FALSE;

}

if(NULL == (*Head))//空链表

{

new_node->next = NULL;

new_node->data = x;

(*Head) = new_node;

return TRUE;

}

else

{

//利用临时变量遍历所有链表,找到尾结点,因为temp本身是指向当前节点的next的,所以当temp等于NULL时就到了链表的最后一个结点了

while(NULL != temp->next)

{

temp = temp->next;

}

new_node->data = x;

new_node->next = NULL;

temp->next = new_node;

return TRUE;

}

}

按照位置插入:同样先看图:

带头结点的按位置插入:

18a21ce9154ab97d052db44e27ffe738.png

不带头结点按照位置插入:

7e5d80e0d165b57494ba59b1ccaebb70.png

//带头结点的按照位置插入如元素,头节点不计入位置,插入时分为空链表和非空链表,由于带头结点所以所有操作是一样的

//插入成功返回TRUE,并且头结点的数据元素加1,插入失败返回FALSE。

Status Insert_Head_Pos_SeqNode(LinkList Head, ElemType x, int pos)

{

LinkList temp = Head;//保护头指针

LinkList temp_pre = Head;//保存定位的pos位置地址

LinkList new_node;

new_node = (LinkList)malloc(sizeof(Node));//为新申请的结点分配空间

if(NULL == new_node)

{

printf("out of memory\n");

return FALSE;

}

if(pos > Head->data)

{

printf("插入位置出错,%d不能插入\n",x);

return FALSE;

}

//通过遍历找到要放数据位置的结点,但是由于单链表的当前结点只能找到下一个结点,

//而插入数据时,需要知道当前结点的位置,所以就需要定义一个变量来保存当前前结点的前一个结点

for(int i = 0; i < pos;i++)

{

temp = temp->next;

temp_pre = temp_pre->next;

}

new_node->data = x;//为新申请的节点的数据域赋值

new_node->next = temp;

//第一步:首先让新结点指向要插入的位置,也就是当前结点的前一个结点保存的位置

temp_pre->next = new_node;//第二步:让当前结点的前一个结点指向指向新结点

Head->data++;//插入成功,链表个数加1

return TRUE;

}

//不带头结点的按位置插入,分为两种情况,如果是空链表,就要修改头指针的指向,那么修改指针的指向,就要用二级指针接收

//如果不是空链表,只需要遍历链表,找到位置,这两种情况都要考虑插入位置是否正确

//插入成功返回TRUE,插入失败返回FALSE。

Status Inser_No_Head_Pos_SeqNode(LinkList *Head, int pos, ElemType x)

{

int Num = 0;//计算链表一共多少个结点

LinkList temp = (*Head);//保护头指针

LinkList temp_pre = (*Head);//保存pos 位置的地址

LinkList new_node;

new_node = (LinkList)malloc(sizeof(Node));//为新申请的结点分配空间

if(NULL == new_node )//防止开辟内存失败

{

printf("out of memory\n");

return FALSE;

}

//处理空链表的情况

if(NULL == (*Head) )

{

if(pos > 0)

{

printf("插入位置出错,%d不能插入\n",x);

return FALSE;

}

else

{

new_node->data = x;//为开辟的新结点赋值

new_node->next = NULL;//第一步:先让新申请的节点指向要插入 的结点的下一个结点

(*Head) = new_node;//让头指针指向新结点

return TRUE;

}

}

//处理非空链表的情况

else

{

//通过遍历找到要放数据位置的结点,但是由于单链表的当前结点只能找到下一个结点,

//而插入数据时,需要知道当前结点的位置,所以就需要定义一个变量来保存当前前结点的前一个结点

while(NULL != temp)

{

Num++;

temp = temp->next;

}

if(pos+1 > Num)//如果插入位置出错直接跳出

{

printf("插入位置出错,%d不能插入\n",x);

return FALSE;

}

else if(0 == pos)

{

new_node->data = x;//为开辟的新结点赋值

new_node->next = (*Head);

(*Head) = new_node;

}

else

{

//当遍历确定pos位置正确后,此时几个指针的指向已经发生改变,需要重新指向头指针,遍历找到需要插入的结点

temp = *Head;

for(int i = 0; i < pos - 1; i++)//定位到要删除的结点的前一个结点

{

temp = temp->next;

}

new_node->data = x;//给新结点的数据域赋值

new_node->next = temp->next;

//第一步:首先让新结点指向要插入的位置,也就是当前结点的前一个结点保存的位置

temp->next = new_node;//  第二步:让当前结点的前一个结点指向指向新结点

}

}

return TRUE;

}

头删:对与删除操作,与插入操作类比,不在画图,两者是类同的。

//不带头结点的头删,需要考虑链表是否为空链表,或者或一个元素的时候,当只有一个元素的时候,头删除就需要,修改头指针的指向,其他地方的删除,顺序都一样,用x放回删除的数据

//删除成功返回TRUE,失败返回FALSE

Status Delite_No_Head_SeqNode(LinkList *Head,ElemType *x)

{

LinkList temp_node = (*Head);//防止头指针被修改

if(NULL == temp_node)

{

printf("链表已空,已经没有元素可以删除了\n");

return FALSE;

}

if(NULL == temp_node->next)

{

*x = temp_node->data;//把要删除的结点的值保存的x中去

(*Head) = NULL;

free(temp_node);//释放删除的结点,防止内存泄露

temp_node = NULL;

return TRUE;

}

else//处理链表中有一个以上的结点的删除

{

*x = temp_node->data;//把要删除的结点的值保存的x中去

*Head = temp_node->next;//修该头指针的指向

free(temp_node);//释放删除的结点,防止内存泄露

temp_node = NULL;

return TRUE;

}

}

//带头结点的头删,不论是有一个元素还是多和元素,删除操作都不需要修该头指针指向,因而也就不需要修该头指针指向,用x放回删除的数据

//删除成功返回TRUE,失败返回FALSE;

Status Delite_Head_Fr_SeqList(LinkList Head,ElemType *x)

{

LinkList temp = Head->next;//定义临时变量防止头指针被修改

if(NULL == temp->next)

{

printf("链表已空,已经没有元素删除\n");

return FALSE;

}

*x = temp->next->data;//把要删除的结点的值保存的x中去

temp = temp->next;//第一步:让临时结点指向要删除的结点的下一个结点

free(Head->next);//第二步:释放首元结点的内存,防止内存泄露

Head->next = temp;//第三步:修改头指针的指向

return TRUE;

}

尾删:同样也不在给出示意图:对比尾插的图。

//带头结点的尾删,因为有头结点所有操作都一样

Status Delite_Head_Br_SeqNode(LinkList Head,ElemType *x)

{

//定义临时变量防止头指针被修改  ,首先让指向首元结点,尾删用它来定位最后一个结点,

//由于单链表,只知道当前节点的下一个结点的位置,那么,就需要定义一个变量保存当前结点的地址

LinkList temp = Head->next;//定位最后一个指针

LinkList temp_node_pre = Head;//保存最后一个结点的地址

if(NULL == temp)

{

printf("链表已空,已经没有元素删除\n");

return FALSE;

}

while(NULL != temp->next)

{

temp = temp->next;

temp_node_pre = temp_node_pre->next;

}

*x = temp->data;//保存最后一个结点的数据域的值

temp_node_pre->next = NULL;//修改原来结点的倒数第二个结点的指向

free(temp);//此时temp_node指向最后一个结点,防止内存泄露,释放最后一个结点的内存

temp =NULL;

return TRUE;

}

//不带头结点的尾删,由于当链表只有一个元素时,删除最后一个结点就要修改指针指向,因而就要用二级指针接收头指针,用x放回删除的数据

//删除成功返回TRUE,失败返回FALSE;

Status Delite_No_Head_Br_SeqNode(LinkList *Head,ElemType *x)

{

//定义临时变量防止头指针被修改  ,首先让指向首元结点,尾删用它来定位最后一个结点,

//由于单链表,只知道当前节点的下一个结点的位置,那么,就需要定义一个变量保存当前结点的地址

LinkList temp_node = (*Head)->next;

LinkList  temp_node_pre = (*Head);

if(NULL == (*Head))

{

printf("链表已空,已无元素可以删除\n");

return FALSE;

}

while(NULL != temp_node->next)

{

temp_node = temp_node->next;

temp_node_pre = temp_node_pre->next;

}

*x = temp_node->data;//保存最后一个结点的数据域的值

temp_node_pre->next = NULL;//修改原来结点的倒数第二个结点的指向

free(temp_node);//此时temp_node指向最后一个结点,防止内存泄露,释放最后一个结点的内存

return TRUE;

}

//带头结点的按照位置删除,首先要考虑删除的位置是否存在,然后由于带头结点,所以无论是一个元素,还是多个元素删除操作都一样

Status Delite_Head_Pos_SeqNode(LinkList Head,int pos, ElemType *x)

{

//定义临时变量防止头指针被修改  ,首先让指向首元结点,尾删用它来定位最后一个结点,

//由于单链表,只知道当前节点的下一个结点的位置,那么,就需要定义一个变量保存当前结点的地址

LinkList temp = Head->next;//定位最后一个指针需要删除的结点的前一个结点

LinkList temp_node_pre = Head;//保存即将删除的结点的地址

if(NULL == temp)

{

printf("链表已空,已经没有元素删除\n");

return FALSE;

}

if(pos > temp_node_pre->data )//判断删除的位置是否存在

{

printf("删除位置出错\n");

return FALSE;

}

for(int i = 0; i < pos-1;i++)//遍历链表找到链表要删除的结点的前一个结点

{

temp = temp->next;//定位要删除的位置

}

*x = temp->next->data;//用x返回需要删除结点的值

temp_node_pre = temp->next;

temp->next = temp->next->next;//让删除的前一个结点指向要删除的下一个结点

free(temp_node_pre);//此时temp_node指向删除的结点,防止空间泄露,释放内存

temp_node_pre = NULL;

Head->data--;//头结点保存着链表的长度,删除以后减去一个

return TRUE;

}

按照位置删除:同样也不在给出示意图:对比按照位置删除的图。

//不带头结点按照位置删除,由于当只有一个结点的删除需要修改头指针指向需要特别处理

Status Delite_No_Head_Pos_SeqNode(LinkList *Head, int pos, ElemType *x)

{

int NUM = 0;//统计一共链表一共多少个结点

//定义临时变量防止头指针被修改  ,首先让指向首元结点,尾删用它来定位最后一个结点,

//由于单链表,只知道当前节点的下一个结点的位置,那么,就需要定义一个变量保存当前结点的地址

LinkList temp = (*Head);

if(NULL == temp)

{

printf("链表已空,已无元素可以删除\n");

return FALSE;

}

else if(NULL == temp->next)//处理只有一个结点的情况

{

*x = temp->data;//用x返回需要删除结点的值

(*Head) = NULL;//头结点置空

free(temp);//释放第一个结点的空间,防止内存泄露

temp = NULL; //防止指向非法空间

return TRUE;

}

else

{

while(NULL != temp)

{

NUM++;

temp = temp->next;

}

if(pos > NUM)

{

printf("删除位置出错");

return FALSE;

}

if(0 == pos)

{

temp = *Head;

*x = temp->data;

*Head = temp->next;

free(temp);

temp = NULL;

}

else

{

//当遍历确定pos位置正确后,此时几个指针的指向已经发生改变,需要重新指向头指针,遍历找到需要插入的结点

temp = *Head;

for(int i = 0; i < pos-1; i++)

{

temp = temp->next;

}

*x = temp->next->data;//用x返回需要删除结点的值

LinkList free_node = temp->next;//free_node用与保存即将删除的结点

temp->next = temp->next->next;

free(free_node);//释放第一个结点的空间,防止内存泄露

free_node = NULL;

}

}

return TRUE;

}

打印输出所有数据:

//带头结点打印输出所有数据

Status Show_Node(LinkList Head)

{

LinkList temp = Head->next;

while(NULL != temp)

{

printf("%d  ",temp->data);

temp = temp->next;

}

printf("\n");

return TRUE;

}

//不带头结点打印输出所有数据

Status Show_Node_No_Head(LinkList Head)

{

LinkList temp = Head;

while(NULL != temp)

{

printf("%d  ",temp->data);

temp = temp->next;

}

printf("\n");

return TRUE;

}

清空链表:释放所有有效结点,对于带头结点链表,要把头结点的 数据域置0

//不带头结点的清空链表,释放所有的结点

Status Clean_No_Head_SeqNode(LinkList *Head )

{

LinkList temp_node = *Head;

LinkList temp_node_pre = *Head;

*Head = NULL;

while(NULL != temp_node)

{

temp_node = temp_node->next;//因为头结点不空,让临时指针指向下一个结点

free(temp_node_pre);//释放第一结点的空间

temp_node_pre = temp_node;//指向下一个空间

}

return TRUE;

}

//带头结点的清空链表,释放除头结点以外的空间

Status Clean_Head_SeqNode(LinkList Head)

{

LinkList temp_node = Head->next;

LinkList temp_node_pre = Head->next;

Head->next = NULL;

Head->data = 0;

while(NULL != temp_node->next)

{

temp_node = temp_node->next;

free(temp_node_pre);

temp_node_pre = temp_node;

}

return TRUE;

}

排序:对于排序,首先可以采用各种排序方法,然后就是排序过程中,我提一点就是只需要把值交换并不需要交换结点。这里采用冒泡排序。

//排序,由于只需要交换两个链表中的值就好了,不用修改指针指向所以带与不带头结点操作差不多,只是有细微的差别

Status Sort_No_Head_SeqNode(LinkList Head)

{

LinkList temp_node_i = Head;

LinkList temp_node_j = Head;

LinkList temp_node_pre = Head;

ElemType temp;//用与交换值

if(NULL == temp_node_i)

{

printf("链表为空,无法排序\n");

return FALSE;

}

for(temp_node_i = temp_node_i->next; NULL != temp_node_i; temp_node_i = temp_node_i->next)

{

for( temp_node_j = temp_node_j; NULL != temp_node_j;  temp_node_j = temp_node_j->next)

{

if(temp_node_j->data > temp_node_pre->data)

{

temp = temp_node_j->data;

temp_node_j->data = temp_node_pre->data;

temp_node_pre->data = temp;

temp_node_pre = temp_node_pre->next;

}

temp_node_pre = temp_node_pre->next;

}

}

return TRUE;

}

//排序带头结点

Status Sort_Head_SeqNode(LinkList Head)

{

LinkList temp_node_i = Head->next;

LinkList temp_node_j = Head->next;

LinkList temp_node_pre = Head->next;

ElemType temp;//用与交换值

if(NULL == temp_node_i)

{

printf("链表为空,无法排序\n");

return FALSE;

}

for(temp_node_i = temp_node_i; NULL != temp_node_i->next; temp_node_i = temp_node_i->next)

{

for(temp_node_j = Head; NULL != temp_node_j->next; temp_node_j = temp_node_j->next)

{

if(temp_node_j->data > temp_node_j->next->data)

{

temp = temp_node_j->next->data;

temp_node_j->next->data = temp_node_j->data;

temp_node_j->data = temp;

}

}

}

return TRUE;

}

以上对单链表带头结点与不带头结点的头插、尾插、按照位置插、头删、尾删、按照位置删除、清空链表、排序、打印输出做了尽可能详尽的注释,都做了测试,但是没有给出主函数,数据结构中,这里不是重点,并且限于篇幅,因而没有给出主函数。当然以上代码只是我的理解,大家可以如果发现那块有错误,希望指正。

最后,细心的大家会发现这里边有好多重发的代码:比如生成新结点,定位要插入删除的位置,有好多重复的代码,那么就可以把它写成一个函数,简化代码,更有,这种结构的结构体,操作起来有些不方便,如果采用下边这种结构,更会简化,并且便于理解。

typedef struct node  //节点类型

{

type value;

struct node *next;

}Node;

typedef struct list

{

Node *phead;

Node *ptail;

}List;

这里先不做解释,后边我会做出详细解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性链式存储结构c语言建立,线性表的链式存储结构(C语言版) 的相关文章

随机推荐

  • 四轴飞行器1.5 各种PID对比分析及选择

    原创文章 xff0c 欢迎转载 xff0c 转载请注明出处 这篇文章主要介绍我对PID的理解 xff0c 以及选择PID算法的过程 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频 xff1a 介绍在后面 地址
  • micropython安装ros_ROS2 树莓派SBC镜像安装

    下载并安装Ubuntu映像文件 TurtleBot3 1 转到Ubuntu旧版本 2 在远程PC上下载ubuntu 18 04 3 preinstalled server arm64 43 raspi3 img xz 3 将Ubuntu映像
  • Error "Client wants topic A to have B, but our version has C. Dropping connection."

    ROS problem 出现这个问题的原因是话题上的消息类型和订阅节点指定的消息类型不匹配 转载于 https www cnblogs com lvchaoshun p 7811123 html
  • unity利用A*算法进行2D寻路

    找了份新工作之后 xff0c 忙的要死 xff0c 都没时间鼓捣博客了 xff0c 深深的感受到资本家的剥削 xff0c 端午节连粽子都没有 xff0c 每天下班累得跟条咸鱼一样 可能就是 刚好最近忙里偷闲 xff0c 就来写写unity在
  • 工信部划分数据中心规模等级

    C114讯 2013年1月14日上午消息 为落实 国务院关于加快培育和发展战略性新兴产业的决定 xff0c 满足社会 信息化 水平不断提高的要求 xff0c 促进我国数据中心 xff0c 特别是大型数据中心的合理布局和健康发展 xff0c
  • VS2010 error RC2135: file not found

    VS2010 C 43 43 win32 DLL 工程 xff0c 添加 rc 文件 xff0c 编辑 String Table 默认情况下英文版本的 rc 文件能够顺序编译通过 xff0c 为了让工程支持多语言 xff0c 将字符串修改为
  • mavlink协议移植问题

    mavlink协议移植问题 mavlink源代码是一个代码库 xff0c 使用的时候只需要将mavlink h头文件包含到工程项目中即可 mavlink通信协议是无状态的连接 xff0c 一般采用心跳消息跟踪系统是否存在 请确保每60 30
  • 光流传感器 定位精度_光流传感器其它方面的应用

    光流传感器可以通过在一定的时间内拍摄两张不同的照片 进而计算出物体运动的速度 光流是一种简单实用的图像运动表达方式 通常定义为一个图像序列中的图像亮度模式的表观运动 光流法检测运动物体的基本原理是 xff1a 给图像的每一个像素点赋予一个速
  • 6.28-机器人模拟器Gazebo基础

    gazebo基础学习 前言 在算法人员开发出可以真机使用的算法之前进行仿真学习机器人物理仿真器的基本使用 xff0c 包括创建场景 xff0c 制作ROS控制接口等 目录 gazebo基础学习 前言 目录 参考 学习记录 基础 安装gaze
  • Poco C++库网络模块例子解析2-------HttpServer

    下面程序取自 Poco 库的Net模块例子 HTTPServer 下面开始解析代码 include 34 Poco Net HTTPServer h 34 继承自TCPServer 实现了一个完整的HTTP多线程服务器 include 34
  • 【0928 | Day 39】事务(精讲)

    目录 一 事务 1 mysql如何控制事务 xff1f 2 默认事务开启的作用是什么 xff1f 3 事务的其他打开方式 xff1f 二 事物的四大特性 一 事务 在mysql中 xff0c 事务其实是一个最小的不可分割的工作单元 xff0
  • Unity项目 - DeathtrapDungeon死亡地牢

    目录 游戏原型项目演示绘图资源代码实现注意事项技术探讨参考来源 游戏原型 死亡地牢是一款 2D Roguelike 的地牢冒险游戏 手握利刃 xff0c 斩杀怪物 xff0c 在凶险的地牢内生存下去 但注意 xff0c 敌人也并非善茬 xf
  • Unity - 存读档机制简析

    本文旨在于简要分析Unity中的两种存档机制 xff0c 即 xff1a PlayerPrefs数据持久化方法及Serialization数据序列化方法 较比于源项目 xff0c 我另加了JSON方法 XML方法等及一些Unity设置 xf
  • Windows 无法安装到所选位置。错误:0x80300001

    Windows 无法安装到所选位置 错误 xff1a 0x80300001 这里遇到的情况是这样的 xff0c iDrac安装windows 2008 R2 xff0c 一开始映射 windows 2008 R2系统镜像 xff0c 后来
  • 【udacity】机器学习-2模型验证

    Evernote Export 1 模型的评估与验证简介 机器学习通常是大量传入数据 xff0c 然后会有一些关于数据的决策 想法和摘要 2 模型评估 评估模型使用的是各种数据分析的方法 xff0c 至少需要使用python编程和一些统计学
  • C++编程(五)--- Cmake详解&Makefile详解

    C C 43 43 程序员肯定离不开Makefile和Cmake xff0c 因为如果对这两个工具不熟悉 xff0c 那么你就不是一个合格的C C 43 43 程序员 本文对Makefile和Cmake xff0c 及它们的使用进行了详细的
  • 【统计学】第四章

    Evernote Export 一组数据的分布特征可以从那几个方面进行测度 xff1f 数据的分布特征可以从三个方面进行测度和描述 xff0c 一是分布的集中趋势 xff0c 反映各数据向其中心值靠拢或聚集的程度 xff1b 二是分布的离散
  • UG NX安装包大集合(包括UG目前发布的所有版本)

    UG NX安装包大集合 xff08 包括UG目前发布的所有版本 xff09 UG爱好者官方交流群 216953883 有了这个你就不怕找UG安装包麻烦了 xff0c 现在所有安装包全在这里了 所有版本的补丁包也在年后陆续更新 提醒 xff1
  • HTML常用字体代码

    HTML常用字体代码 常用字体 lt FONT style 61 34 FONT SIZE 40pt FILTER shadow color 61 green WIDTH 100 COLOR white LINE HEIGHT 150 FO
  • 线性链式存储结构c语言建立,线性表的链式存储结构(C语言版)

    上一篇博文我对数据结构中线性表的顺序存储结构顺序表 http 12172969 blog 51cto com 12162969 1916336 按照我的理解做了总结 xff0c 今天我继续对顺序表的另一种存储结构 xff0c 链表谈一下我看