# include <iostream>
# define MAX_SIZE 20
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data;
struct Node * next;
} ;
typedef struct Node * linkList;
Status InitList ( linkList* L)
{
( * L) = ( linkList) malloc ( sizeof ( Node) ) ;
if ( ( * L) == NULL )
return ERROR;
( * L) -> next = NULL ;
return OK;
}
Status ClearList ( linkList* L)
{
linkList p, q;
p = ( * L) -> next;
while ( p != NULL )
{
q = p-> next;
free ( p) ;
p = q;
}
( * L) -> next = NULL ;
return OK;
}
Status isListEmpty ( linkList L)
{
if ( L-> next != NULL )
return FALSE;
return TRUE;
}
int ListLength ( linkList L)
{
int i = 0 ;
linkList p = L-> next;
while ( p)
{
i++ ;
p = p-> next;
}
return i;
}
Status GetElem ( linkList L, int i, ElemType * e)
{
linkList p = L-> next;
int j = 1 ;
while ( ( p != NULL ) && ( j < i) )
{
j++ ;
p = p-> next;
}
if ( p == NULL || j > i)
{
return ERROR;
}
* e = p-> data;
return OK;
}
int LocateElem ( linkList L, ElemType e)
{
int i = 1 ;
linkList p = L-> next;
while ( p)
{
if ( p-> data == e)
return i;
i++ ;
p = p-> next;
}
return ERROR;
}
Status ListInsert ( linkList* L, int i, ElemType e)
{
linkList p, q;
p = * L;
int j = 1 ;
while ( ( p != NULL ) && j < i)
{
j++ ;
p = p-> next;
}
if ( ! p || j > i) return ERROR;
q = ( linkList) malloc ( sizeof ( Node) ) ;
if ( q == NULL ) return ERROR;
q-> data = e;
q-> next = p-> next;
p-> next = q;
return OK;
}
Status ListDelete ( linkList* L, int i)
{
int j = 1 ;
linkList p = * L, q;
while ( p && j < i)
{
j++ ;
p = p-> next;
}
if ( ! p || j > i) return ERROR;
if ( p-> next == NULL ) return ERROR;
q = p-> next;
p-> next = p-> next-> next;
free ( q) ;
return OK;
}
Status ListTraverse ( linkList L)
{
linkList p = L-> next;
while ( p)
{
printf ( "%d-->" , p-> data) ;
p = p-> next;
}
printf ( "\n" ) ;
return OK;
}
Status CreatListHead ( linkList* L, int n)
{
srand ( ( unsigned ) time ( NULL ) ) ;
linkList p;
* L = ( linkList) malloc ( sizeof ( Node) ) ;
if ( ( * L) == NULL ) return ERROR;
( * L) -> next = NULL ;
while ( n-- )
{
p = ( linkList) malloc ( sizeof ( Node) ) ;
if ( ( p) == NULL ) return ERROR;
p-> data = rand ( ) % 100 + 1 ;
p-> next = ( * L) -> next;
( * L) -> next = p;
}
return OK;
}
Status CreatListTail ( linkList* L, int n)
{
srand ( ( unsigned ) time ( NULL ) ) ;
linkList p, q;
* L = ( linkList) malloc ( sizeof ( Node) ) ;
if ( ( * L) == NULL ) return ERROR;
q = * L;
while ( n-- )
{
p = ( linkList) malloc ( sizeof ( Node) ) ;
if ( ( p) == NULL ) return ERROR;
p-> data = rand ( ) % 100 + 1 ;
q-> next = p;
q = p;
}
q-> next = NULL ;
return OK;
}
int main ( )
{
linkList L;
ElemType e = 0 ;
Status res;
int i, j;
res = InitList ( & L) ;
printf ( "初始化后的长度:%d\n" , ListLength ( L) ) ;
for ( i = 0 ; i < 5 ; i++ )
{
res = ListInsert ( & L, 1 , i) ;
if ( ! res) printf ( "插入元素失败!\n" ) ;
}
printf ( "插入5个元素后:\n" ) ;
ListTraverse ( L) ;
printf ( "插入5个元素后是否为空:%d(1:是 0:否)\n" , res) ;
printf ( "插入5个元素后的长度:%d\n" , ListLength ( L) ) ;
res = isListEmpty ( L) ;
printf ( "是否为空:%d(1:是 0:否)\n" , res) ;
res = ClearList ( & L) ;
printf ( "清空后后的长度:%d\n" , ListLength ( L) ) ;
printf ( "清空后是否为空:%d(1:是 0:否)\n" , res) ;
for ( i = 0 ; i < 10 ; i++ )
{
res = ListInsert ( & L, 1 , i) ;
if ( ! res) printf ( "插入元素失败!\n" ) ;
}
printf ( "插入10个元素后:\n" ) ;
ListTraverse ( L) ;
printf ( "插入10个元素后的长度:%d\n" , ListLength ( L) ) ;
GetElem ( L, 5 , & e) ;
printf ( "第5个元素为:%d\n" , e) ;
j = ListLength ( L) ;
res = ListDelete ( & L, j + 1 ) ;
if ( res == ERROR)
printf ( "删除第%d元素失败!\n" , j + 1 ) ;
else
printf ( "删除第%d元素成功!\n" , j) ;
res = ListDelete ( & L, j) ;
if ( res == ERROR)
printf ( "删除第%d元素失败!\n" , j) ;
else
printf ( "删除第%d元素成功!\n" , j) ;
printf ( "删除后:\n" ) ;
ListTraverse ( L) ;
if ( ListDelete ( & L, 5 ) )
{
printf ( "删除第五个元素成功!\n" ) ;
}
ListTraverse ( L) ;
ClearList ( & L) ;
CreatListHead ( & L, 20 ) ;
printf ( "头部创建:\n" ) ;
ListTraverse ( L) ;
ClearList ( & L) ;
printf ( "尾部创建:\n" ) ;
CreatListTail ( & L, 20 ) ;
ListTraverse ( L) ;
ClearList ( & L) ;
free ( L) ;
return 0 ;
}