#ifndef LIST_H_H #define LIST_INIT_SIZE 100 #define OK 0 #define ERROR -1 typedef int type; typedef struct Node { type *elem; int list_length; int list_size; }SqList; // create list by array int compare(SqList *list, type e) { //找不到元素或者错误返回ERROR if(list->elem == NULL) return ERROR; for(int i = 0 ; i < list->list_length ; i++) { if(list->elem[i] == e) return i; } return ERROR; } // 构造空的线性表 int init_list(SqList *list) { if(!(list->elem = (type*)malloc(sizeof(type) * LIST_INIT_SIZE))) return ERROR; list->list_length = 0; list->list_size = LIST_INIT_SIZE; return OK; } //销毁线性表 int destroy_list(SqList *list) { if(list->elem == NULL) return ERROR; free(list); return OK; } //将线性表置为空表 int clear_list(SqList *list) { if(list->elem == NULL) return ERROR; list->list_length = 0; return OK; } //判断表是否为空 int list_empty(SqList *list) { if(list->elem == NULL) return ERROR; if(0 == list->list_length) return true; else return false; } //返回线性表元素个数 int list_length(SqList *list) { if(list->elem == NULL) return ERROR; return list->list_length; } //用e返回表中第i个元素的值 int get_elem(SqList *list, int i, type *e) { if(list->elem == NULL) return ERROR; if(i < 0 || i >= list->list_length) return ERROR; *e = list->elem[i]; return OK; } //返回e元素的位置 int locate_elem(SqList *list, type e, int (*compare)(SqList*, type)) { if(list->elem == NULL) return ERROR; return compare(list,e); } //返回前驱 int prior_elem(SqList *list, type cur_e, type* pre_e) { if(list->elem == NULL) return ERROR; int pos = compare(list,cur_e); if(pos <= 0 || pos >= list->list_length) return ERROR; *pre_e = list->elem[pos - 1]; return OK; } //返回后续 int next_elem(SqList *list, type cur_e, type* next_e) { if(list->elem == NULL) return ERROR; int pos = compare(list,cur_e); if(pos < 0 || pos >= list->list_length - 1) return ERROR; *next_e = list->elem[pos + 1]; return OK; } //插入元素 int list_insert(SqList *list, int i, type e) { if(list->elem == NULL) return ERROR; if(i < 0 || i > list->list_length || list->list_length > LIST_INIT_SIZE) return ERROR; int d = list->list_length - i; int tmp = list->list_length; if(0 == d && tmp != 0) { list->elem[i] = e; } else { while(d > 0) { list->elem[tmp] = list->elem[tmp - 1]; tmp--; d--; } list->elem[i] = e; } list->list_length++; return OK; } //删除元素 int list_delete(SqList *list, int i, type *e) { if(list->elem == NULL) return ERROR; if(i < 0 || i >= list->list_length) return ERROR; *e = list->elem[i]; while(i < list->list_length - 1) { list->elem[i] = list->elem[i + 1]; i++; } list->list_length--; return OK; } //打印元素值 int list_print(SqList *list) { if(list->elem == NULL) return ERROR; for(int i = 0 ; i < list->list_length ; i++) { printf("%d ",list->elem[i]); } printf("/n"); return OK; } //test function void list_test(SqList *list) { for(int i = 0 ; i < 21 ; i++) list_insert(list,i,i); } void list_test1(SqList *list) { for(int i = 10 ; i < 31 ; i++) list_insert(list,i - 10,i); } int equal(SqList *list, type e) { if(list->elem == NULL) return ERROR; for(int i = 0 ; i < list->list_length ; i++) { if(e == list->elem[i]) return true; } return false; } //A并B int list_union(SqList *list1, SqList *list2) { if(list1->elem == NULL || list2->elem == NULL) return ERROR; int e; int list1_len = list1->list_length; int list2_len = list2->list_length; for(int i = 0 ; i < list2_len ; i++) { get_elem(list2,i,&e); if(!locate_elem(list1,e,equal)) { list_insert(list1,list1_len++,e); } } return OK; } //线性表合并 int list_merge(SqList *list1, SqList *list2,SqList *list3) { if(list1->elem == NULL || list2->elem == NULL || list3->elem == NULL) return ERROR; int list1_len = list1->list_length; int list2_len = list2->list_length; int i,j,k; int e,v; i = j = k = 0; while(i < list1_len && j < list2_len) { get_elem(list1,i,&e); get_elem(list2,j,&v); if(e <= v) { list_insert(list3,k++,e); i++; } else { list_insert(list3,k++,v); j++; } } while(i < list1_len) { get_elem(list1,i++,&e); list_insert(list3,k++,e); } while(j < list2_len) { get_elem(list2,j++,&v); list_insert(list3,k++,v); } return OK; } #endif