内存管理:
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"