动态数组
设计一个动态数据, 实现存储任意数据类型 并有遍历, 插入, 删除数据等功能
动态数组的设计
动态数组结构体
struct dynamicArray
{
void * * pAddr;
int m_Capacity;
int m_Size;
} ;
初始化数组
struct dynamicArray * init_dynamicArray ( int capacity)
{
if ( capacity <= 0 )
{
return NULL ;
}
struct dynamicArray * arr = malloc ( sizeof ( struct dynamicArray ) ) ;
if ( arr == NULL )
{
return NULL ;
}
arr-> pAddr = malloc ( sizeof ( void * ) * capacity) ;
arr-> m_Capacity = capacity;
arr-> m_Size = 0 ;
return arr;
}
插入数据
void insert_dynamicArray ( struct dynamicArray * arr, void * data, int pos)
{
if ( arr == NULL || data == NULL )
{
return ;
}
if ( pos < 0 || pos > arr-> m_Size)
{
pos = arr-> m_Size;
}
if ( arr-> m_Size == arr-> m_Capacity)
{
int newCapacity = arr-> m_Capacity * 2 ;
void * * newSpace = malloc ( sizeof ( void * ) * newCapacity) ;
memcpy ( newSpace, arr-> pAddr, sizeof ( void * ) * arr-> m_Capacity) ;
free ( arr-> pAddr) ;
arr-> pAddr = newSpace;
arr-> m_Capacity = newCapacity;
}
for ( int i = arr-> m_Size- 1 ; i >= pos; i-- )
{
arr-> pAddr[ i + 1 ] = arr-> pAddr[ i] ;
}
arr-> pAddr[ pos] = data;
arr-> m_Size++ ;
}
按照指定位置删除数组
void removeByPos_dynamicArray ( struct dynamicArray * arr, int pos)
{
if ( arr == NULL )
{
return ;
}
if ( pos < 0 || pos > arr-> m_Size - 1 )
{
return ;
}
for ( int i = pos; i < arr-> m_Size; i++ )
{
arr-> pAddr[ i] = arr-> pAddr[ i + 1 ] ;
}
arr-> m_Size-- ;
}
按值比较删除数据
void removeByValue_dynamicArray ( struct dynamicArray * arr, void * data, int ( * myCompare) ( void * , void * ) )
{
if ( arr == NULL || data == NULL )
{
return ;
}
for ( int i = 0 ; i < arr-> m_Size; i++ )
{
if ( myCompare ( arr-> pAddr[ i] , data) )
{
removeByPos_dynamicArray ( arr, i) ;
break ;
}
}
}
销毁数组
void destroy_dynamicArray ( struct dynamicArray * arr)
{
if ( arr == NULL )
{
return ;
}
if ( arr-> pAddr != NULL )
{
free ( arr-> pAddr) ;
arr-> pAddr = NULL ;
}
free ( arr) ;
arr = NULL ;
}
测试
测试结构体类型
struct Person
{
char name[ 64 ] ;
int age;
} ;
回调函数
void printPerson ( void * data)
{
struct Person * p = data;
printf ( "name: %s, age: %d\n" , p-> name, p-> age) ;
}
int comparePerson ( void * data1, void * data2)
{
struct Person * p1 = data1;
struct Person * p2 = data2;
if ( strcmp ( p1-> name, p2-> name) == 0 && p1-> age == p2-> age)
{
return 1 ;
}
return 0 ;
}
测试主程序
void test01 ( )
{
struct dynamicArray * arr = init_dynamicArray ( 5 ) ;
struct Person p1 = { "aaa" , 18 } ;
struct Person p2 = { "bbb" , 19 } ;
struct Person p3 = { "ccc" , 16 } ;
struct Person p4 = { "ddd" , 13 } ;
struct Person p5 = { "eee" , 14 } ;
struct Person p6 = { "fff" , 20 } ;
printf ( "插入前------数组的大小: %d\n" , arr-> m_Size) ;
printf ( "插入前------数组的容量: %d\n" , arr-> m_Capacity) ;
insert_dynamicArray ( arr, & p1, 0 ) ;
insert_dynamicArray ( arr, & p2, 6 ) ;
insert_dynamicArray ( arr, & p3, 2 ) ;
insert_dynamicArray ( arr, & p4, 1 ) ;
insert_dynamicArray ( arr, & p5, - 1 ) ;
insert_dynamicArray ( arr, & p6, 4 ) ;
foreach_dynamicArray ( arr, printPerson) ;
printf ( "插入后------数组的大小: %d\n" , arr-> m_Size) ;
printf ( "插入后------数组的容量: %d\n" , arr-> m_Capacity) ;
removeByPos_dynamicArray ( arr, 1 ) ;
printf ( "删除ddd后的结果:\n" ) ;
foreach_dynamicArray ( arr, printPerson) ;
printf ( "删除后------数组的大小: %d\n" , arr-> m_Size) ;
printf ( "删除后------数组的容量: %d\n" , arr-> m_Capacity) ;
struct Person p = { "ccc" , 16 } ;
removeByValue_dynamicArray ( arr, & p, comparePerson) ;
printf ( "删除ccc后的结果:\n" ) ;
foreach_dynamicArray ( arr, printPerson) ;
printf ( "删除后------数组的大小: %d\n" , arr-> m_Size) ;
printf ( "删除后------数组的容量: %d\n" , arr-> m_Capacity) ;
destroy_dynamicArray ( arr) ;
arr = NULL ;
}
单向链表-传统版
链表设计
节点结构体
struct LinkNode
{
void * data;
struct LinkNode * next;
} ;
链表结构体
struct LList
{
struct LinkNode pHeader;
int m_Size;
} ;
给到用户的是: void*
取别名 LinkList
typedef void * LinkList;
初始化链表
LinkList init_LinkList ( )
{
struct LList * mylist = malloc ( sizeof ( struct LList ) ) ;
if ( mylist == NULL )
{
return NULL ;
}
mylist-> pHeader. data = NULL ;
mylist-> pHeader. next = NULL ;
mylist-> m_Size = 0 ;
return mylist;
}
插入节点
void insert_LinkList ( LinkList list, int pos, void * data)
{
if ( list == NULL )
{
return ;
}
if ( data == NULL )
{
return ;
}
struct LList * mylist = list;
if ( pos < 0 || pos > mylist-> m_Size )
{
pos = mylist-> m_Size;
}
struct LinkNode * pCurrent = & mylist-> pHeader;
for ( int i = 0 ; i < pos; i++ )
{
pCurrent = pCurrent-> next;
}
struct LinkNode * newNode = malloc ( sizeof ( struct LinkNode ) ) ;
newNode-> data = data;
newNode-> next = NULL ;
newNode-> next = pCurrent-> next;
pCurrent-> next = newNode;
mylist-> m_Size++ ;
}
遍历链表
void foreach_LinkList ( LinkList list, void ( * myPrint) ( void * ) )
{
if ( list == NULL )
{
return ;
}
struct LList * mylist = list;
struct LinkNode * pCurrent = mylist-> pHeader. next;
for ( int i = 0 ; i < mylist-> m_Size; i++ )
{
myPrint ( pCurrent-> data) ;
pCurrent = pCurrent-> next;
}
}
按位置删除节点
void remove_LinkList ( LinkList list , int pos)
{
if ( list == NULL )
{
return ;
}
struct LList * mylist = list;
if ( pos < 0 || pos > mylist-> m_Size - 1 )
{
return ;
}
struct LinkNode * pCurrent = & mylist-> pHeader;
for ( int i = 0 ; i < pos; i++ )
{
pCurrent = pCurrent-> next;
}
struct LinkNode * pDel = pCurrent-> next;
pCurrent-> next = pDel-> next;
free ( pDel) ;
pDel = NULL ;
mylist-> m_Size-- ;
}
按值删除节点
void removeByValue_LinkList ( LinkList list, void * data, int ( * myCompare) ( void * , void * ) )
{
if ( list == NULL )
{
return ;
}
if ( data == NULL )
{
return ;
}
struct LList * mylist = list;
struct LinkNode * pCurrent = & mylist-> pHeader;
struct LinkNode * pDel = pCurrent-> next;
for ( int i = 0 ; i < mylist-> m_Size; i++ )
{
if ( myCompare ( data, pDel-> data) )
{
pCurrent-> next = pDel-> next;
free ( pDel) ;
pDel = NULL ;
mylist-> m_Size-- ;
break ;
}
pCurrent = pCurrent-> next;
pDel = pCurrent-> next;
}
}
返回链表长度
int size_LinkList ( LinkList list)
{
if ( list == NULL )
{
return ;
}
struct LList * mylist = list;
return mylist-> m_Size;
}
清空链表
void clear_LinkList ( LinkList list)
{
if ( list == NULL )
{
return ;
}
struct LList * mylist = list;
struct LinkNode * pCurrent = mylist-> pHeader. next;
struct LinkNode * pNext = NULL ;
for ( int i = 0 ; i < mylist-> m_Size; i++ )
{
pNext = pCurrent-> next;
free ( pCurrent) ;
pCurrent = pNext;
}
mylist-> pHeader. next = NULL ;
mylist-> m_Size = 0 ;
}
销毁链表
void destroy_LinkList ( LinkList list)
{
if ( list == NULL )
{
return ;
}
clear_LinkList ( list) ;
free ( list) ;
list = NULL ;
}
测试
测试结构体类型
struct Person
{
char name[ 64 ] ;
int age;
} ;
回调函数
void printPerson ( void * data)
{
struct Person * p = data;
printf ( "name: %s, age: %d\n" , p-> name, p-> age) ;
}
int comparePerson ( void * data1, void * data2)
{
struct Person * p1 = data1;
struct Person * p2 = data2;
if ( strcmp ( p1-> name, p2-> name) == 0 && p1-> age == p2-> age)
{
return 1 ;
}
return 0 ;
}
测试主程序
void test01 ( )
{
LinkList mylist = init_LinkList ( ) ;
struct Person p1 = { "aaa" , 18 } ;
struct Person p2 = { "bbb" , 19 } ;
struct Person p3 = { "ccc" , 16 } ;
struct Person p4 = { "ddd" , 13 } ;
struct Person p5 = { "eee" , 14 } ;
struct Person p6 = { "fff" , 20 } ;
insert_LinkList ( mylist, 0 , & p1) ;
insert_LinkList ( mylist, 5 , & p2) ;
insert_LinkList ( mylist, - 1 , & p3) ;
insert_LinkList ( mylist, 2 , & p4) ;
insert_LinkList ( mylist, 1 , & p5) ;
insert_LinkList ( mylist, - 1 , & p6) ;
foreach_LinkList ( mylist, printPerson) ;
printf ( "链表长度为: %d \n" , size_LinkList ( mylist) ) ;
printf ( "--------------\n" ) ;
remove_LinkList ( mylist, 1 ) ;
foreach_LinkList ( mylist, printPerson) ;
printf ( "链表长度为: %d \n" , size_LinkList ( mylist) ) ;
printf ( "--------------\n" ) ;
struct Person pp = { "bbb" , 19 } ;
struct Person p = { "aaa" , 18 } ;
removeByValue_LinkList ( mylist, & p, comparePerson) ;
removeByValue_LinkList ( mylist, & pp, comparePerson) ;
foreach_LinkList ( mylist, printPerson) ;
printf ( "链表长度为: %d \n" , size_LinkList ( mylist) ) ;
printf ( "--------------\n" ) ;
clear_LinkList ( mylist) ;
foreach_LinkList ( mylist, printPerson) ;
printf ( "链表长度为: %d \n" , size_LinkList ( mylist) ) ;
destroy_LinkList ( mylist) ;
}
单向链表-企业版
节点结构体只维护指针区 用户预留4个字节空间, 我们帮助连接数据
链表设计
节点结构体
struct LinkNode
{
struct LinkNode * next;
} ;
链表结构体
struct LList
{
struct LinkNode pHeader;
int m_Size;
} ;
给到用户的是: void*
取别名 LinkList
typedef void * LinkList;
初始化链表
LinkList init_LinkList ( )
{
struct LList * mylist = malloc ( sizeof ( struct LList ) ) ;
if ( mylist == NULL )
{
return NULL ;
}
mylist-> m_Size = 0 ;
mylist-> pHeader. next = NULL ;
return mylist;
}
插入节点
void insert_LinkList ( LinkList list , int pos, void * data)
{
if ( list == NULL )
{
return ;
}
if ( data == NULL )
{
return ;
}
struct LList * mylist = list;
if ( pos < 0 || pos > mylist-> m_Size- 1 )
{
pos = mylist-> m_Size;
}
struct LinkNode * myNode = data;
struct LinkNode * pCurrent = & mylist-> pHeader;
for ( int i = 0 ; i < pos; i++ )
{
pCurrent = pCurrent-> next;
}
myNode-> next = pCurrent-> next;
pCurrent-> next = myNode;
mylist-> m_Size++ ;
}
遍历链表
void foreach_LinkNode ( LinkList list, void ( * myPrint) ( void * ) )
{
if ( NULL == list)
{
return ;
}
struct LList * mylist = list;
struct LinkNode * pCurrent = mylist-> pHeader. next;
for ( int i = 0 ; i < mylist-> m_Size; i++ )
{
myPrint ( pCurrent) ;
pCurrent = pCurrent-> next;
}
}
按位置删除节点
void removeByPos_LinkList ( LinkList list, int pos)
{
if ( list == NULL )
{
return ;
}
struct LList * mylist = list;
if ( pos < 0 || pos > mylist-> m_Size - 1 )
{
return ;
}
struct LinkNode * pCurrent = & mylist-> pHeader;
for ( int i = 0 ; i < pos; i++ )
{
pCurrent = pCurrent-> next;
}
struct LinkNode * pDel = pCurrent-> next;
pCurrent-> next = pDel-> next;
mylist-> m_Size-- ;
}
按值删除节点
void removeByValue_LinkList ( LinkList list, void * data, int ( * myCompare) ( void * , void * ) )
{
if ( list == NULL )
{
return ;
}
if ( data == NULL )
{
return ;
}
struct LList * mylist = list;
struct LinkNode * pCurrent = & mylist-> pHeader;
struct LinkNode * pDel = pCurrent-> next;
for ( int i = 0 ; i < mylist-> m_Size; i++ )
{
if ( myCompare ( pDel, data) )
{
pCurrent = pDel-> next;
mylist-> m_Size-- ;
break ;
}
pCurrent = pDel;
pDel = pCurrent-> next;
}
}
清空链表
void clear_LinkList ( LinkList list)
{
if ( list == NULL )
{
return ;
}
struct LList * mylist = list;
struct LinkNode * pCurrent = mylist-> pHeader. next;
struct LinkNode * pNext = pCurrent-> next;
for ( int i = 0 ; i < mylist-> m_Size; i++ )
{
pCurrent = NULL ;
pCurrent = pNext;
pNext = pNext-> next;
}
mylist-> pHeader. next = NULL ;
}
销毁链表
void destroy_LinkList ( LinkList list)
{
if ( list == NULL )
{
return ;
}
free ( list) ;
list = NULL ;
}
测试
测试结构体类型
struct Person
{
int * a;
char name[ 64 ] ;
int age;
} ;
回调函数
void printPerson ( void * data)
{
struct Person * p = data;
printf ( "name: %s, age: %d\n" , p-> name, p-> age) ;
}
int comparePerson ( void * data1, void * data2)
{
struct Person * p1 = data1;
struct Person * p2 = data2;
if ( strcmp ( p1-> name, p2-> name) == 0 && p1-> age == p2-> age)
{
return 1 ;
}
return 0 ;
}
测试主程序
void test01 ( )
{
LinkList* mylist = init_LinkList ( ) ;
struct Person p1 = { NULL , "aaa" , 18 } ;
struct Person p2 = { NULL , "bbb" , 19 } ;
struct Person p3 = { NULL , "ccc" , 16 } ;
struct Person p4 = { NULL , "ddd" , 13 } ;
struct Person p5 = { NULL , "eee" , 14 } ;
struct Person p6 = { NULL , "fff" , 20 } ;
insert_LinkList ( mylist, 0 , & p1) ;
insert_LinkList ( mylist, - 1 , & p2) ;
insert_LinkList ( mylist, 3 , & p3) ;
insert_LinkList ( mylist, 1 , & p4) ;
insert_LinkList ( mylist, 3 , & p5) ;
insert_LinkList ( mylist, 2 , & p6) ;
foreach_LinkNode ( mylist, printPerson) ;
printf ( "------------------\n" ) ;
removeByPos_LinkList ( mylist, 1 ) ;
foreach_LinkNode ( mylist, printPerson) ;
printf ( "------------------\n" ) ;
struct Person p = { NULL , "ccc" , 16 } ;
removeByValue_LinkList ( mylist, & p, comparePerson) ;
foreach_LinkNode ( mylist, printPerson) ;
printf ( "------------------\n" ) ;
clear_LinkList ( mylist) ;
destroy_LinkList ( mylist) ;
mylist = NULL ;
}