这是一个通用链表的框架,适合所有的数据类型,对于头结点这个链表是存放数据的,其中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;
}