嵌入式学习第十五天

内存管理:

1.malloc 

void *malloc(size_t size);
      功能:
        申请堆区空间
      参数:
        size:申请堆区空间的大小
      返回值:
        返回获得的空间的首地址
        失败返回NULL


2.free

void free(void *ptr);
      功能:
        释放堆区空间
注意:
        1.free只能释放堆区空间
        2.一个空间只能被free一次,多次free程序会崩溃
        3.malloc需要和free搭配使用,如果只有malloc没有free会内存泄露

(1)内存溢出:
    内存溢出也称为内存越界
(2)内存泄露:
    程序中malloc的空间没有被释放
(3)内存碎片:
    由于频繁申请和释放,导致连续的空间分散成一些小的碎片空间,当malloc超过碎片空间时,则无法获得该空间(空间不连续),将这样的空间称为内存碎片

链表:

1.定义链表节点结构体:首先需要定义一个结构体来表示链表的节点,该结构体包含一个数据成员和一个指向下一个节点的指针。

2.创建链表节点:创建链表节点时,需要分配内存并初始化数据成员和指针。

3.在链表末尾插入节点:要在链表末尾插入一个节点,需要找到最后一个节点并修改其指针。

4.遍历链表:遍历链表时,从头节点开始,依次访问每个节点,直到到达链表的末尾。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef	int DataType;

typedef struct node 
{
	DataType Data;
	struct node *pNext;
}LinkNode;

LinkNode *CreateLinkList(void)
{
	LinkNode *pTmpNode = NULL;

	pTmpNode = malloc(sizeof(LinkNode));
	if (NULL == pTmpNode)
	{
		return NULL;
	}

	pTmpNode->pNext = NULL;
	
	return pTmpNode;
}

int InsertHeadLinkList(LinkNode *pHead, DataType TmpData)
{
	LinkNode *pTmpNode = NULL;

	pTmpNode = malloc(sizeof(LinkNode));
	if (NULL == pTmpNode)
	{
		return -1;
	}

	pTmpNode->Data = TmpData;
	pTmpNode->pNext = pHead->pNext;
	pHead->pNext = pTmpNode;

	return 0;
}

int ShowLinkList(LinkNode *pHead)
{
	LinkNode *pTmpNode = NULL;

	pTmpNode = pHead->pNext;
	while (pTmpNode != NULL)
	{
		printf("%d ", pTmpNode->Data);
		pTmpNode = pTmpNode->pNext;
	}
	printf("\n");

	return 0;
}

int ReplaceLinkList(LinkNode *pHead, DataType OldData, DataType NewData)
{
	LinkNode *pTmpNode = NULL;

	pTmpNode = pHead->pNext;
	while (pTmpNode != NULL)
	{
		if (pTmpNode->Data == OldData)
		{
			pTmpNode->Data = NewData;
		}
		pTmpNode = pTmpNode->pNext;
	}

	return 0;
}

int DeleteLinkList(LinkNode *pHead, DataType TmpData)
{
	LinkNode *pPreNode = NULL;
	LinkNode *pTmpNode = NULL;

	pTmpNode = pHead->pNext;
	pPreNode = pHead;
	
	while (pTmpNode != NULL)
	{
		if (pTmpNode->Data == TmpData)
		{
			pPreNode->pNext = pTmpNode->pNext;
			free(pTmpNode);
			pTmpNode = pPreNode->pNext;
		}
		else 
		{
			pTmpNode = pTmpNode->pNext;
			pPreNode = pPreNode->pNext;
		}
	}

	return 0;
}

int DestroyLinkList(LinkNode **ppHead)
{
	LinkNode *pTmpNode = NULL;
	LinkNode *pFreeNode = NULL;

	pTmpNode = pFreeNode = *ppHead;
	while (pTmpNode != NULL)
	{
		pTmpNode = pTmpNode->pNext;
		free(pFreeNode);
		pFreeNode = pTmpNode;
	}
	*ppHead = NULL;

	return 0;
}

int main(void)
{
	LinkNode *linklist = NULL;

	linklist = CreateLinkList();
	InsertHeadLinkList(linklist, 1);
	InsertHeadLinkList(linklist, 2);
	InsertHeadLinkList(linklist, 3);
	InsertHeadLinkList(linklist, 4);
	InsertHeadLinkList(linklist, 5);
	ShowLinkList(linklist);
	ReplaceLinkList(linklist, 5, 50);
	ReplaceLinkList(linklist, 1, 10);
	ShowLinkList(linklist);
	DeleteLinkList(linklist, 50);
	DeleteLinkList(linklist, 10);
	ShowLinkList(linklist);
	DestroyLinkList(&linklist);

	return 0;
}

作业:

1.封装函数在链表中实现尾插法

 int InsertTailLinkList(LinkNode *pHead, DataType TmpData);

2.从终端接收一个字符串,将字符串倒置后输出

例如:"how are you" -> "you are how"

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值