#include "LinkList.h"
LNode * MakeNode(const char *value)
{
int len=0;
LNode *pNode=(LNode *)malloc(sizeof(LNode));
if(!pNode)
{
return NULL;
}
pNode->Data=(char *)malloc(sizeof(char)*DATA_LEN);
if(!pNode->Data)
{
return NULL;
}
len=(DATA_LEN-1>strlen(value)?strlen(value):(DATA_LEN-1));
strncpy(pNode->Data,value,len);
return pNode;
}//构造节点
Status FreeNode(LNode *pNode)
{
if(!pNode)
{
return ERROR;
}
if(pNode->Data)
{
free(pNode->Data);
pNode->Data=NULL;
}
free(pNode);
pNode=NULL;
return OK;
}//释放节点
LinkList *InitList(int Num,char **value)
{
if(Num<2){
return ERROR;
}
LinkList *L=(LinkList *)malloc(sizeof(LinkList));
if(!L)
{
return ERROR;
}
L->head=MakeNode(value[0]);
L->tail=MakeNode(value[Num-1]);
L->head->next=L->tail;
L->tail->next=NULL;
L->len=2;
LNode *p1,*p2;
int i=Num-2;
if(Num>2)
{
p2=p1=MakeNode(value[i]);
L->head->next=p1;
p1->next=L->tail;
L->tail->next=NULL;
L->len++;
i--;
for (;Num-1>2;Num--,i--)
{
p2=MakeNode(value[i]);
L->head->next=p2;
p2->next=p1;
p1=p2;
L->len++;
}
}
return L;
}//构造指定数目节点的链表
void ShowList(LinkList *L)
{
if(!L)
{
return;
}
LNode *p=L->head;
printf("__________________ShowListData:[%d]___________\n",L->len);
int i=1;
while(p)
{
printf("[%d]Node:%s\n",i,p->Data);
p=p->next;
i++;
}
printf("_________________________________________\n");
}//显示节点数据
Status DestroyList(LinkList *L)
{
if(!L)
{
return ERROR;
}
if(!L->head||!L->tail)
{
free(L);
L=NULL;
}
else
{
LNode *p=L->head;
LNode *pNext=p->next;
do
{
printf("Free Node!\n");
free(p->Data);
p->Data=NULL;
free(p);
p=NULL;
if(pNext)
{
p=pNext;
pNext=pNext->next;
}
L->len--;
}while(p);
L->tail=NULL;
L->head=NULL;
free(L);
L=NULL;
}
return OK;
}//销毁链表
Status ClearList(LinkList *L)
{
if(!L||!L->head)
{
return ERROR;
}
LNode *p=L->head;
LNode *pNext=p->next;
do
{
free(p->Data);
p->Data=NULL;
free(p);
p=NULL;
if(pNext)
{
p=pNext;
pNext=pNext->next;
}
L->len--;
}while(p);
L->head=NULL;
L->tail=NULL;
return OK;
}//置链表为空表
Status InsFirst(LinkList *L,LNode *pNode)
{
if(!L)
{
return ERROR;
}
if(!L->head||!pNode)
{
return ERROR;
}
pNode->next=L->head;
L->head=pNode;
L->len++;
return OK;
}//增加一个结点并作为头结点
Status DelFirst(LinkList *L,LNode **pNode)
{
if(!L||!L->head)
{
return ERROR;
}
LNode *p=L->head;
L->head=L->head->next;
*pNode=p;
(*pNode)->next=NULL;
L->len--;
return OK;
}//删除头结点
Status Append(LinkList *L,LNode *pNew)
{
if(!L||!pNew)
{
return ERROR;
}
L->tail->next=pNew;
L->tail=pNew;
pNew->next=NULL;
L->len++;
return OK;
}//附加新结点在链表尾
Status Remove(LinkList *L,LNode **pNode)
{
if(!L||!L->head)
{
return ERROR;
}
LNode *p=L->head;
do
{
p=p->next;
}while(p->next->next);
p->next=NULL;
*pNode=L->tail;
(*pNode)->next=NULL;
L->tail=p;
L->len--;
return OK;
}
int
main(void)
{
char *ValueBuf[5]={"FirstNode","SecondNode","ThirdNode","FourthNode","FifthNode"};
LinkList *List=InitList(5,ValueBuf);
if(List)
{
printf("Creat_List Ok!\n");
}
ShowList(List);
#if 0
ClearList(List);
ShowList(List);
#endif
LNode *pNode=MakeNode("InsertFirst");
if(OK==InsFirst(List,pNode))
{
printf("InsFirst OK!\n");
ShowList(List);
}
LNode *NewNode =NULL;
if(OK==DelFirst(List,&NewNode))
{
printf("DelFirst OK!\n");
ShowList(List);
FreeNode(NewNode);
}
LNode *pApp=MakeNode("AppendFirst");
if(pApp)
{
printf("Append OK!\n");
Append(List,pApp);
ShowList(List);
}
#if 1
LNode *pRmv=NULL;
if(OK==Remove(List,&pRmv))
{
printf("Remove OK!\n");
printf("Remove:%s\n",pRmv->Data);
ShowList(List);
FreeNode(pRmv);
}
#endif
if(OK==DestroyList(List))
{
printf("Free_List Ok!\n");
}
return 0;
}
|