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;
}

浙公网安备 33010602011771号