368 lines
22 KiB
C
368 lines
22 KiB
C
#ifndef LIST_EXPAND_H
|
||
#define LIST_EXPAND_H
|
||
#include "list.h"
|
||
|
||
Node *nodeWithInt(int);//快速初始化一个单一值节点并赋值
|
||
Node *nodeWithDouble(double);//快速初始化一个节单一值点并赋值
|
||
Node *nodeWithString(const char *);//快速初始化一个单一值节点并赋值
|
||
Node *nodeWithPointer(void *);//快速初始化一个单一值节点并赋值
|
||
|
||
Node *nodeWithComplex(void);//快速初始化一个复合值节点并赋值
|
||
int addValueForComplex(Node *, char *type, void *value);//为复合节点添加值
|
||
int addIntForComplex(Node *, int);//为复合节点添加一个特定类型的值
|
||
int addDoubleForComplex(Node *, double);//为复合节点添加一个特定类型的值
|
||
int addStringForComplex(Node *, char *);//为复合节点添加一个特定类型的值
|
||
int addPointerForComplex(Node *, void *);//为复合节点添加一个特定类型的值
|
||
|
||
Node *findByIndexForNode(List *, unsigned long long);//根据位置查找一个节点
|
||
Node *findByIntForNode(List *, int);//依照特定类型查找一个节点
|
||
Node *findByDoubleForNode(List *, double);//依照特定类型查找一个节点
|
||
Node *findByStringForNode(List *, char *);//依照特定类型查找一个节点
|
||
Node *findByPointerForNode(List *, void *);//依照特定类型查找一个节点
|
||
|
||
List *m_findByIntForNode(List*, int);//根据位置查找所有匹配的节点
|
||
List *m_findByDoubleForNode(List*, double);//根据位置查找所有匹配的节点
|
||
List *m_findByStringForNode(List*, char *);//根据位置查找所有匹配的节点
|
||
List *m_findByPointerForNode(List*, void *);//根据位置查找所有匹配的节点
|
||
|
||
void printListInfo(List *p_list,int priority);//打印列表的详细信息
|
||
void printNodeInfo(Node *p_node,int priority);//打印节点的详细信息
|
||
void printList(List *);//打印列表
|
||
void printNode(Node *p_node);//打印节点
|
||
|
||
int getByIntForNode(Node *);//直接得到节点的值
|
||
double getByDoubleForNode(Node *);//直接得到节点的值
|
||
char *getByStringForNode(Node *);//直接得到节点的值
|
||
void *getByPointerForNode(Node *);//直接得到节点的值
|
||
unsigned long long getIndexByNode(List *p_list,Node *p_node);
|
||
int listThrough(List *p_list, int (*p_func)(char *, void *));//遍历链表并不断调用目标函数。目标函数将接受节点储存值的指针及其类型。
|
||
|
||
|
||
Node *nodeWithInt(int m_int){
|
||
int *p_int = (int *)malloc(sizeof(int));
|
||
*p_int = m_int;
|
||
Node *p_node = initNode();
|
||
initMalllocValueForNode(p_node,"int",(void *)p_int);
|
||
return p_node;
|
||
}
|
||
|
||
Node *nodeWithDouble(double m_double){
|
||
double *p_double = (double *)malloc(sizeof(double));
|
||
*p_double = m_double;
|
||
Node *p_node = initNode();
|
||
initMalllocValueForNode(p_node,"double",(void *)p_double);
|
||
return p_node;
|
||
}
|
||
|
||
Node *nodeWithString(const char *m_string){
|
||
char *p_string = (char *)malloc(sizeof(char)*(strlen(m_string)+1));
|
||
strcpy_s(p_string, sizeof(p_string), m_string);
|
||
Node *p_node = initNode();
|
||
initMalllocValueForNode(p_node,"string",(void *)p_string);
|
||
return p_node;
|
||
}
|
||
|
||
Node *nodeWithPointer(void *m_pointer){
|
||
Node *p_node = initNode();
|
||
initMalllocValueForNode(p_node,"pointer",m_pointer);
|
||
return p_node;
|
||
}
|
||
|
||
Node *nodeWithComplex(void){
|
||
Node *p_node = initNode();
|
||
p_node->type = "list";
|
||
p_node->value = initList();
|
||
p_node->if_malloc = 1;
|
||
return p_node;
|
||
}
|
||
|
||
Node *findByIndexForNode(List *p_list, unsigned long long m_index){
|
||
Node *p_node = p_list->head;
|
||
for(unsigned long long i= 0; i < m_index; i++){
|
||
p_node = p_node->next;
|
||
}
|
||
return p_node;
|
||
}
|
||
|
||
int listThrough(List *p_list, int(*p_func)(int(*p_func)(char *, void *))){
|
||
Node *p_node = p_list->head;
|
||
while(p_node != NULL){
|
||
if(p_node->if_malloc == 1){
|
||
int m_return = (*p_func)(p_node);
|
||
if (m_return == -1) break;
|
||
else if (m_return == 1){
|
||
p_node = p_node->last;
|
||
continue;
|
||
}
|
||
else{
|
||
|
||
}
|
||
}
|
||
p_node = p_node->next;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int getByIntForNode(Node *p_node){
|
||
if (!strcmp(p_node->type, "int")) return *(int *)(p_node->value);
|
||
else return -1;
|
||
}
|
||
|
||
char *getByStringForNode(Node *p_node){
|
||
if (!strcmp(p_node->type, "string")) return (char *)(p_node->value);
|
||
else return NULL;
|
||
}
|
||
|
||
double getByDoubleForNode(Node *p_node){
|
||
if (!strcmp(p_node->type, "double")) return *(double *)(p_node->value);
|
||
else return -1;
|
||
}
|
||
|
||
void *getByPointerForNode(Node *p_node){
|
||
if (!strcmp(p_node->type, "pointer")) return (void *)(p_node->value);
|
||
else return NULL;
|
||
}
|
||
|
||
void printListInfo(List *p_list,int priority){
|
||
for(int i = 0; i < priority; i++) printf(" ");
|
||
printf("###LIST(location:%p, id:%llu){\n",p_list,p_list->id);
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("HEAD->%p / Tail->%p / Length:%llu\n",p_list->head,p_list->tail,p_list->length);
|
||
Node *p_node = p_list->head;
|
||
int i = 0;
|
||
while (p_node != NULL){
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("%d.... \n",i);
|
||
printNodeInfo(p_node, priority+1);
|
||
p_node = p_node->next;
|
||
i++;
|
||
}
|
||
for(int i = 0; i < priority; i++) printf(" ");
|
||
printf("}\n");
|
||
|
||
}
|
||
|
||
void printList(List *p_list) {
|
||
Node *p_node = p_list->head;
|
||
printf("[");
|
||
int if_nearLast = 0;
|
||
while (p_node != NULL) {
|
||
if (!if_nearLast && p_node->next == NULL) if_nearLast = 1;
|
||
if (!strcmp(p_node->type, "int")) {
|
||
printf("%d", *(int *)(p_node->value));
|
||
}
|
||
else if (!strcmp(p_node->type, "double")) {
|
||
printf("%a", *(double *)(p_node->value));
|
||
}
|
||
else if (!strcmp(p_node->type, "string")) {
|
||
printf("%s", (char *)(p_node->value));
|
||
}
|
||
else if (!strcmp(p_node->type, "pointer")) {
|
||
printf("%s", (char *)(p_node->value));
|
||
}
|
||
else if (!strcmp(p_node->type, "list")) {
|
||
printList((List *)p_node->value);
|
||
}
|
||
if (!if_nearLast) {
|
||
printf(", ");
|
||
}
|
||
p_node = p_node->next;
|
||
}
|
||
printf("]");
|
||
}
|
||
|
||
void printNodeInfo(Node *p_node,int priority){
|
||
for(int i = 0; i < priority; i++) printf(" ");
|
||
printf("#NODE(location:%p, id:%llu){\n",p_node,p_node->id);
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("NEXT->%p / LAST->%p / MALLOC:%d\n",p_node->next,p_node->last,p_node->if_malloc);
|
||
if(!strcmp(p_node->type, "int")){
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("VALUE(Int):%d\n",*(int *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "double")){
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("VALUE(Double):%a\n",*(double *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "string")){
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("VALUE(String):%s\n",(char *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "pointer")){
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("VALUE(Pointer):%s\n",(char *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "list")){
|
||
for(int i = 0; i < priority+1; i++) printf(" ");
|
||
printf("VALUE(List):\n");
|
||
printListInfo((List *)p_node->value,priority+2);
|
||
}
|
||
for(int i = 0; i < priority; i++) printf(" ");
|
||
printf("}\n");
|
||
}
|
||
|
||
void printNode(Node *p_node){
|
||
printf("#NODE(location:%p, id:%llu){\n",p_node,p_node->id);
|
||
printf(" ");
|
||
printf("NEXT->%p / LAST->%p / MALLOC:%d\n",p_node->next,p_node->last,p_node->if_malloc);
|
||
printf(" ");
|
||
if(!strcmp(p_node->type, "int")){
|
||
printf("%d",*(int *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "double")){
|
||
printf("%a\n",*(double *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "string")){
|
||
printf("%s\n",(char *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "pointer")){
|
||
printf("%s\n",(char *)(p_node->value));
|
||
}
|
||
else if(!strcmp(p_node->type, "list")){
|
||
printList((List *)p_node->value);
|
||
}
|
||
printf("}\n");
|
||
}
|
||
|
||
|
||
Node *findByIntForNode(List *p_list, int target){
|
||
int *p_target = (int *)malloc(sizeof(int));
|
||
*p_target = target;
|
||
Node *t_node = findByValue(p_list, "int", p_target);
|
||
free(p_target);
|
||
return t_node;
|
||
}
|
||
|
||
Node *findByDoubleForNode(List *p_list, double target){
|
||
double *p_target = (double *)malloc(sizeof(double));
|
||
*p_target = target;
|
||
Node *t_node = findByValue(p_list, "double", p_target);
|
||
free(p_target);
|
||
return t_node;
|
||
}
|
||
|
||
Node *findByStringForNode(List *p_list, char *target){
|
||
char *p_temp = (char *)malloc(sizeof(char)*(strlen(target)+1));
|
||
strcpy_s(p_temp, sizeof(p_temp), target);
|
||
Node *t_node = findByValue(p_list, "string", p_temp);
|
||
free(p_temp);
|
||
return t_node;
|
||
}
|
||
|
||
Node *findByPointerForNode(List *p_list, void *target){
|
||
Node *t_node = findByValue(p_list, "pointer", target);
|
||
return t_node;
|
||
}
|
||
|
||
int addValueForComplex(Node * p_node, char *type, void *value){
|
||
if(!strcmp(p_node->type ,"list")){
|
||
List *c_list = (List *)p_node->value;
|
||
Node *c_node = initNode();
|
||
initMalllocValueForNode(c_node, type, value);
|
||
insertInTail(c_list, c_node);
|
||
return 0;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
int addIntForComplex(Node *p_node, int temp){
|
||
if(!strcmp(p_node->type, "list")){
|
||
int *p_temp = (int *)malloc(sizeof(int));
|
||
*p_temp = temp;
|
||
addValueForComplex(p_node, "int", p_temp);
|
||
return 0;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
int addDoubleForComplex(Node *p_node, double temp){
|
||
if(!strcmp(p_node->type, "list")){
|
||
double *p_temp = (double *)malloc(sizeof(double));
|
||
*p_temp = temp;
|
||
addValueForComplex(p_node, "double", p_temp);
|
||
return 0;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
int addStringForComplex(Node *p_node, char *temp){
|
||
if(!strcmp(p_node->type, "list")){
|
||
char *p_temp = (char *)malloc(sizeof(strlen(temp)+1));
|
||
strcpy_s(p_temp, sizeof(p_temp), temp);
|
||
addValueForComplex(p_node, "string", p_temp);
|
||
return 0;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
int addPointerForComplex(Node *p_node, void *temp){
|
||
if(!strcmp(p_node->type, "list")){
|
||
addValueForComplex(p_node, "pointer", temp);
|
||
return 0;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
List *m_findByInt(List* p_list, int temp){
|
||
int *p_temp = (int *)malloc(sizeof(int));
|
||
*p_temp = temp;
|
||
List *t_list = mply_findByValue(p_list, "int", (void *)p_temp);
|
||
free(p_temp);
|
||
return t_list;
|
||
}
|
||
|
||
List *m_findByDouble(List* p_list, double temp){
|
||
double *p_temp = (double *)malloc(sizeof(double));
|
||
*p_temp = temp;
|
||
List *t_list = mply_findByValue(p_list, "double", (void *)p_temp);
|
||
free(p_temp);
|
||
return t_list;
|
||
}
|
||
|
||
List *m_findByString(List* p_list, char *temp){
|
||
char *p_temp = (char *)malloc(sizeof(char)*(strlen(temp)+1));
|
||
strcpy_s(p_temp, sizeof(p_temp), temp);
|
||
List *t_list = mply_findByValue(p_list, "string", (void *)p_temp);
|
||
free(p_temp);
|
||
return t_list;
|
||
}
|
||
|
||
List *m_findByPointer(List* p_list, void *temp){
|
||
List *t_list = mply_findByValue(p_list, "double", (void *)temp);
|
||
return t_list;
|
||
}
|
||
|
||
unsigned long long getIndexByNode(List *p_list, Node *p_node) {
|
||
Node *t_node = p_list->head;
|
||
unsigned long long index = 0;
|
||
while (t_node != NULL) {
|
||
if (p_node->id == t_node->id) return index;
|
||
index++;
|
||
t_node = t_node->next;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
List *m_findByIntForNode(List* p_list, int temp) {
|
||
int *p_temp = (int *)malloc(sizeof(int));
|
||
*p_temp = temp;
|
||
return mply_findByValue(p_list, "int", (void *)p_temp);
|
||
}
|
||
|
||
List *m_findByDoubleForNode(List* p_list, double temp) {
|
||
double *p_temp = (double *)malloc(sizeof(double));
|
||
*p_temp = temp;
|
||
return mply_findByValue(p_list, "double", (void *)p_temp);
|
||
}
|
||
|
||
List *m_findByStringForNode(List* p_list, char *temp) {
|
||
char *p_temp = (char *)malloc(sizeof(char) * (strlen(temp)+1));
|
||
strcpy_s(p_temp, sizeof(p_temp), temp);
|
||
return mply_findByValue(p_list, "string", (void *)p_temp);
|
||
}
|
||
List *m_findByPointerForNode(List* p_list, void *temp) {
|
||
return mply_findByValue(p_list, "pointer", (void *)temp);
|
||
}
|
||
|
||
#endif
|