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