链表保存到文件,删除节点,添加节点。
#include "stdio.h"
#include "malloc.h"
#include /*
*
* 用户数据结构
*/
typedef struct struData
{
char usertext[100];
int userdata1;
int userdata2;
}ST_DATA,*PST_DATA;
/*
*
* 链表结构
*/
typedef struct struLink
{
ST_DATA userdata;
struct struLink* pnext;
}ST_LINK,*PST_LINK;
/*
*
* 链表操作 之 申请节点
*/
PST_LINK MallocLinkNode()
{
PST_LINK pLink = NULL;
pLink =(PST_LINK) malloc(sizeof(ST_LINK));
if (pLink)
{
memset(pLink,0,sizeof(ST_LINK));
}
return pLink;
}
/*
*
* 链表操作 之 添加节点(末尾)
*/
void AddNodeToLinTail(PST_LINK pNodeHead,PST_LINK pNodeAdd)
{
while(pNodeHead->pnext != 0)
{
pNodeHead = pNodeHead->pnext;
}
pNodeHead->pnext = pNodeAdd;
pNodeAdd->pnext = 0;
}
/*
*
* 链表操作 之 添加节点(头部)
*/
PST_LINK AddNodeToLinHead(PST_LINK pNodeHead,PST_LINK pNodeAdd)
{
pNodeAdd->pnext = pNodeHead;
return pNodeAdd;
}
/*
*
* 链表操作之 删除节点(假设 member == nCondition 为删除条件);
* 返回值为新的头部,因为有可能头部被删除。
*/
PST_LINK DelLinkNode(PST_LINK pNodeHead,int nCondition)
{
PST_LINK pTemp = pNodeHead;
PST_LINK pTemp2;
/*在头部满足条件*/
if ( pNodeHead->userdata.userdata1 == nCondition)
{
pTemp = pNodeHead->pnext;
free(pNodeHead);
/*头部被删除,返回下个节点当头部*/
return pTemp;
}
else
{
/*中间节点寻找满足的条件*/
while(pNodeHead->pnext != 0)
{
/*如果下一个节点满足条件*/
if (pNodeHead->pnext->userdata.userdata1 == nCondition) /*这里是需要修改的地方*/
{
/*下一个满足了,我们删除下个节点,先保存它,以便释放内存*/
pTemp2 = pNodeHead->pnext;
/*把它后面的节点连上来,覆盖要删除的节点*/
pNodeHead->pnext = pNodeHead->pnext->pnext;
/*释放删除节点内存*/
free(pTemp2);
/*这里可以返回了,要返回原先的链表头*/
return pTemp;
}
/*测试下一个*/
pNodeHead = pNodeHead->pnext;
}
}
/*到这里,说明找不到,把原先的头部返回*/
return pTemp;
}
int GetNodeCount(PST_LINK pLinkHead)
{
int nCount = 0;
while(pLinkHead)
{
nCount++;
pLinkHead = pLinkHead->pnext;
}
return nCount;