java link 使用_使用 C 实现Java LinkList
基于 ADT 鏈表數據結構實現的C語言版 LinkList.
C代碼
typedefstruct_link_list{
inttheSize;
intmodCount;
struct_node?*node;
struct_node?*beginMarker;
struct_node?*endMarker;
}?link_list;
struct_node{
void*data;
struct_node?*prev;
struct_node?*next;
};
externlink_list*?create_link_list(void);
externvoidlink_add(link_list?*link,void*data);
externvoid*?link_get(link_list?*link,intindex);
externvoidlink_set(link_list?*link,intindex,void*data);
externintlink_size(link_list?*link);
externvoidlink_remove(link_list?*link,intindex);
externvoidlink_destory(link_list?*link);
typedef struct _link_list{
int theSize;
int modCount;
struct _node *node;
struct _node *beginMarker;
struct _node *endMarker;
} link_list;
struct _node{
void *data;
struct _node *prev;
struct _node *next;
};
extern link_list* create_link_list(void);
extern void link_add(link_list *link, void *data);
extern void* link_get(link_list *link, int index);
extern void link_set(link_list *link, int index, void *data);
extern int link_size(link_list *link);
extern void link_remove(link_list *link, int index);
extern void link_destory(link_list *link);
C代碼
//?link_list.c
//?author?denger
#include?"../../include/common.h"
#include?"../../include/link_list.h"
#define?MALLOC_ERROR?"Failed?to?allocate?menory?space!"
link_list*?create_link_list(void){
link_list?*list?=?(link_list*)malloc(sizeof(link_list));
if(list?==?NULL){
puts(MALLOC_ERROR);
returnNULL;
}
list->theSize?=?0;
list->node?=?(struct_node*)malloc(sizeof(struct_node));
if(list->node?!=?NULL){
list->node->data?=?NULL;
list->node->next?=?list->node->prev?=?NULL;//?Initialize?pointer?NULL
list->endMarker?=?list->beginMarker?=?list->node;
}else{
puts(MALLOC_ERROR);
returnNULL;
}
returnlist;
}
//?Add?any?type?to?link_list.
voidlink_add(link_list?*list,void*data){
struct_node*?node?=?(struct_node*)malloc(sizeof(struct_node));
if(node?==?NULL){
puts(MALLOC_ERROR);
}else{
node->prev?=?list->node;
list->endMarker?=?list->node?=?list->node->next?=?node;
node->data?=?data;
list->theSize++;
}
}
//?Getter?a?node?in?link_list.
struct_node*?_link_get_node(link_list?*list,intindex){
if(index?>=?list->theSize?||?index?
printf("List?index?out?of?bounds?:?%d\n",?list->theSize);
returnNULL;
}
inti;
struct_node?*node;
if(index?
node?=?list->beginMarker->next;
for(i?=?0;?i?
node?=?node->next;
}
}else{
node?=?list->endMarker;
intmax?=?link_size(list)?-?index?-?1;
for(i?=?0;?i?
node?=?node->prev;
}
}
returnnode;
}
void*?link_get(link_list?*list,intindex){
struct_node?*node?=?_link_get_node(list,?index);
if(node?==?NULL){
returnNULL;
}
returnnode->data;
}
//?return?the?link?list?size.
intlink_size(link_list?*list){
returnlist->theSize;
}
//?replace?node.
voidlink_set(link_list?*list,intindex,void*data){
struct_node?*node?=?_link_get_node(list,?index);
if(node?!=?NULL){
node->data?=?data;
}
}
//?remove?node.
voidlink_remove(link_list?*list,intindex){
struct_node?*node?=?_link_get_node(list,?index);
if(node?==?NULL){
return;
}
node->prev->next?=?node->next;
node->next->prev?=?node->prev;
if(node?!=?NULL){
if(node->data?!=?NULL){
free(node->data);
}
free(node);
node?=?NULL;
}
list->theSize--;
}
//?destory?link
voidlink_destory(link_list?*list){
inti?=?0;
struct_node?*node?=?list->beginMarker;
for(i?=?0;?i?<=?list->theSize;?i++){
struct_node?*next?=?node->next;
if(node?!=?NULL){
if(node->data?!=?NULL){
free(node->data);
}
free(node);
node?=?next;
}
}
free(list);
list?=?NULL;
}
// link_list.c
// author denger
#include "../../include/common.h"
#include "../../include/link_list.h"
#define MALLOC_ERROR "Failed to allocate menory space!"
link_list* create_link_list(void){
link_list *list = (link_list*)malloc(sizeof(link_list));
if (list == NULL){
puts(MALLOC_ERROR);
return NULL;
}
list->theSize = 0;
list->node = (struct _node*)malloc(sizeof(struct _node));
if (list->node != NULL){
list->node->data = NULL;
list->node->next = list->node->prev = NULL; // Initialize pointer NULL
list->endMarker = list->beginMarker = list->node;
}else{
puts(MALLOC_ERROR);
return NULL;
}
return list;
}
// Add any type to link_list.
void link_add(link_list *list, void *data){
struct _node* node = (struct _node*)malloc(sizeof(struct _node));
if (node == NULL){
puts(MALLOC_ERROR);
}else{
node->prev = list->node;
list->endMarker = list->node = list->node->next = node;
node->data = data;
list->theSize++;
}
}
// Getter a node in link_list.
struct _node* _link_get_node(link_list *list, int index){
if (index >= list->theSize || index < 0){
printf("List index out of bounds : %d\n", list->theSize);
return NULL;
}
int i;
struct _node *node;
if (index < link_size(list) / 2){
node = list->beginMarker->next;
for (i = 0; i < index; i++){
node = node->next;
}
}else{
node = list->endMarker;
int max = link_size(list) - index - 1;
for (i = 0; i < max; i++){
node = node->prev;
}
}
return node;
}
void* link_get(link_list *list, int index){
struct _node *node = _link_get_node(list, index);
if (node == NULL){
return NULL;
}
return node->data;
}
// return the link list size.
int link_size(link_list *list){
return list->theSize;
}
// replace node.
void link_set(link_list *list, int index, void *data){
struct _node *node = _link_get_node(list, index);
if (node != NULL){
node->data = data;
}
}
// remove node.
void link_remove(link_list *list, int index){
struct _node *node = _link_get_node(list, index);
if (node == NULL){
return;
}
node->prev->next = node->next;
node->next->prev = node->prev;
if (node != NULL){
if (node->data != NULL){
free(node->data);
}
free(node);
node = NULL;
}
list->theSize--;
}
// destory link
void link_destory(link_list *list){
int i = 0;
struct _node *node = list->beginMarker;
for (i = 0; i <= list->theSize; i++){
struct _node *next = node->next;
if (node != NULL){
if (node->data != NULL){
free(node->data);
}
free(node);
node = next;
}
}
free(list);
list = NULL;
}
C代碼
intmain(intargc,char*args[])?{
link_list?*list?=?create_link_list();
inti;
for(i?=?0;?i?
int*?value?=?(int*)malloc(sizeof(int));
*value?=?i;
link_add(list,?value);
}
printf("The?list?size:?%d\n",?link_size(list));
for(i?=?0;?i?
printf("index:?%d?=?%d\n",?i,?*(int*)link_get(list,?i));
}
int*new=?(int*)malloc(sizeof(int));
*new=?100;
link_set(list,?0,new);
printf("\n?Update?the?index?0?value:?%d\n",?*(int*)link_get(list,?0));
link_remove(list,?0);
printf("Remove?Before========\n");
for(i?=?0;?i?
printf("index:?%d?=?%d\n",?i,?*(int*)link_get(list,?i));
}
link_destory(list);
}
總結
以上是生活随笔為你收集整理的java link 使用_使用 C 实现Java LinkList的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开头是无的成语有哪些?
- 下一篇: 会掉价吗?