C语言链表库(gcc、mingw编译通过,不支持VC6(因为VC6不支持变参函数))

头文件:

LinkedList.h

/************************************
*                                   * 
*    作者:陈杰柱                   * 
*    2017年11月                     * 
*                                   * 
*                                   * 
*************************************/ 

/**防止重复引用**/ 
#ifndef _LINKEDLIST_H
#define _LINKEDLIST_H
#endif

#define new(Class) (Class*)malloc(sizeof(Class))
#define findMethodByObject(Object, Method, ...) Object->Method(Object, __VA_ARGS__)

#ifdef __cplusplus
extern "C" {
#endif

	typedef struct LinkedListItem ListItem;
	typedef struct LinkedListHead ListHead;
	
	struct LinkedListItem{
		void* content;
		ListItem *prev, 
				 *next;	
	};
	
	struct LinkedListHead{
		ListItem *headItem;
		ListItem *lastItem;
		int length;
		void  (*removeItem)(ListHead* head, ListItem* item);
		void  (*removeItemByPosition)(ListHead* head, int pos);			
		void  (*add)(ListHead* head, void* content);
		void* (*get)(ListHead* head, int pos);
		void  (*insert)(ListHead* head, void* content, int pos);
	};
	
	void  removeItem(ListHead* head, ListItem* item);
	void  removeItemByPosition(ListHead* head, int pos);			
	void  add(ListHead* head, void* content);
	void* get(ListHead* head, int pos);
	void  insert(ListHead* head, void* content, int pos);
	
#ifdef __cplusplus
}
#endif

#include "LinkedList.c"


实现文件:

LinkedList.c

/************************************
*                                   * 
*    作者:陈杰柱                   * 
*    2017年11月                     * 
*                                   * 
*                                   * 
*************************************/ 

void removeItem(ListHead* head, ListItem* item){
	ListItem *cursor = head->headItem;
	if(item == NULL) return;
	/**如果要删除的是头结点**/
	if(head->headItem == item){
		head->headItem = head->headItem->next;
		head->headItem->prev = NULL;
		if(cursor->content != NULL)
			free(cursor->content);
		free(cursor);
		head->length --;
		return;
	}
	/**如果要删除的是尾结点**/
	if(head->lastItem == item){
		head->lastItem = head->lastItem->prev;
		head->lastItem->next = NULL;
		if(item->content != NULL)
			free(item->content);
		free(item);
		head->length --;
		return; 
	}
	/**其他结点**/
	while(cursor != NULL){
		if(cursor == item){
			cursor->next->prev = cursor->prev;
			cursor->prev->next = cursor->next;
	 		if(item->content != NULL)
				free(item->content);
			free(item);
			head->length --;
			return;
		}
		cursor = cursor->next;
	}
}	
	
void removeItemByPosition(ListHead* head, int pos){
	ListItem *cursor = head->headItem;
	/**如果要删除的是头结点**/
	if(pos == 0){
		head->headItem = head->headItem->next;
		head->headItem->prev = NULL;
		if(cursor->content != NULL)
			free(cursor->content);
		free(cursor);
		head->length --;
		return;
	}
	/**如果要删除的是尾结点**/
	if(pos == head->length - 1){
		head->lastItem = head->lastItem->prev;
		head->lastItem->next = NULL;
		if(cursor->content != NULL)
			free(cursor->content);
		free(cursor);
		head->length --;
		return; 
	}	
	/**其他结点**/
	for(; pos > 0; pos--){
		if(cursor == NULL)
			return ;
		cursor = cursor->next;
	}
	cursor->next->prev = cursor->prev;
	cursor->prev->next = cursor->next;
	if(cursor->content != NULL)
		free(cursor->content);
	free(cursor);
	head->length --;
	return;
}	
	
void add(ListHead* head, void* content){
	if(content == NULL) return;
	/**如果表中没有项就新建第一项**/
	if(head->headItem == NULL){
 		head->headItem = new(ListItem);
		head->lastItem = head->headItem;
		head->headItem->prev = NULL;
		head->headItem->next = NULL;
		head->headItem->content = content;
	}
	else{ 
		ListItem* newItem = new(ListItem);
		/**新加项的前序地址是当前列表最后一项**/
		newItem->prev = head->lastItem;
		newItem->next = NULL;
		newItem->content = content;
		/**新加项成为列表最后一项,之前的最后一项成为倒数第二项**/ 
		head->lastItem->next = newItem;
		head->lastItem = newItem;
	}
	head->length ++;
}

void* get(ListHead* head, int pos){
	ListItem *cursor = head->headItem;
	for(; pos > 0; pos--){
		if(cursor == NULL)
			return NULL;
		cursor = cursor->next;
	}
	return cursor->content;
}

void insert(ListHead* head, void* content, int pos){
	ListItem *cursor = head->headItem;
	/**如果插入到第一项**/
	if(pos == 0){
		if(head != NULL){
			ListItem* newItem = new(ListItem);
			newItem->content = content;
			newItem->prev = NULL; 
			head->headItem->prev = newItem;
			newItem->next = head->headItem;
			head->headItem = newItem; 
			head->length ++;
			return; 
		}
	}	
	/**如果插入到最后一项**/
 	if(pos == head->length - 1){
 		if(head != NULL){
	 		ListItem* newItem = new(ListItem);
			newItem->content = content;
			newItem->next = NULL;
			head->lastItem->next = newItem;
			newItem->prev = head->lastItem;
			head->lastItem = newItem; 
			head->length ++;
			return;
		}	
 	}
	 /**其他**/
 	for(; pos > 1; pos--){
		if(cursor == NULL)
			return ;
		cursor = cursor->next;
	}
	{
		ListItem* newItem = new(ListItem);
		newItem->content = content;
		newItem->next = cursor->next;
		newItem->prev = cursor;
		cursor->next->prev = newItem;
		cursor->next = newItem;
		head->length ++;
	}
}

void destory(ListHead* head){
	if(head == NULL) return;
	ListItem* cursor = head->headItem;
	ListItem* next = NULL;
	int i=0;
	while(cursor != NULL){
		next = cursor->next;
		if(cursor->content != NULL)
			free(cursor->content);
		cursor->content = NULL;
		free(cursor);
		cursor = NULL;
		cursor = next;
		//printf("clear:%d\n", i++);
	}
	free(head);
	//printf("done\n");
}
	

ListHead* createList(){
	ListHead* head = new(ListHead);
	/**新条目没有内容**/ 
	head->headItem = NULL;
	head->length = 0; 
	head->removeItem = removeItem;
	head->removeItemByPosition = removeItemByPosition;
	head->add = add;
	head->get = get;
	head->insert = insert;
	return head;
}


使用例子:

#include "stdio.h"
#include "stdlib.h"
#include "LinkedList.h"

int main(){
	int i;
	ListHead* list = createList();
	/**添项展示**/ 
	for(i = 0; i < 100; i++){
		int* content = new(int);
		*content = i;
		findMethodByObject(list, add, (void*)content);	
	}
	/**减项展示**/ 
	findMethodByObject(list, removeItem, list->headItem->next);
	findMethodByObject(list, removeItem, list->headItem->next);
	findMethodByObject(list, removeItem, list->lastItem);
	printf("list length:%d\n", list->length);
	findMethodByObject(list, removeItemByPosition, 0);
	printf("list length:%d\n", list->length);
	{
		int* content = new(int);
		*content = 9988;
		findMethodByObject(list, insert, content, 90);
	}
	*(int*)findMethodByObject(list, get, 91) = 8899;
	for(i = 0; i < list->length	; i++){
		printf("%d\t", *((int*)findMethodByObject(list, get, i)));
	}
	destory(list);
	printf("done\n");
	return 0;
}


运行结果:



猜你喜欢

转载自blog.csdn.net/cjzjolly/article/details/78782204