C/C++ -顺序表-模块化实现
前言
链表-贯穿数据结构的基础,顺序表是其中之一。当使用c/c++实现这些数据结构的时候,我们使用指针相关内容,良好的指针基础是学好数据结构的关键。*在大多数的教科书中在初始化表时直接固定好了表长,本篇文章介绍的方法是动态开辟内存,这样做的好处是节省了内存开销。*那么我们在进行顺序表的编码前,首先进行c的几个库函数的学习:
①malloc函数:申请一块连续的指定大小的的内存空间,默认值随机。 原型:void *malloc(unsigned int num_bytes);
②calloc函数:申请一块连续的指定大小的内存空间,并将所有值默认为0,等价于malloc,效率比malloc低。 原型:void *calloc(size_t n, size_t size);
③realloc函数:对已经申请的空间进行扩容。 原型:void realloc(void *ptr, size_t size);
这里只是对三种函数进行简单的介绍,在本篇文章中不会详细介绍,需要详细使用方法可以自行百度。
需求
初始化表 -> 将数据分别添加到 表a, 表b -> 合并 表a 和 表b ->输出结果;
顺序表原理
顺序表结构:
解释:定义结构体,包含顺序表指针 *elements,表中元素个数 count,表中空间长度 size(以一个数据类型为单位)。
struct list {
int *elements;
int count;
int size;
};
顺序表操作:
1.表初始化
struct list *list_init()
{
struct list *list = NULL;
list = (struct list *)malloc(sizeof(struct list));
if(list == NULL) {
return NULL;
}
list->elements = (int *)calloc(LIST_INIT_SIZE, sizeof(int));
if(list->elements == NULL) {
free(list);
return NULL;
}
list->count = 0;
list->size = 0;
return list;
}
2.释放表
void list_free(struct list *list)
{
free(list->elements);
free(list);
return;
}
3.清空表
void list_clear(struct list *list)
{
list->count = 0;
return;
}
4.判空
int list_isempty(struct list *list)
{
return list->count == 0;
}
5.获取表长度
int list_count(struct list *list)
{
return list->count;
}
6.获取元素
int list_get(struct list *list, int index)
{
return list->elements[index];
}
7.设置元素
void list_set(struct list *list, int index, int element)
{
list->elements[index] = element;
return;
}
8.删除元素
int list_remove(struct list *list, int index)
{
int rm_element = list->elements[index];
for(int i = index; i < list->count - 1; i++) {
list->elements[index] = list->elements[index + 1];
}
list->count--;
return rm_element;
}
9.添加元素
void list_add(struct list *list, int index, int element)
{
if(list->count == list->size) {
int *tmp = NULL;
tmp = (int *)realloc(list->elements, sizeof(int)*(list->size + LIST_INIT_SIZE));
if(tmp == NULL) {
exit(EXIT_FAILURE);
}
list->elements = tmp;
list->size += LIST_INIT_SIZE;
}
for(int i = list->count - 1; i >= index; i--) {
list->elements[i + 1] = list->elements[i];
}
list->elements[index] = element;
list->count++;
return;
}
自定义头文件 list.h
struct list;
struct list *list_init();
void list_free(struct list *list);
void list_clear(struct list *list);
int list_isempty(struct list *list);
int list_count(struct list *list);
int list_get(struct list *list, int index);
void list_set(struct list *list, int index, int element);
int list_remove(struct list *list, int index);
void list_add(struct list *list, int index, int element);
mian.c
int main()
{
struct list *list_a = NULL;
struct list *list_b = NULL;
int flag;
list_a = list_init();
list_add(list_a, 0, 3);
list_add(list_a, 0, 6);
list_add(list_a, 0, 9);
list_add(list_a, 0, 12);
list_add(list_a, 0, 43);
list_b = list_init();
list_add(list_b, 0, 7);
list_add(list_b, 0, 12);
list_add(list_b, 0, 1);
list_add(list_b, 0, 3);
list_add(list_b, 0, 8);
for(int i = 0; i < list_count(list_b); i++) {
flag = 0;
for(int j = 0; j < list_count(list_a); j++) {
if(list_get(list_a, j) == list_get(list_b, i)) {
flag = 1;
break;
}
}
if(flag == 0) {
list_add(list_a, list_count(list_a), list_get(list_b, i));
}
}
cout << "这是结果" << endl;
for(int i = 0; i < list_count(list_a); i++) {
cout << list_get(list_a, i) << " ";
}
cout << endl;
list_free(list_a);
list_free(list_b);
system("PAUSE");
return 0;
}
时隔一年之后复习数据结构…计算机长路漫漫…
|