#include "ChainList.h"
/*初始化链表*/
bool Init(ChainListType *head)
{
head = (ChainListType *)malloc(sizeof(ChainListType));
if(head == NULL)
{
printf("初始化失败!\n");
return false;
}
head->next=NULL;
return true;
}
/*获取链表结点数量*/
int Length(ChainListType *head)
{
ChainListType *p;
int i=0;
p=head;
while(p) //遍历整个链表
{
i++; //累加结点数量
p=p->next; //处理下一结点
}
return i; //返回结点数量
}
/*添加结点到链表结尾*/
ChainListType *AddEnd(ChainListType *head,DATA data)
{
ChainListType *node,*p;
if(!(node=(ChainListType *)malloc(sizeof(ChainListType))))
{
printf("为保存结点数据申请内存失败!\n");
return NULL; //分配内存失败
}
node->data=data; //保存数据
node->next=NULL; //设置结点指针为空,即为表尾
//是头指针
if(head==NULL)
{
head=node;
return head;
}
//不是头指针
p=head;
while(p->next!=NULL) //查找链表的末尾
p=p->next ;
p->next=node;
return head;
}
/*添加结点到链表首部*/
ChainListType *AddFirst(ChainListType *head,DATA data)
{
ChainListType *node;
if(!(node=(ChainListType *)malloc(sizeof(ChainListType))))
{
printf("为保存结点数据申请内存失败!\n");
return NULL; //分配内存失败
}
node->data=data; //保存数据
node->next=head; //指向头指针所指结点
head=node; //头指针指向新增结点
return head;
}
/*插入结点到链表指定位置*/
ChainListType *Insert(ChainListType *head,char *findkey,DATA data)
{
ChainListType *node,*node1;
if(!(node=(ChainListType *)malloc(sizeof(ChainListType)))) //分配保存结点的内容
{
printf("为保存结点数据申请内存失败!\n");
return 0; //分配内存失败
}
node->data=data; //保存结点中的数据
node1=Find(head,findkey);
if(node1) //若找到要插入的结点
{
node->next=node1->next; //新插入结点指向关键结点的下一结点
node1->next=node; //设置关键结点指向新插入结点
}
else
{
free(node);//释放内存
printf("未找到插入位置!\n");
}
return head;//返回头指针
}
/*按关键字在链表中查找内容*/
ChainListType *Find(ChainListType *head,char *key)
{
ChainListType *p;
p=head; //保存链表头指针
while(p) //若结点有效,则进行查找
{
if(strcmp(p->data.key,key)==0) //若结点关键字与传入关键字相同
return p; //返回该结点指针
p=p->next; //处理下一结点
}
return NULL; //返回空指针
}
/*删除指定关键字的结点*/
bool Delete(ChainListType *head,char *key)
{
ChainListType *node,*p; //node保存删除结点的前一结点
node=p=head;
while(p)
{
if(strcmp(p->data.key,key)==0) //找到关键字,执行删除操作
{
node->next=p->next; //使前一结点指向当前结点的下一结点
free(p); //释放内存
return true;
}
else
{
node=p; //指向当前结点
p=p->next; //指向下一结点
}
}
return false; //未删除
}
/*遍历链表*/
void ShowAll(ChainListType *head)
{
ChainListType *h;
DATA data;
h=head;
printf("链表所有数据如下:\n");
while(h) //循环处理链表每个结点
{
data=h->data; //获取结点数据
printf("(%s,%s,%d)\n",data.key,data.name,data.age);
h=h->next; //处理下一结点
}
return;
}
/*销毁链表*/
bool Destory(ChainListType *head)
{
ChainListType *p=NULL;
if(head == NULL)
return false;
while(head)
{
p=head->next;
free(head);
head=p;
}
return true;
}