我要成为嵌入式高手之3月19日数据结构第二天!!
————————————————————————————
valgrind内存测试工具
让虚拟机上网、在虚拟机上下载软件,参考笔记:
我要成为嵌入式高手之2月3日Linux高编第一天!!-CSDN博客
上图表示申请了10个空间,释放了10个空间,没有内存泄漏
上图申请了11个空间,释放了10个空间,存在内存泄漏(leaked memory)
单向链表逆序
#include "head.h"
LINK_LIST *CreateLink()
{
LINK_LIST *plist = malloc(sizeof(LINK_LIST));
if (NULL == plist)
{
perror("fail to malloc");
return NULL;
}
plist->phead = NULL;
plist->clen = 0;
return plist;
}
int LinkSearch(LINK_LIST *plist)
{
LINK_NODE *ptmp = plist->phead;
while (ptmp != NULL)
{
printf("%d\n", ptmp->data);
ptmp = ptmp->pnext;
}
printf("len = %d\n", plist->clen);
return 0;
}
int PushTailLink(LINK_LIST *plist, DATA_TYPE data)
{
LINK_NODE *ptmp = plist->phead;
LINK_NODE *pnode = malloc(sizeof(LINK_NODE));
if (NULL == pnode)
{
perror("fail to malloc pnode");
return -1;
}
pnode->data = data;
pnode->pnext = NULL;
if (plist->phead == NULL)
{
plist->phead = pnode;
}
else
{
while (ptmp->pnext != NULL)
{
ptmp = ptmp->pnext;
}
ptmp->pnext = pnode;
plist->clen++;
}
return 0;
}
int ReverseLink(LINK_LIST *plist)
{
if (plist->phead == NULL)
{
return -1;
}
LINK_NODE *ptmp = plist->phead;
plist->phead = NULL;
LINK_NODE *pinsert = NULL;
while (ptmp != NULL)
{
pinsert = ptmp;
ptmp = ptmp->pnext;
pinsert->pnext = plist->phead;
plist->phead = pinsert;
}
return 0;
}
int main()
{
LINK_LIST *plist = NULL;
plist = CreateLink();
if (NULL == plist)
{
return -1;
}
PushTailLink(plist, 1);
PushTailLink(plist, 2);
PushTailLink(plist, 3);
PushTailLink(plist, 4);
PushTailLink(plist, 5);
LinkSearch(plist);
ReverseLink(plist);
printf("=========================\n");
LinkSearch(plist);
return 0;
}
找单向链表的中间节点
LINK_NODE *SearchMidNode(LINK_LIST *plist)
{
LINK_NODE *pfast = plist->phead;
LINK_NODE *pslow = plist->phead;
while (pfast != NULL)
{
pfast = pfast->pnext;
if (NULL == pfast)
{
break;
}
pfast = pfast->pnext;
pslow = pslow->pnext;
}
return pslow;
}
寻找链表倒数第K个结点
LINK_NODE *SearchReNoKNode(LINK_LIST *plist, int k)
{
LINK_NODE *pfast = plist->phead;
LINK_NODE *pslow = pfast;
int i = 0;
for (i = 0; i < k; i++)
{
if (NULL == pfast)
{
return NULL;
}
pfast = pfast->pnext;
}
while (pfast != NULL)
{
pfast = pfast->pnext;
pslow = pslow->pnext;
}
return pslow;
}
删除指定数据的结点
int DeleteKNode(LINK_LIST *plist, int k)
{
LINK_NODE *pfree = NULL;
LINK_NODE *ptmp = NULL;
pfree = plist->phead;
ptmp = pfree;
while (pfree != NULL)
{
if (pfree->data == k)
{
if (plist->phead == pfree)
{
plist->phead = pfree->pnext;
free(pfree);
plist->clen--;
break;
}
else
{
ptmp->pnext = pfree->pnext;
free(pfree);
plist->clen--;
break;
}
}
else
{
ptmp = pfree;
pfree = pfree->pnext;
}
}
return 0;
}
链表的插入排序
int InsertSort(LINK_LIST *plist)
{
LINK_NODE *ptmp = NULL;
LINK_NODE *pinsert = NULL;
LINK_NODE *p = NULL;
if (p == NULL || p->pnext == NULL)
{
return -1;
}
ptmp = plist->phead->pnext;
plist->phead->pnext = NULL;
pinsert = ptmp;
while (ptmp != NULL)
{
pinsert = ptmp;
ptmp = ptmp->pnext;
if (pinsert->data <= plist->phead->data)
{
pinsert->pnext = plist->phead;
plist->phead = pinsert;
}
else
{
LINK_NODE *p = plist->phead;
while (p->pnext != NULL && p->pnext->data < pinsert->data)
{
p = p->pnext;
}
pinsert->pnext = p->pnext;
p->pnext = pinsert;
}
}
return 0;
}