List.h
#include <stdbool.h>
typedef struct list{
int length;
int * data;
} List;
//初始化动态数组
void InitList(List * list);
//销毁动态数组
void DestroyList(List * list);
//查看列表是否为空
bool ListIsEmpty(const List * list);
//获取动态数组长度
int ListLength(const List * list);
//插入元素
bool insert(List * list,int data);
//获取元素
int * GetElem(const List * list,int i);
//删除元素
bool removeByIndex(List * list,int i);
/**
* 下标是否在动态数组范围内
* @param plist
* @param index
* @return
*/
bool indexInBounds(const List * plist,int index);
/**
* 修改元素
* @param list 修改的列表
* @param pos 位置
* @param data 数据
* @return
*/
bool update(List * list,int pos,int data);
/**
* 为每个元素应用函数
* @param list
* @param pfun
*/
void ListTraverse(List * list,void(*pfun)(int));
List.c
#include "List.h"
#include <stdio.h>
#include <stdlib.h>
/**
* 初始化动态数组
* @param list
*/
void InitList(List * list)
{
list->length = 0;
list->data = NULL;
}
/**
* 销毁动态数组
* @param list
*/
void DestroyList(List * list)
{
list->length = 0;
free(list->data);
}
/**
* 判断动态数组是否为空
* @param list
* @return
*/
bool ListIsEmpty(const List * list)
{
return list->data == NULL;
}
/**
* 获取列表长度
* @param list
* @return
*/
int ListLength(const List * list)
{
if(list->data == NULL || list->length == 0)
return 0;
else
return list->length;
}
//插入元素
bool insert(List * list,int data)
{
int * array = (int *)malloc(sizeof(int)*(list->length+1));
if(array)//如果分配成功!
{
int i;
if(list->data)
{
for(i=0;i<list->length;i++)//拷贝数组
array[i] = list->data[i];
array[i] = data;
}else{
array[0] = data;
}
free(list->data);//释放原始动态数组内存
list->data = array;
list->length++;
return true;
}
return false;
}
/**
* 获取动态数组元素从0开始
* @param list
* @param i
* @return
*/
int * GetElem(const List * list,int i)
{
if(indexInBounds(list,i))
{
int * array = list->data;
return &array[i];
}
return NULL;
}
/**
* 删除元素
* @param list
* @param i
* @return 返回true删除成功,返回false元素不存在或者动态数组为空!
*/
bool removeByIndex(List * list,int i)
{
if(indexInBounds(list,i))
{
int * array = (int *)malloc(sizeof(int) * (list->length-1));
if(array)
{
int j;
for(j=0;j<list->length;j++)
{
if(j<i)
array[j] = list->data[j];
else
array[j] = list->data[j+1];
}
list->length--;
free(list->data);
list->data = array;
}
}
return false;
}
/**
* 修改元素
* @param list 修改的列表
* @param pos 位置
* @param data 数据
* @return
*/
bool update(List * list,int pos,int data)
{
if(indexInBounds(list,pos))
{
list->data[pos] = data;
return true;
}
return false;
}
void ListTraverse(List * list,void(*pfun)(int))
{
if(list->data && list->length>0)
{
for(int i=0;i<list->length;i++)
{
(*pfun)(list->data[i]);
}
}
}
/**
* 下标是否在动态数组范围内
* @param plist
* @param index
* @return
*/
bool indexInBounds(const List * plist,int index)
{
if(plist->data && plist->length>0 && index >= 0 && index<plist->length)
return true;
else
return false;
}
main.c
#include <stdio.h>
#include <memory.h>
#include "List.h"
#define TEXT_MAX 10
void list_print_info();
void list_test();
char * s_gets(char * st,int n);
void createList(List *pList);
void destroyList(List *pList);
void addElementToList(List *pList);
void viewAllElement(List *pList);
void printElement(int data);
void removeElement(List *pList);
void updateElement(List *pList);
void viewIndexElement(List *pList);
void list_choose();
void eatline();
int main() {
// char st;
// s_gets(st,1);
list_test();
return 0;
}
/**
* 动态数组测试输出
*/
void list_test()
{
list_print_info();
list_choose();
}
void list_print_info()
{
printf("List动态数组测试-------------------------\n");
printf("1.初始化动态数组.\n");
printf("2.添加元素.\n");
printf("3.删除元素.\n");
printf("4.修改元素.\n");
printf("5.查看指定元素.\n");
printf("v.查看所有元素.\n");
printf("d.重新输出选项");
printf("0.销毁动态数组");
printf("q.退出.\n");
printf("请输入选项-------------------------\n");
}
void list_choose()
{
char ar;
List list;
do{
//s_gets(&ar,1);//获取用户选项输入
ar=getchar();
eatline();
switch(ar)
{
case '0'://销毁动态数组
destroyList(&list);
printf("已经销毁!\n");
break;
case '1'://初始化动态数组
createList(&list);
printf("初始化完毕!\n");
break;
case '2'://添加元素
addElementToList(&list);
break;
case '3'://删除元素
removeElement(&list);
break;
case '4'://修改元素
updateElement(&list);
break;
case '5'://查看指定元素
viewIndexElement(&list);
break;
case 'v'://查看所有元素
viewAllElement(&list);
break;
case 'd'://重新输出选项
list_print_info();
break;
case 'q'://退出
printf("Bye!\n");
ar = 'q';
break;
default:
break;
}
printf("->");
}while(ar != '\0' && ar != 'q');
}
void viewIndexElement(List *pList) {
printf("请输入要查看元素的下标:");
printf("->");
int index = -1;
if(scanf("%d",&index) == 1)
{
if(indexInBounds(pList,index))
{
printf("List[%d]->%d",index,pList->data[index]);
}
eatline();
}
}
void updateElement(List *pList) {
printf("请输入要修改元素的下标:\n");
printf("->");
int index = -1;
int value;
if(scanf("%d",&index) == 1)
{
eatline();
while(getchar() != '\n')
continue;
if(indexInBounds(pList,index))
{
printf("元素当前值为:%d,要修改为:",pList->data[index]);
printf("->");
if(scanf("%d",&value) == 1)
{
update(pList,index,value);
viewAllElement(pList);
eatline();
}
}
}
}
void removeElement(List *pList) {
printf("请输入要删除的元素下标:\n");
printf("->");
int index = -1;
scanf("%d",&index);
while(getchar() != '\n')
continue;
removeByIndex(pList,index);
}
void addElementToList(List *pList) {
printf("请输入要添加的元素,EOF表示结束\n");
printf("->");
int d;
while(scanf("%d",&d)==1)
{
insert(pList,d);
}
viewAllElement(pList);
}
/**
* 打印所有元素
* @param pList
*/
void viewAllElement(List *pList) {
ListTraverse(pList,printElement);
printf("\n");
}
void printElement(int data)
{
printf("%d ",data);
}
void destroyList(List *pList) {
DestroyList(pList);
}
void createList(List *pList) {
InitList(pList);
}
char * s_gets(char * st,int n)
{
char * ret_val;
char * find;
ret_val = fgets(st,n,stdin);
if(!ret_val)
{
find = strchr(ret_val,'\n');
if(!find)
*find = '\0';
else
while(getchar() != '\n')
continue;
}
return ret_val;
}
void eatline()
{
while(getchar()!='\n')
continue;
}
运行截图: