这是一个通用链表的框架,适合所有的数据类型,对于头结点这个链表是存放数据的,其中SUCCESS 是宏为1,FAILURE 也是宏为0;
链表的头文件list.h
/********************************************************
* *
* ☆☆☆☆☆ 链表 函数的声明 ☆☆☆☆☆ *
* *
********************************************************/
#ifndef _LIST_H_
#define _LIST_H_
#define SUCCESS 1
#define FAILURE 0
//链表结点
typedef struct Node
{
void *data;
struct Node *next;
}TNode,*PNode;
//声明初始化结点,添加结点,
//插入节点,删除结点,查找结点,
//以及求结点总数的函数声明
PNode List_init();
int List_add(void *data,PNode head);
PNode List_remove(int position,PNode head);
int List_getcount(PNode head);
PNode List_get(int position,PNode head);
int List_update(void *data,int position,PNode head);
int List_insert(void *data,int position,PNode head);
int LIST_free(PNode head);
#endif _LIST
链表实现函数的c文件.c
#inlcude"list.h"
/*********************************************
*函数名称:PNode List_init(void *data)
*功能描述:链表节点初始化
*参数说明:data [IN]链表的数据
*返回值: 成功返回该结点作为头结点,失败返回NULL
*********************************************/
PNode List_init(void *data)
{
/*开辟一个空间用于存放头结点,并判断是否开辟成功*/
PNode nodehead=(PNode)malloc(sizeof(TNode));
memset(nodehead,0,sizeof(TNode));
if (NULL==nodehead)
{
return NULL;
}
else
{
memset(nodehead,0x0,sizeof(TNode));
nodehead->data=data;
nodehead->next=NULL;
}
return nodehead;
}
/*********************************************
*函数名称:int List_add(void *data,PNode head)
*功能描述:链表结尾添加节点
*参数说明:data [IN]链表的数据
head [IN]链表头
*返回值: 成功返回1,失败返回0
*********************************************/
int List_add(void *data,PNode head)
{
PNode nodetail=NULL;
PNode newnode;
nodetail=head;
if (head!=NULL) //做一个判断链表头是否为空
{
while(nodetail->next!=NULL)
{
nodetail=nodetail->next;
}
newnode=(PNode)malloc(sizeof(TNode)); //分配结点空间
if (NULL==newnode)
{
return FAILURE;
}
else
{
memset(newnode,0,sizeof(TNode));
newnode->data=data;
newnode->next=NULL;
nodetail->next=newnode;
}
return SUCCESS;
}
return FAILURE;
}
/*********************************************
*函数名称:int List_remove(int position,PNode head)
*功能描述:链表节点删除
*参数说明:position [IN] 要查询的结点位置
head [IN] 链表头
*返回值: 成功返回SUCCESS,失败返回FAILURE
*********************************************/
PNode List_remove(int position,PNode head)
{
PNode pre_rmnode;
PNode rmnode;
PNode newhead;
if (head!=NULL)
{
if (position>=1 && position<=List_getcount(head))//删除结点,通过List_get获得删除结点的位置,及删除结点位置的前一个位置
{
if (position==1) //判读删除的是否是第一个节点
{
if (head->next!=NULL)
{
newhead=head->next;
free(head->data);
free(head);
head=newhead;
}
else
{
free(head->data);
free(head);
return NULL;
}
return head;
}
else
{
pre_rmnode=List_get(position-1,head);//获得要删除结点的前一个结点
rmnode=pre_rmnode->next; //获得的
if (rmnode->next==NULL) //用来判断是否删除的是最后一个节点,如果是,它的前一个结点的next为null
{
pre_rmnode->next=NULL;
free(rmnode->data);
free(rmnode);
return head;
}
else //删除的不是第一个节点,也不是最后一个结点
{
pre_rmnode->next=rmnode->next;
free(rmnode->data);
free(rmnode);
return head;
}
}
}/*if position判断 结束*/
} /*if (head!=NULL) 结束*/
return NULL;
}
/*********************************************
*函数名称:int List_insert(void *data,int position,PNode head)
*功能描述:在链表第k个位置添加结点
*参数说明: data [IN]链表的数据
position [IN] 要查询的结点位置
head [IN]链表头
*返回值: 成功返回1,失败返回0
*********************************************/
int List_insert(void *data,int position,PNode head)//在第k个位置插入节点,自己添加的函数
{
PNode pre_node;
PNode Currnode;
PNode Insrnode;
if (head!=NULL)
{
if (position>=1 && position<=List_getcount(head))
{
if (position==1) //在第一位置插入
{
Insrnode=(PNode)malloc(sizeof(TNode));
memset(Insrnode,0,sizeof(TNode));
Insrnode->data=data;
Insrnode->next=head;
head=Insrnode;
}
else //插入在其他的位置
{
pre_node=List_get(position-1,head); //获得要插入位置的前一个结点
Currnode=pre_node->next; //插入位置的节点
Insrnode=(PNode)malloc(sizeof(TNode));
memset(Insrnode,0,sizeof(TNode));
Insrnode->data=data;
Insrnode->next=Currnode;
pre_node->next=Insrnode;
}
return SUCCESS;
}
}
return FAILURE;
}
/*********************************************
*函数名称:int List_update(void *data,int position,PNode head)
*功能描述:在链表第k个位置修改节点数据
*参数说明: data [IN]链表的数据
position [IN] 要查询的结点位置
head [IN]链表头
*返回值: 成功返回SUCCESS,失败返回FAILURE
*********************************************/
int List_update(void *data,int position,PNode head)//更新第k个的数据,
{
PNode updanode;
if (head!=NULL)
{
if ((updanode=List_get(position,head))!=NULL)
{
free(updanode->data);
updanode->data=data;
}
return SUCCESS;
}
return FAILURE;
}
/*********************************************
*函数名称:int List_getcount(PNode head)
*功能描述:遍历结点,计算结点总数
*参数说明:head [IN] 链表的头结点
*返回值: 成功返回SUCCESS,失败返回FAILURE
*********************************************/
int List_getcount(PNode head)
{
int nodecount=1;
PNode temp=NULL;
temp=head;
if (head!=NULL)
{
while(temp->next!=NULL)
{
nodecount++;
temp=temp->next;
}
return nodecount;
}
return 0;
}
/*********************************************
*函数名称:PNode List_get(int position,PNode head)
*功能描述:获得查找结点的位置,并返回该结点
*参数说明: position [IN] 要查询的结点位置
head [IN]链表头
*返回值: 成功返回该结点,失败返回NULL
*********************************************/
PNode List_get(int position,PNode head)
{
int listnode=1;
PNode tempnode=NULL;
tempnode=head;
if (head!=NULL)
{
if (position>=1 && position<=List_getcount(head))//判断位置是否已超出结点的位置
{
while(tempnode->next!=NULL)
{
if (position==listnode) //如果查找到该结点则break
break;
listnode++;
tempnode=tempnode->next;
}
return tempnode;
}
}
return NULL;
}
/*********************************************
*函数名称:int LIST_free(PNode head)
*功能描述:释放节点空间
*参数说明: head [IN]链表头
*返回值: 成功返回SUCCESS,失败返回FAILURE
*********************************************/
int LIST_free(PNode head)
{
PNode tempnode=NULL;
PNode curnode=NULL;
tempnode=head;
if (head!=NULL)
{
while (tempnode->next!=NULL) //用来保证链表的下一个结点有效
{
curnode=tempnode->next;
free(tempnode->data);
free(tempnode);
tempnode=curnode;
}
free(tempnode->data); //释放链表的数据
free(tempnode); //释放链表结点
return SUCCESS;
}
return FAILURE;
}