#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10 // 当前最大的容量
#define INCREASE_SIZE 2 // 每次增大的容量
typedef struct List
{
int * data;
int size;
int current_size;
}List;
/*列表初始*/
void initial(List * list)
{
list->current_size = 0;
list->size = MAX_SIZE;
list->data = malloc(MAX_SIZE * sizeof(int));
if(list->data == NULL)
{
printf("not more momery!");
exit(EXIT_FAILURE);
}
for(int i=0; i<MAX_SIZE; i++)
list->data[i] = 0;
}
/*打印当前的列表元素*/
void display(List * list)
{
printf("%s","当前的列表元素:");
for(int i=0; i<list->current_size; i++)
printf("%d ",list->data[i]);
printf("\n");
}
/* 在before_index之前插入数据,允许范围为:
* 第1到第current_size+1个的位置前,则0-current_size
* 注意是不能随便在列表的尾部后隔几个再插入的
*/
int insert(List *list, int before_index, int data)
{
if(before_index < 1 || before_index > list->current_size + 1) // 判断位置是否正确
{
printf("error position\n");
return -1;
}
if(list->current_size == list->size)// 列表已经满了
{
int * new_data = realloc(list->data,(list->size + INCREASE_SIZE) * sizeof(int));
list->size += INCREASE_SIZE;
list->data = new_data;
}
for(int i=list->current_size; i>=before_index; i--) // 将待插入位置的现元素及其后的元素后移
{
list->data[i] = list->data[i-1];
}
list->data[before_index-1] = data;
list->current_size += 1;
return 0;
}
/*删除第几个元素*/
int delete(List *list, int index)
{
if(index < 1 || index > list->current_size)
{
printf("%s","error position\n");
return -1;
}
for(int i=index; i<list->current_size;i++)
{
list->data[i-1] = list->data[i];
}
list->current_size --;
return 0;
}
int main()
{
List list;
initial(&list);
while(1)
{
int choice;
printf("make you choice:");
scanf("%d",&choice);
int data;
int index;
switch(choice)
{
case 1:
printf("输入在第几个为之前插入,有效范围为[1 到 当前元素个数(%d)+1]:",list.current_size);
scanf("%d",&index);
printf("插入的元素值为:");
scanf("%d",&data);
insert(&list,index,data);
display(&list);
break;
case 2:
printf("要删除的元素所在的位置为:");
scanf("%d",&index);
delete(&list,index);
display(&list);
break;
default:
break;
}
}
return 0;
}
代码练习 :)
列表的实现
最新推荐文章于 2022-11-15 17:34:55 发布