#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node {
void **Array;
int size;
int capacity;
}nodes;
typedef struct info {
int id;
int age;
char name[20];
}info_s;
nodes* Line_Array_Init(int capacity_in);
void Insert_Array(nodes* p_node, void *value);
void Insert_Pos_Array(nodes* p_node, int pos,void *value);
void Foreach_Line_Array(nodes *p_node, void(*my_printf)(void *));
void my_printf1(void * node_in);
void Remove_Pos_Array(nodes* p_node, int pos);
void Remove_value_Array(nodes* p_node, void *value, int(*my_compare)(void*, void*));
int my_compare1(void*, void*);
void Clear_Line_Array(nodes *p_node);
void Destroy_Line_Array(nodes *p_node);
int main() {
printf("---开始创建线性表---\n");
nodes* p_head = Line_Array_Init(10);
printf("---线性表创建完毕---\n");
info_s n1 = {1, 21, "花木兰"};
info_s n2 = {2, 21, "凯皇"};
info_s n3 = {3, 21, "百里守约"};
info_s n4 = {4, 19, "百里玄策"};
info_s n5 = {5, 22, "苏烈"};
info_s n6 = {6, 20, "李信"};
printf("---开始后插数据--\n");
Insert_Array(p_head, &n1);
Insert_Array(p_head, &n2);
Insert_Array(p_head, &n3);
Insert_Array(p_head, &n4);
Insert_Array(p_head, &n5);
printf("---后插数据完毕---\n");
Foreach_Line_Array(p_head, my_printf1);
printf("---开始在特定位置插入数据--\n");
Insert_Pos_Array(p_head, 1, &n6);
printf("---在特定位置插入数据完毕---\n");
Foreach_Line_Array(p_head, my_printf1);
printf("---开始在特定位置删除数据--\n");
Remove_Pos_Array(p_head, 0);
printf("---在特定位置删除数据完毕---\n");
Foreach_Line_Array(p_head, my_printf1);
printf("---开始在特定数值删除数据---\n");
int id_temp = 3;
Remove_value_Array(p_head, &id_temp, my_compare1);
printf("---在特定数值删除数据完毕---\n");
Foreach_Line_Array(p_head, my_printf1);
printf("---开始清空线性表---\n");
Clear_Line_Array(p_head);
printf("---清空线性表完毕---\n");
Foreach_Line_Array(p_head, my_printf1);
printf("---开始销毁线性表---\n");
Destroy_Line_Array(p_head);
p_head = NULL;
printf("---销毁线性表完毕---\n");
Foreach_Line_Array(p_head, my_printf1);
system("pause");
return 0;
system("pause");
return 0;
}
nodes* Line_Array_Init(int capacity_in) {
nodes *Line_Array = (nodes*)malloc(sizeof(nodes));
Line_Array -> Array = (void**)malloc(sizeof(void*) * capacity_in);
Line_Array -> size = 0;
Line_Array -> capacity = capacity_in;
return Line_Array;
}
void Insert_Array(nodes* p_node, void *value_in) {
if(p_node == NULL)
return;
if(p_node -> size >= p_node -> capacity) {
void **New_Array = (void **)malloc(sizeof(void*) * p_node -> capacity * 2);
memcpy(New_Array, p_node -> Array, p_node -> capacity);
free(p_node -> Array);
p_node -> Array = New_Array;
p_node -> capacity = p_node -> capacity * 2;
}
p_node -> Array[p_node -> size] = value_in;
p_node -> size ++;
}
void Insert_Pos_Array(nodes* p_node, int pos,void *value_in) {
if(p_node == NULL)
return;
if(p_node -> size >= p_node -> capacity) {
void **New_Array = (void **)malloc(sizeof(void*) * p_node -> capacity * 2);
memcpy(New_Array, p_node -> Array, p_node -> capacity);
free(p_node -> Array);
p_node -> Array = New_Array;
p_node -> capacity = p_node -> capacity * 2;
}
if(pos < 0 || pos >= p_node -> size)
p_node -> Array[p_node -> size] = value_in;
else {
for(int i = p_node -> size; i > pos; i--)
p_node -> Array[i] = p_node -> Array[i - 1];
p_node -> Array[pos] = value_in;
}
p_node -> size ++;
}
void Foreach_Line_Array(nodes *p_node, void(*my_printf)(void *)) {
if(p_node == NULL)
return;
for(int i = 0; i < p_node -> size; i++)
my_printf(p_node -> Array[i]);
}
void my_printf1(void * node_in) {
info_s* p1 = (info_s*) node_in;
printf("id : %d, 年龄 :%d, 姓名:%s\n", p1 ->id, p1 -> age, p1 -> name);
}
void Remove_Pos_Array(nodes* p_node, int pos) {
if(p_node == NULL)
return;
if(pos < 0 || pos >= p_node -> size)
return;
else {
for(int i = pos; i < p_node -> size - 1; i++)
p_node -> Array[i] = p_node -> Array[i + 1];
}
p_node -> size --;
}
void Remove_value_Array(nodes* p_node, void *value_in, int(*my_compare)(void*, void*)){
if(p_node == NULL)
return;
for(int i = 0; i < p_node -> size; i++) {
if(my_compare(value_in, p_node -> Array[i])) {
p_node -> Array[i] = NULL;
for(int ii = i; ii < p_node -> size - 1; ii++)
p_node -> Array[ii] = p_node -> Array[ii + 1];
break;
}
}
p_node -> size --;
}
int my_compare1(void* value_in, void* node_in) {
int *p1 = (int*)value_in;
info_s *p2 = (info_s*)node_in;
if(*p1 == p2 -> id)
return 1;
else
return 0;
}
void Clear_Line_Array(nodes *p_node) {
if(p_node == NULL)
return;
free(p_node -> Array);
p_node -> Array = NULL;
p_node -> size = 0;
}
void Destroy_Line_Array(nodes *p_node) {
if(p_node == NULL)
return;
Clear_Line_Array(p_node);
free(p_node);
p_node = NULL;
}
C语言创建线性表的基本操作_建立、插入、删除、清空、销毁(操作结构体)
最新推荐文章于 2024-07-12 10:45:29 发布