一、节点
1.节点结构体
typedef struct Node
{
int data;
struct Node* leftNode;
struct Node* rightNode;
} NODE, * LPNODE;
2.封装节点结构体函数生成节点
LPNODE createNode ( int data)
{
LPNODE newNode = ( LPNODE) malloc ( sizeof ( NODE) ) ;
if ( newNode == NULL )
return NULL ;
newNode-> data = data;
newNode-> leftNode = NULL ;
newNode-> rightNode = NULL ;
return newNode;
}
二、节点。
1.链表结构体
、、在封装的写法
typedef struct List
{
LPNODE headNode;
LPNODE tailNode;
int sizeList;
} LIST, * LPLIS
2.封装链表结构体生成链表
LPLIST createList ( )
{
LPLIST list = ( LPLIST) malloc ( sizeof ( LIST) ) ;
if ( list == NULL )
return NULL ;
list-> sizeList = 0 ;
list-> headNode = NULL ;
list-> tailNode = NULL ;
return list;
}
三、头插
void insertByHead ( LPLIST list, int data)
{
LPNODE newNode = createNode ( data) ;
if ( list-> sizeList == 0 )
{
list-> tailNode = newNode;
}
else
{
newNode-> rightNode = list-> headNode;
list-> headNode-> leftNode = newNode;
}
list-> headNode = newNode;
list-> sizeList++ ;
}
四、尾插
void insertByTail ( LPLIST list, int data)
{
LPNODE newNode = createNode ( data) ;
if ( list-> sizeList== 0 )
{
list-> headNode = newNode;
}
else
{
newNode-> leftNode = list-> tailNode;
list-> tailNode-> rightNode = newNode;
}
list-> tailNode = newNode;
list-> sizeList++ ;
}
五、指定位置插
void insertAssignPlace ( LPLIST list, int data, int assign)
{
LPNODE posFront = NULL ;
LPNODE posNode = list-> headNode;
while ( posNode!= NULL && posNode-> data!= assign)
{
posFront = posNode;
posNode = posFront-> rightNode;
}
if ( posNode == NULL )
{
printf ( "未找到指定位置成员,无法插入!\n" ) ;
return ;
}
else
{
if ( posFront == NULL )
{
insertByHead ( list, data) ;
}
else
{
LPNODE newNode = createNode ( data) ;
posFront-> rightNode = newNode;
newNode-> leftNode = posFront;
newNode-> rightNode = posNode;
posNode-> leftNode = newNode;
}
}
}
六、正向打印
void printPre ( LPLIST list)
{
LPNODE pMove = list-> headNode;
while ( pMove != NULL )
{
printf ( "%d\t" , pMove-> data) ;
pMove = pMove-> rightNode;
}
printf ( "\n" ) ;
}
七、逆向打印
void printReverse ( LPLIST list)
{
LPNODE pMove = list-> tailNode;
while ( pMove != NULL )
{
printf ( "%d\t" , pMove-> data) ;
pMove = pMove-> leftNode;
}
printf ( "\n" ) ;
}
八、主函数
int main ( void )
{
LPLIST list = createList ( ) ;
for ( int i = 0 ; i < 3 ; i++ )
{
insertByHead ( list, i) ;
}
printPre ( list) ;
printReverse ( list) ;
for ( int i = 3 ; i < 7 ; i++ )
{
insertByTail ( list, i) ;
}
printPre ( list) ;
printReverse ( list) ;
insertAssignPlace ( list, 0 , 2 ) ;
insertAssignPlace ( list, 8 , 6 ) ;
printPre ( list) ;
return 0 ;
}
九、插入的理解
1.双向链表头插
2.双向链表尾插
3.双向链表指定位置插