C语言链表实现

     因为平时经常使用链表,所以仿照维基百科上的链表解释,写了一个链表头文件,以后方便使用。

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <malloc.h>
/**
* zhangzxpan
* 单向链表
**/
//节点
struct Node{
   void *datap;
   struct Node *next; 
};

//链表头
struct LinkedList{
    struct Node head;
    int size;
    int elmsize;
    int isempty;    
};

struct LinkedList* LinkedList_new(int elmsize);
int LinkedList_free(struct LinkedList *linkedlist);
int LinkedList_node_append(struct LinkedList *linkedlist, const void *datap);
int LinkedList_node_delete(struct LinkedList *linkedlist,struct Node *node);
struct Node* LinkedList_node_find(struct LinkedList *linkedlist,int key);

//新建链表
struct LinkedList* LinkedList_new(int elmsize)
{

    struct LinkedList *linkedlist;
    linkedlist=(LinkedList *)malloc(sizeof(struct LinkedList));
    if(linkedlist==NULL){
           return NULL;
    }
   
    linkedlist->head.datap=NULL;
    linkedlist->elmsize=elmsize;
    linkedlist->head.next=NULL;
    linkedlist->size=0;
    linkedlist->isempty=1;     
   
   
    return  linkedlist;      
}


//释放链表
int LinkedList_free(struct LinkedList *linkedlist)
{
    struct LinkedList *p_linkedlist=linkedlist;
    struct Node *p_node,*p_save;
   
    for(p_node=linkedlist->head.next;p_node!=NULL;p_node=p_save)
    {
      
               p_save=p_node->next;
               free(p_node->datap);
               free(p_node);                                                   
    }
    free(p_linkedlist);  
    return 0;
}


//添加节点
int LinkedList_node_append(struct LinkedList *linkedlist, const void *datap)
{
    struct LinkedList *p_linkedlist=linkedlist;
    struct Node *p_newnode;
    p_newnode=(Node *)malloc(sizeof(struct Node));
   
    if(p_newnode==NULL){
         return -1;
    }
   
    p_newnode->datap=malloc(p_linkedlist->elmsize);
    if(p_newnode->datap==NULL){
          free(p_newnode);
          return -1;
    }
    
      memcpy(p_newnode->datap,datap,p_linkedlist->elmsize);
    
     p_newnode->next=p_linkedlist->head.next;
     p_linkedlist->head.next=p_newnode;
     linkedlist->size++;
    return 0;
}

//删除节点
int LinkedList_node_delete(struct LinkedList *linkedlist,struct Node *node)
{
       struct LinkedList *p_linkedlist=linkedlist;
       struct Node *p_node,*p_save;
       if(linkedlist->size<=0)
             return -1;
       for(p_save=&(p_linkedlist->head),p_node=p_linkedlist->head.next;p_node!=NULL;)
       {
                                                                                                 
                 if(node==p_node)
                 {
                  
                   p_save->next=p_node->next;
                   free(p_node);
                   linkedlist->size--;
                   break;             
                 }
                 p_save=p_node;
                 p_node=p_node->next;                                                 
       }
       
       return 0;
}

//寻找某个位置的节点
struct Node* LinkedList_node_find(struct LinkedList *linkedlist,int key)
{
      struct LinkedList *p_linkedlist=linkedlist;
      struct Node *p_node;
      int flag=0;
      if(p_linkedlist->size<=0)
           return NULL;
      p_node=p_linkedlist->head.next;
      for(flag=0;flag<p_linkedlist->size-key-1;flag++)
      {
          p_node=p_node->next;                                 
                                  }
      return  p_node;
                                                                 
}

posted @ 2012-04-16 22:42  理想的肉饼  阅读(368)  评论(1)    收藏  举报